Log call information whenever there is a phone call.

Posted by linuxdoniv on Stack Overflow See other posts from Stack Overflow or by linuxdoniv
Published on 2010-05-27T18:55:08Z Indexed on 2010/05/28 12:01 UTC
Read the original article Hit count: 345

Filed under:
|
|
|
|

Hi,

I have written the android application and I want the application to send the call information whenever there is an incoming call and it ends. This way I would be sending all calls to the server irrespective of size of the call log.

Here is the code

public class PhoneInfo extends BroadcastReceiver {

private int incoming_call = 0;
private Cursor c;
Context context;

public void onReceive(Context con, Intent intent) {

     c = con.getContentResolver().query(
                android.provider.CallLog.Calls.CONTENT_URI,
                null,
                null,
                null,
                android.provider.CallLog.Calls.DATE+ " DESC");
     context = con;

    IncomingCallListener phoneListener=new IncomingCallListener();
    TelephonyManager telephony = (TelephonyManager) con.getSystemService(Context.TELEPHONY_SERVICE); 
    telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);

}


public class IncomingCallListener extends PhoneStateListener {

    public void onCallStateChanged(int state,String incomingNumber){

        switch(state){
        case TelephonyManager.CALL_STATE_IDLE:

            if(incoming_call == 1){
                CollectSendCallInfo();
                incoming_call = 0;
            }
            break;

        case TelephonyManager.CALL_STATE_OFFHOOK:

            break;

        case TelephonyManager.CALL_STATE_RINGING:

            incoming_call = 1;
            break;

        }
    } 
}


private void CollectSendCallInfo() {



    int numberColumn = c.getColumnIndex(
            android.provider.CallLog.Calls.NUMBER);
    int dateColumn = c.getColumnIndex(
            android.provider.CallLog.Calls.DATE);

    int typeColumn = c.getColumnIndex(
            android.provider.CallLog.Calls.TYPE);
    int durationColumn=c.getColumnIndex(
            android.provider.CallLog.Calls.DURATION);

    ArrayList<String> callList = new ArrayList<String>();

    try{
        boolean moveToFirst=c.moveToFirst();
    }

    catch(Exception e)
    {
        ; // could not move to the first row.
        return;
    }
    int row_count = c.getCount();
    int loop_index = 0;
    int is_latest_call_read = 0;
    String callerPhonenumber = c.getString(numberColumn);
    int callDate = c.getInt(dateColumn);
    int callType = c.getInt(typeColumn);
    int duration=c.getInt(durationColumn);



    while((loop_index <row_count) && (is_latest_call_read != 1)){



        switch(callType){
        case android.provider.CallLog.Calls.INCOMING_TYPE:
            is_latest_call_read = 1;
            break;
        case android.provider.CallLog.Calls.MISSED_TYPE:
            break;
        case android.provider.CallLog.Calls.OUTGOING_TYPE:
            break;

        }
        loop_index++;
        c.moveToNext();
    }
    SendCallInfo(callerPhonenumber,
            Integer.toString(duration),
            Integer.toString(callDate));
}


private void SendCallInfo(String callerPhonenumber,
        String callDuration,
        String callDate) {


    JSONObject j = new JSONObject();

    try {
        j.put("Caller",      callerPhonenumber);
        j.put("Duration",    callDuration);
        j.put("CallDate",    callDate);

    } catch (JSONException e) {
        Toast.makeText(context, "Json object failure!",
                Toast.LENGTH_LONG).show();
    }



    String url = "http://xxxxxx.xxx.xx/xxxx/xxx.php";
    Map<String, String> kvPairs = new HashMap<String, String>();
    kvPairs.put("phonecall", j.toString());
    HttpResponse re;
    try {
        re = doPost(url, kvPairs);
        String temp;
        try {
            temp = EntityUtils.toString(re.getEntity());
            if (temp.compareTo("SUCCESS") == 0) {
                ;
            }

            else
                ;

        } catch (ParseException e1) {

            Toast.makeText(context,
                    "Parse Exception in response!", Toast.LENGTH_LONG)
                    .show();
            e1.printStackTrace();
        } catch (IOException e1) {

            Toast.makeText(context, "Io exception in response!",
                    Toast.LENGTH_LONG).show();
            e1.printStackTrace();
        }

    } catch (ClientProtocolException e1) {

        Toast.makeText(context, "Client Protocol Exception!",
                Toast.LENGTH_LONG).show();
        e1.printStackTrace();
    } catch (IOException e1) {

        Toast.makeText(context, "Client Protocol Io exception!",
                Toast.LENGTH_LONG).show();
        e1.printStackTrace();
    }
}

and here is the manifest file

        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
        <uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"></uses-permission>
        <uses-permission android:name="android.permission.SET_DEBUG_APP"></uses-permission>
        <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
        <uses-permission android:name="android.permission.READ_SMS"></uses-permission>


<application android:icon="@drawable/icon" android:label="@string/app_name">


    <activity android:name=".Friend"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>



    <activity android:name=".LoginInfo"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.DEFAULT" />

        </intent-filter>
    </activity>


    <service android:exported="true" android:enabled="true" android:name=".GeoUpdateService" >
    </service>

    <receiver android:name=".SmsInfo" >
        <intent-filter> 
            <action android:name=
                "android.provider.Telephony.SMS_RECEIVED" /> 
        </intent-filter> 
    </receiver>

    <receiver android:name=".PhoneInfo" >
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE"></action>
        </intent-filter>

    </receiver>


</application>

The application just crashes when there is an incoming call.. i have been able to log the information about incoming SMS, but this call info logging is failing.

Thanks for any help.

© Stack Overflow or respective owner

Related posts about android

Related posts about server