如何在安卓系统中以编程方式拒绝来电

11

我的应用程序将维护一个联系人列表。

来自列表中联系人的任何电话都将被拒接。它们将出现在未接来电列表中,但手机不会响铃。


ContentObserver 是一个可以进行最佳实践的单词。 - Nikunj Patel
可能是如何在Android中阻止电话的重复问题。 - Brock Adams
MODIFY_PHONE_STATE权限仅适用于系统应用程序(Android 2.3及以上版本)。如果您只想将应用程序用于您可以访问的电话,则可以将其制作为系统应用程序 - tchelidze
2个回答

19

首先创建这个接口:

  public interface ITelephony {

        boolean endCall();

        void answerRingingCall();

        void silenceRinger();

  }

然后创建一个扩展BroadcastReceiver的类。

public class IncomingCallReceiver extends BroadcastReceiver {
    private ITelephony telephonyService;
    private String blacklistednumber = "+458664455";

    @Override
    public void onReceive(Context context, Intent intent) {

       TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
       try {
         Class c = Class.forName(tm.getClass().getName());
         Method m = c.getDeclaredMethod("getITelephony");
         m.setAccessible(true);
         ITelephony telephonyService = (ITelephony) m.invoke(tm);
         Bundle bundle = intent.getExtras();
         String phoneNumber = bundle.getString("incoming_number");
         Log.e("INCOMING", phoneNumber);
         if ((phoneNumber != null) && phoneNumber.equals(blacklistednumber)) { 
            telephonyService.silenceRinger();
            telephonyService.endCall();
            Log.e("HANG UP", phoneNumber);
         }

       } catch (Exception e) {
         e.printStackTrace();
       }
}
这将只阻止那个单独的电话号码,但你明白了重点。 在你的清单文件中添加这个:
<receiver android:name=".IncomingCallReceiver">
    <intent-filter android:priority="999">
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.PROCESS_INCOMING_CALLS" />

嗨,我做了那个。但是什么也没发生。如何创建界面,我的意思是普通界面还是AIDL文件? - harish
不,你不必这样做。这对我来说已经很好了。 确保您要屏蔽的电话号码与呼入号码相同。您可以在LogCat下检查它。 - Finn Larsen
在方法 m = c.getDeclaredMethod("getITelephony") 处出现了 NoSuchMethodException。如何避免它? - uniruddh
6
如何添加 "android.permission.MODIFY_PHONE_STATE" 权限? - insomniac
1
@insomniac,请使用此<uses-permission tools:ignore="ProtectedPermissions" android:name="android.permission.MODIFY_PHONE_STATE" />。 - Ali Akram
显示剩余6条评论

2

这里下载ITelephony类。

然后将其放入com.android.internal.telephony.包中(创建一个新的包)。 接着将该包导入到适当的类中,并使用endCall()方法拒绝来电。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接