2010-09-28 11 views

Respuesta

15

Vamos a implementar esta solución en 3 pasos:

a. Definir esta clase o receptor:

Ésta es su clase principal:

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. Archivo de manifiesto:

<?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. Definir AIDL telefónica, bajo com.android.internal.telephony

package com.android.internal.telephony; 

    interface ITelephony { 
    boolean endCall(); 

    void answerRingingCall(); 

    void silenceRinger(); 
} 

MH: trabajó para mí sólo en el emulador, no en dispositivos reales ... Todos los dispositivos anteriores androide 2.3 requieren permisos de root o instalación como una aplicación del sistema de poder usar el permiso android.permission.MODIFY_PHONE_STATE.

+0

¿Hay alguna manera de enviar llamadas al correo de voz? – powder366

+1

Copio y pego estos archivos pero no funciona! Quité este permiso –

Cuestiones relacionadas