How to reject incoming call programatically in and

2020-02-02 13:20发布

问题:

This question already has answers here:
Closed 8 years ago.

Possible Duplicate:
How to block calls in android

Can any one tell me how to reject incoming call programatically in android ?

回答1:

Let us implement this solution in 3 steps :

a. Define this class or receiver :

This is your main class :

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. Manifest file :

<?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> 

c . Define telephone aidl , under com.android.internal.telephony

 package com.android.internal.telephony;

  interface ITelephony { 
    boolean endCall();

    void answerRingingCall();

    void silenceRinger();
 }

mh: Worked for me only in emulator, not on real devices... All devices above android 2.3 require root permission or installation as a system app to be able to use the permission android.permission.MODIFY_PHONE_STATE.