2

此代码在Android 6 ( Marshmallow ) 之前运行良好:

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 及以上版本的工作解决方案。

更新

我包含了来自官方 Nougat 文档的以下代码,但该数字仍未添加到阻止列表中。

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

1 回答 1

0

Android 9 不能使用非 SDK 接口

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

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

权限

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

于 2018-12-16T15:22:41.310 回答