简体   繁体   中英

Broadcast receiver is not triggered for incoming calls

I have this code and my app is not detecting the incoming calls.

My code is very similar with this answer what am i doing wrong?

How does a Android "OS" detect a incoming call

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.reporting2you.r2ym">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service
            android:name="com.reporting2you.services.FloatingViewService"
            android:enabled="true"
            android:exported="false" />

        <activity android:name=".FloatingActivity" />

        <receiver
            android:name="com.reporting2you.broadcastReceiver.CallReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

BroadcastReceiver

public class CallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            String state = extras.getString(TelephonyManager.EXTRA_STATE);
            Log.w("MY_DEBUG_TAG", state);
            if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                context.startActivity(new Intent(context, FloatingActivity.class));
                ((MainActivity)context).finish();
                String phoneNumber = extras
                        .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
                Log.w("MY_DEBUG_TAG", phoneNumber);
            }
        }

    }
}

If you use android.intent.action.PHONE_STATE you need to request READ_PHONE_STATE permission first. Because android.permission.READ_PHONE_STATE is dangerous level permission, so you must checkSelfPermission() in run time.

If not the broadcast will not be triggered when running on device with Android version above Marshmallow (23).

See: Requesting Permissions at Run Time

Try

public class CallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); //Change Here
            Log.w("MY_DEBUG_TAG", state);
            if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                context.startActivity(new Intent(context, FloatingActivity.class));
                ((MainActivity)context).finish();
                String phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER); //Change Here
                Log.w("MY_DEBUG_TAG", phoneNumber);
            }
        }

    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM