Listening for call events in Android

Detecting outgoing calls

To be notified when an outgoing call is performed (for instance to get the callee phone number), you need to listen to the android.intent.action.NEW_OUTGOING_CALL Intent that will be broadcasted when an outgoing call is initiated. The received intent will have an extra string variable named Intent.EXTRA_PHONE_NUMBER which contains the outgoing number.This is how to proceed:
First, you need for to add following permission to your manifest file:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
Stay at the manifest file and add the following BroadcastReceiver before </application> tag
<receiver android:name="your.package.OutgoingCallReceiver">
    <intent-filter>
       <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
    </intent-filter>
</receiver>

Go to your OutgoingCallReceiver class and edit its onReceive method as follow:
@Override
public void onReceive(Context context, Intent intent) {
  Bundle bundle = intent.getExtras();        
  if(null == bundle)
       return;
  String phonenumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
  Log.i(TAG, phonenumber);
  Log.i(TAG, bundle.toString());        
  String msg = "Detected Outgoing Calls to number: " + phonenumber;        
  Toast.makeText(context, msg, Toast.LENGTH_LONG).show();  
}

Detecting incoming calls

To be notified when an incoming call is received, you need to register a BroadcastReceiver for Intent with action android.intent.action.PHONE_STATE that will be broadcasted when changes occur in the phone state. The received intent will have an extra string variable TelephonyManager.EXTRA_STATE which describes the phone state. If current state is TelephonyManager.EXTRA_STATE_RINGING then another extra string variable TelephonyManager.EXTRA_INCOMING_NUMBER will contain the incoming phone number. 
Note if state is not TelephonyManager.EXTRA_STATE_RINGING then no phone number can be retrived. Follow these steps: first add a permission to the manifest file:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
Then add a BroadcastReceived declaration before tag:
<receiver android:name="your.package.IncomingCallReceiver"> 
  <intent-filter> 
    <action android:name="android.intent.action.PHONE_STATE"/>
  </intent-filter> 
</receiver>
Then go to IncomingCallReceiver class and edite onReceive method as follow:
@Override
public void onReceive(Context context, Intent intent) {
  Bundle bundle = intent.getExtras();     
  if(null == bundle)
     return;      
  Log.i(TAG, bundle.toString());
  String state = bundle.getString(TelephonyManager.EXTRA_STATE);
  Log.i(TAG, "State: "+ state);        
  if(state.equalsIgnoreCase(TelephonyManager.EXTRA_STATE_RINGING)) {
     String phonenumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
     Log.i(TAG, "Incomng Number: " + phonenumber);
     String msg = "Detected Incoming Calls number: " + phonenumber;
     Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
  }  
} 

Here is a good article explaining how to use SyntaxHighlighter to well format source code (e.g. Java) posted on this blog.

Aucun commentaire:

Enregistrer un commentaire