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

时间:2018-08-29 06:25:15

标签: java android android-studio android-phone-call callblocking

此代码在 Android 6 棉花糖)之前可以正常工作:

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

After reading documentation

我仍然打了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);

1 个答案:

答案 0 :(得分:0)

Android 9不能使用非SDK接口

  

Android 9引入了使用非SDK的新限制   接口,无论是直接,通过反射还是通过JNI。这些   应用程序引用非SDK时会应用限制   接口或尝试使用反射或JNI获取其句柄。

除非您是系统应用程序或默认拨号程序或默认短信应用程序,否则您似乎无法读写BlockedNumberContract

  

权限

     

仅系统,默认SMS应用程序和默认电话   应用程序(请参阅TelecomManager.getDefaultDialerPackage())和运营商应用程序   (请参阅CarrierService)可以读取和写入被阻止的号码   提供者。但是,可以访问canCurrentUserBlockNumbers(Context)   通过任何应用程序。