簡體   English   中英

在奧利奧(Oreo),我無法獲得外撥號碼

[英]In Oreo, I'm not able to get an outgoing number

我正在嘗試獲取傳出號碼,但在oreo之前,代碼工作正常,但在帶有oreo代碼的設備中無法正常工作。

     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)中無法獲取傳出號碼。

奧利奧(Oreo)有一個限制。 您不能在清單中注冊隱式廣播,而NEW_OUTGOING_CALL是隱式廣播。 僅當您的應用處於直播狀態且用戶正在與之交互時,您才能獲得該廣播作品。 您可以在這里找到更多信息

要獲得外撥號碼,我有個主意:從通話記錄中獲取:

public static  ArrayList<String> getRecentCall(Context context) {
    ArrayList<String> listRecentCall = new ArrayList<>();

    Uri queryUri = android.provider.CallLog.Calls.CONTENT_URI;

    String[] projection = new String[]{
            ContactsContract.Contacts._ID,
            CallLog.Calls._ID,
            CallLog.Calls.NUMBER,
            CallLog.Calls.CACHED_NAME,
            CallLog.Calls.DATE};

    String sortOrder = String.format("%s limit 2 ", CallLog.Calls.DATE + " DESC");

    Cursor cursor = context.getContentResolver().query(queryUri, projection, null, null, sortOrder);

    while (cursor.moveToNext()) {
        String phoneNumber = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));
        listRecentCall.add(phoneNumber);
        //get first number so we only need firt element
        break;
    }
    cursor.close();

    return listRecentCall;
}

在結束通話后500毫秒內保持延遲運行。 希望這可以幫到你

在奧利奧(Oreo)中,您必須先請求權限才能撥打電話。

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版本中使用。

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

而已。 完整的代碼在這里

該項目的功能如下:

- 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).

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM