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

6

https://dev59.com/FXNA5IYBdhLWcg3wH6EW - B00MER
1个回答

15

让我们分3步来实现这个解决方案:

a. 定义这个类或者接收器:

这是您的主要类:

package com.sample;
import java.lang.reflect.Method;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;

import com.android.internal.telephony.*;


public class main extends BroadcastReceiver {
private static final String TAG = null;
String incommingNumber;
String incno1= "9916090941";

public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();

    if(null == bundle)
            return;
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);       
    try {
        // Java reflection to gain access to TelephonyManager's
        // ITelephony getter
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        Log.v(TAG, "Get getTeleService...");
        Class c = Class.forName(tm.getClass().getName());
        Method m = c.getDeclaredMethod("getITelephony");
        m.setAccessible(true);
        com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm);  
        Bundle b = intent.getExtras();
        incommingNumber = b.getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
        Log.v(TAG,incommingNumber );
        Log.v(TAG,incno1 );
        if ( incommingNumber.equals(incno1) )
        {
             telephonyService = (ITelephony) m.invoke(tm);
               telephonyService.silenceRinger();
        telephonyService.endCall();
        Log.v(TAG,"BYE BYE BYE" );
        }
        else{

        telephonyService.answerRingingCall();
        Log.v(TAG,"HELLO HELLO HELLO" );
        }


    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG,
                "FATAL ERROR: could not connect to telephony subsystem");
        Log.e(TAG, "Exception object: " + e);
    }


    }

b. 清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.sample"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
       <receiver  android:name=".main">
            <intent-filter  android:priority="100" >
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </receiver>

    </application>
    <uses-sdk android:minSdkVersion="7" />
 <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest> 

定义电话 AIDL,在 com.android.internal.telephony 下。

 package com.android.internal.telephony;

  interface ITelephony { 
    boolean endCall();

    void answerRingingCall();

    void silenceRinger();
 }

在模拟器中可以正常工作,但在真实设备上不能... Android 2.3以上的设备需要获取root权限或将应用安装为系统应用才能使用 android.permission.MODIFY_PHONE_STATE 权限。


有没有一种方法可以将电话呼叫转移到语音邮件? - powder366
2
我复制并粘贴了这些文件,但它不起作用! 我删除了这个权限。 - Menna-Allah Sami

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