0

the receiver is defined in manifest.xml :

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

and receiver is very simple :

    public class PhoneStateBroadcastReceiver extends BroadcastReceiver{
          ...
           public void onReceive(){
                 Log.d("receiver","called");
           }
    }

I replace the intent-filter to a custom filter defined by myself , and send a broadcast using "sendbroadcast()" ,it works well, but can't receiver the phone state broadcast , where is the problem? thanks

ps:

  <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

this is my permission ,and test is on two emulator android 6.0 .

belle tian
  • 897
  • 8
  • 20

1 Answers1

0

Here is an example how to do that:

public class PhoneStatReceiver extends BroadcastReceiver{        

        private static final String TAG = "PhoneStatReceiver"; 

        private static boolean incomingFlag = false;

        private static String incoming_number = null;

        @Override
        public void onReceive(Context context, Intent intent) {
           if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){                        

           incomingFlag = false;

           String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);        

            Log.i(TAG, "call OUT:"+phoneNumber);                        

           }
           else{                        
              TelephonyManager tm =(TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);                                                  

              switch (tm.getCallState()) {

                        case TelephonyManager.CALL_STATE_RINGING:

                               incomingFlag = true;

                                incoming_number = intent.getStringExtra("incoming_number");

                                Log.i(TAG, "RINGING :"+ incoming_number);

                                break;

                        case TelephonyManager.CALL_STATE_OFFHOOK:                                

                                if(incomingFlag){

                                        Log.i(TAG, "incoming ACCEPT :"+ incoming_number);

                                }

                                break;
                        case TelephonyManager.CALL_STATE_IDLE:                                

                                if(incomingFlag){

                                        Log.i(TAG, "incoming IDLE");                                

                                }

                                break;

                        } 

                }

        }

}

Register it in your AndroidManifest.xml.

<receiver android:name=".filter.PhoneStatReceiver">  

            <intent-filter>

                 <action android:name="android.intent.action.PHONE_STATE"/>           

                 <action android:name="android.intent.action.NEW_OUTGOING_CALL" />

            </intent-filter>

</receiver>

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
Archit Goel
  • 694
  • 5
  • 19
  • 1
    i use your code but ,still can't get the onReceiver() to be called , it seems the system not send phone state change broadcast ,i guess @Archit Goel – belle tian Nov 23 '15 at 07:39