[英]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.