androidbroadcastreceiverincoming-call

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);
            }
        }

    }
}

Solution

  • 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