簡體   English   中英

如何以編程方式在Android Nougat,Oreo及更高版本中阻止通話?

[英]How to Block Call in Android Nougat, Oreo and above programatically?

這段代碼在Android 6Marshmallow )之前可以正常工作:

TelephonyManager tm = (TelephonyManager) context
        .getSystemService(Context.TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
Object telephonyService = m.invoke(tm); 
c = Class.forName(telephonyService.getClass().getName()); 
m = c.getDeclaredMethod("endCall"); 
m.setAccessible(true); 
m.invoke(telephonyService);

閱讀文檔后

我仍然打電話給endCall(context, number) ,無法阻止通話。 需要Android Nougat,Oreo,Pie及更高版本的工作解決方案。

更新

我包括了來自牛軋糖官方文檔的以下代碼,但仍然沒有將該數字添加到阻止列表中。

Cursor c = mContext.getContentResolver().query(BlockedNumberContract.BlockedNumbers.CONTENT_URI,
                    new String[]{BlockedNumberContract.BlockedNumbers.COLUMN_ID,
                            BlockedNumberContract.BlockedNumbers.COLUMN_ORIGINAL_NUMBER,
                            BlockedNumberContract.BlockedNumbers.COLUMN_E164_NUMBER}, null, null, null);

Android 9不能使用非SDK界面

Android 9引入了對非SDK接口使用的新限制,無論是直接,通過反射還是通過JNI。 每當應用程序引用非SDK接口或嘗試使用反射或JNI獲取其句柄時,都會應用這些限制。

除非您是系統應用程序或默認撥號程序或默認短信應用程序,否則您似乎無法讀寫BlockedNumberContract

權限

只有系統,默認的SMS應用程序和默認的電話應用程序(請參閱TelecomManager.getDefaultDialerPackage())和運營商應用程序(請參閱CarrierService)可以讀取和寫入阻止號碼提供程序。 但是,canCurrentUserBlockNumbers(Context)可以由任何應用程序訪問。

暫無
暫無

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

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