Broadcast receiver for Phone State changed not working

前端 未结 3 1760
猫巷女王i
猫巷女王i 2020-12-20 02:44

i have created a broadcast receiver for Phone state change. but the broadcast is not working. i have been trying from couple of hours and tried 2,3 solutions but still its n

相关标签:
3条回答
  • 2020-12-20 03:25
    1. First, define permission in the manifest

      <uses-permission android:name="android.permission.RECEIVE_SMS" />
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
      
    2. inside the application tag register the receiver

      <receiver android:name=".PhoneCallReceiver" >
           <intent-filter>
               <action android:name="android.intent.action.PHONE_STATE"/>
           </intent-filter>
           <intent-filter>
               <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
           </intent-filter>
       </receiver>
      
    3. Ask the permission the startup Activity/Runtime Permission Usually in the MainActivity

      @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
      
             checkAndRequestPermissions();
      
            }
          private  boolean checkAndRequestPermissions() {
       int readPhoneState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
       int read_call_log = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG);
      
       List listPermissionsNeeded = new ArrayList<>();
      
       if (readPhoneState != PackageManager.PERMISSION_GRANTED) {
           listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
       }
      
       if (read_call_log != PackageManager.PERMISSION_GRANTED) {
           listPermissionsNeeded.add(Manifest.permission.READ_CALL_LOG);
       }
      
       if (read_call_log != PackageManager.PERMISSION_GRANTED) {
           listPermissionsNeeded.add(Manifest.permission.PROCESS_OUTGOING_CALLS);
       }
      
       if (read_call_log != PackageManager.PERMISSION_GRANTED) {
           listPermissionsNeeded.add(Manifest.permission.INTERNET);
       }
      
       if (!listPermissionsNeeded.isEmpty()) {
           ActivityCompat.requestPermissions(this,
                   (String[]) listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),
                   REQUEST_ID_MULTIPLE_PERMISSIONS);
      
           return false;
       }
       return true;
      }
      
    4. inside the PhoneCallReciver class

       public class CallReceiver extends BroadcastReceiver{
      
      
       @Override
           public void onReceive(Context context, Intent intent) {
      
               try {
      
                   runfirstTime(context,intent);
      
               } catch (Exception ex) {
                   try {
      
                   }
                   catch (Exception e)
                   {
      
                   }
               }
           }
      
      
       private void runfirstTime(Context context, Intent intent) {
      
           TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
           MyPhoneStateListener customPhoneListener = new MyPhoneStateListener();
      
           telephony.listen(customPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
      
           Bundle bundle = intent.getExtras();
           String phone_number = bundle.getString("incoming_number");
      
           String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
           int state = 0;
      
           if(stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)){
               state = TelephonyManager.CALL_STATE_IDLE;
           }
           else if(stateStr.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)){
               state = TelephonyManager.CALL_STATE_OFFHOOK;
           }
           else if(stateStr.equals(TelephonyManager.EXTRA_STATE_RINGING)){
               state = TelephonyManager.CALL_STATE_RINGING;
           }
      
           if (phone_number == null || "".equals(phone_number)) {
               return;
           }
           customPhoneListener.onCallStateChanged(context, state, phone_number);
          // Here customPhoneListener is a object of the  use context,state,phone_number to get the MyCustomPhonestatelistener class Which extends PhoneStateListener class.
      
       }
      }
      
    0 讨论(0)
  • 2020-12-20 03:31

    I my case phone state permission (android.permission.READ_PHONE_STATE) defined in manifest was not enough so when I give permission to app manually from app setting it start receiving Phone_State broadcast. I think run time permission from user is required.

    0 讨论(0)
  • 2020-12-20 03:34

    You canno longer receive PHONE_STATE_CHANGED broadcast this way.

    From official Android developer guide https://developer.android.com/guide/components/broadcasts :

    Beginning with Android 8.0 (API level 26), the system imposes additional restrictions on manifest-declared receivers.

    If your app targets Android 8.0 or higher, you cannot use the manifest to declare a receiver for most implicit broadcasts (broadcasts that don't target your app specifically). You can still use a context-registered receiver when the user is actively using your app.

    You must use explicit broadcast receivers (registered from your activity) to receive PHONE_STATE_CHANGED broadcast.

    public class ToastDisplay extends Activity {
    
        private BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
            }
        };
    
        @Override
        protected void onResume() {
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.action.PHONE_STATE");
            registerReceiver(receiver, filter);
            super.onResume();
        }
    
        @Override
        protected void onPause() {
            unregisterReceiver(receiver);
            super.onPause();
        }
    }
    

    Also, you in addition to declare required permission like android.permission.READ_PHONE_STATE , android.permission.PROCESS_OUTGOING_CALLS in the manifest , you must obtain those permissions explicitly from user at run-time. Otherwise you will not receive some(most) system broadcasts. Android developer guide has a nice explanation on requesting permissions from user and code sample. https://developer.android.com/training/permissions/requesting

    0 讨论(0)
提交回复
热议问题