简体   繁体   English

当应用程序在 android 版本 9 中被杀死时收听呼叫广播接收器

[英]listen to call broadcast receiver when app gets killed in android version 9

i want to make some functionality like true caller that when a call comes gets missed by the user then it should show some message or dialog box this is my broadcast reciever class我想做一些功能,比如真正的呼叫者,当用户错过来电时,它应该显示一些消息或对话框,这是我的广播接收器 class

public class MyReceiver extends BroadcastReceiver{
  
    private static int lastState = TelephonyManager.CALL_STATE_IDLE;
    private static Date callStartTime;
    private static boolean isIncoming;
    private static String savedNumber;


    protected void onIncomingCallStarted(Context ctx, String number, Date start) {
        Log.d("onIncomingCallStarted","no"+number);
    }
    protected void onOutgoingCallStarted(Context ctx, String number, Date start) {
        Log.d("onOutgoingCallStarted","no"+number);
    }
    protected void onIncomingCallEnded(Context ctx, String number, Date start, Date end) {
        Log.d("onIncomingCallEnded","no"+number);
    }
    protected void onOutgoingCallEnded(Context ctx, String number, Date start, Date end) {
        Log.d("onOutgoingCallEnded","no"+number);
    }
    protected void onMissedCall(Context ctx, String number, Date start) {
        Log.d("onMissedCall","no"+number);
    }
    
    public void onCallStateChanged(Context context, int state, String number) {
        if(lastState == state){
            return;
        }
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                isIncoming = true;
                callStartTime = new Date();
                savedNumber = number;
                onIncomingCallStarted(context, number, callStartTime);
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                if(lastState != TelephonyManager.CALL_STATE_RINGING){
                    isIncoming = false;
                    callStartTime = new Date();
                    onOutgoingCallStarted(context, savedNumber, callStartTime);
                }
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                if(lastState == TelephonyManager.CALL_STATE_RINGING){
                    
                    onMissedCall(context, savedNumber, callStartTime);
                }
                else if(isIncoming){
                    onIncomingCallEnded(context, savedNumber, callStartTime, new Date());
                }
                else{
                    onOutgoingCallEnded(context, savedNumber, callStartTime, new Date());
                }
                break;
        }
        lastState = state;
    }
    

    public void onReceive(Context context, Intent intent) {
        
        if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
            savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
        }
        else{
            String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
            String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
            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;
            }
            onCallStateChanged(context, state, number);
        }
    }
} 

problem i'm facing is that, This app is working fine when its in foreground but as its gets killed broadcast receiver is not receiving and not giving any message i know there are some changes for version's>oreo but i don't no how to tackle this problem pls hlp me out.我面临的问题是,这个应用程序在前台运行良好,但由于它被杀死,广播接收器没有接收并且没有给出任何消息,我知道版本>oreo 有一些变化,但我不知道如何解决这个问题请帮助我。 this my Menifest.xml:这是我的 Menifest.xml:

 <receiver
        android:name=".Recievers.MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter android:priority="1000">
            <action android:name="android.intent.action.PHONE_STATE"/>

        </intent-filter>
    </receiver>
  1. This happens, may be you are debugging the app.发生这种情况,可能是您正在调试应用程序。 When you close the app while debugging, it force stops.当您在调试时关闭应用程序时,它会强制停止。 Try to manually run the app & test it again.尝试手动运行应用程序并再次测试。 If its not work,如果它不起作用,
  2. Implement Broadcast Receiver as a service.将广播接收器实现为服务。 But it is not a good practice.但这不是一个好习惯。
  3. Also check you have granted all the call permissions.还要检查您是否已授予所有呼叫权限。 Include all required permissions in Manifest.在清单中包含所有必需的权限。 Here is all the permissions you needed (Note: PROCESS_OUTGOING_CALLS is now deprecated. Don't know your Target or min SDK, So I included).这是您需要的所有权限(注意:PROCESS_OUTGOING_CALLS 现在已弃用。不知道您的目标或最小 SDK,所以我包括在内)。
 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" /> <uses-permission android:name="android.permission.READ_CALL_LOG"/>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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