2010-09-28 5 views

ответ

15

Давайте использовать это решение в 3 этапа:

а. Определить этот класс или приемник:

Это ваш главный класс:

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


    } 

}

б. Файл манифеста:

<?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. Определить телефонный aidl под com.android.internal.telephony

package com.android.internal.telephony; 

    interface ITelephony { 
    boolean endCall(); 

    void answerRingingCall(); 

    void silenceRinger(); 
} 

МХ: работал для меня только в эмуляторе, а не на реальных устройствах ... Все устройства выше Android 2.3 требует разрешения корня или установки в качестве приложения системы к иметь возможность использовать разрешение android.permission.MODIFY_PHONE_STATE.

+0

Есть ли способ отправить звонки на голосовую почту? – powder366

+1

Я копирую и вставляю эти файлы, но это не работает! Я удалил это разрешение –