在奥利奥(Oreo),我无法获得外拨号码 [英] In Oreo, I'm not able to get an outgoing number

查看:72
本文介绍了在奥利奥(Oreo),我无法获得外拨号码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获取传出号码,但在oreo之前,代码工作正常,但在具有oreo代码的设备中无法正常工作.

I am trying to get outgoing number but before oreo the code is working absolutely fine but in devices with oreo code is not working.

     public class IncomingBroadCastReceiver extends BroadcastReceiver {
        Context context;
        WhatsAppContacts requiredContact;
        List<String> messages = new ArrayList<>();
        String callerName="";
        Realm realm;
        String outgoingNumber = "";

        @Override
        public void onReceive(final Context context, final Intent intent) {
            Log.d("Search","onReceive");
            this.context = context;
            realm = Realm.getDefaultInstance();
            TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
                telephony.listen(new PhoneStateListener(){
                    @Override
                    public void onCallStateChanged(int state, String incomingNumber) {
                        super.onCallStateChanged(state, incomingNumber);
                        Log.d("Search","above Ringing"+state);
                        if(state ==  TelephonyManager.CALL_STATE_RINGING){
                            SharedPreferences sharedPreferences = PreferenceManager
                                    .getDefaultSharedPreferences(context);
                            SharedPreferences.Editor editor = sharedPreferences.edit();
                            editor.putString("number", incomingNumber);
                            Log.d("Ringing", incomingNumber);
                            editor.apply();
                            Log.d("Search","inside call state changed");
                            initialiseAndStartService();
                        }
                        else if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")){
                            //Outgoing call
                                String number=intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                                Log.i("tag","Outgoing number : "+number);
                                if(number!=null){
                                    SharedPreferences sharedPreferences = PreferenceManager
                                            .getDefaultSharedPreferences(context);
                                    SharedPreferences.Editor editor = sharedPreferences.edit();
                                    editor.putString("number", number);
                                    editor.apply();
                                    Log.d("Search","inside call state changed");
                                    initialiseAndStartService();

                                }
                        }
                    }
                },PhoneStateListener.LISTEN_CALL_STATE);

        }

}

在oreo之前的版本中,它完全可以正常工作.但是在奥利奥(Oreo)中,无法获取传出号码.

In versions before oreo it's working completely fine. But in Oreo not able to get outgoing number.

推荐答案

在奥利奥(Oreo)中,您必须首先请求权限才能进行呼叫.

In Oreo, you have to first request for permission to make call.

private boolean checkCallPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            String call = Manifest.permission.CALL_PHONE;
            String outgoing = Manifest.permission.PROCESS_OUTGOING_CALLS;
            String incoming = Manifest.permission.READ_PHONE_STATE;
            int hasCallPermission = checkSelfPermission(call);
            List<String> permissions = new ArrayList<String>();
            if (hasCallPermission != PackageManager.PERMISSION_GRANTED) {
                permissions.add(call);
                permissions.add(outgoing);
                permissions.add(incoming);
            }
            if (!permissions.isEmpty()) {
                String[] params = permissions.toArray(new String[permissions.size()]);
                requestPermissions(params, REQUEST_CODE_ASK_PERMISSIONS);
                return false;
            } else {
                return true;
            }
        } else {
            return true;
        }
    }

然后,您必须注册一个接收器才能接收去电事件.您可以通过创建一个扩展广播接收器并在AndroidManifest.xml文件中声明该接收器的类来实现.在Android Oreo版本中,您无法在AndroidManifest.xml文件中声明隐式广播.您必须在Oreo版本及更高版本中动态注册接收器,但NEW_OUTGOING_CALL已被豁免.因此,您可以在AndroidManifest.xml文件中静态注册它,并且它也可以在Oreo版本中使用.

Then, you have to register a receiver to receive the outgoing call event. You can do that with creation of a class which extends broadcast receiver and declare that receiver in AndroidManifest.xml file. In Android Oreo version you can't declare implicit broadcasts in AndroidManifest.xml file. You have to register the receiver dynamically in Oreo version and above but NEW_OUTGOING_CALL has been exempted . So, you can register it statically in AndroidManifest.xml file and it will work in Oreo version as well.

public class IncomingAndOutgoingCallReceiver extends BroadcastReceiver {
    private final String TAG = this.getClass().getSimpleName();

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "OnReceive");
        String action = intent.getAction();
        Log.i(TAG, "action : " + action);
        callHandler(intent);
    }

    private void callHandler(Intent intent) {
        String PhoneNumber = "NA";

        try {
            Log.i(TAG, "State : " + intent.getStringExtra(TelephonyManager.EXTRA_STATE));
            String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
            if (state == null) {
                PhoneNumber = "NA";
            } else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
                PhoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                Log.d(TAG, "Incoming number : " + PhoneNumber);
            }
            if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
                PhoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                Log.d(TAG, "Outgoing number : " + PhoneNumber);
            }
            if (!PhoneNumber.contentEquals("NA")) {
                Log.i(TAG, "PhoneNumber : " + PhoneNumber);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e(TAG, "Exception is : ", e);
        }
    }
}

就是这样.完整的代码位于此处

That's it. Complete code is in here

项目特点如下:

- Make a call.
- Receiver to receive events of 
    * Incoming Calls.
    * Outgoing Calls.
    * Get Outgoing Number.
    * Get Incoming Number.
    * States of the phone(Ex: Idle, Ringing, OffHook).

这篇关于在奥利奥(Oreo),我无法获得外拨号码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆