¿Se puede instanciar un objeto telefonía.Phone a través del sdk?

Estoy intentando conseguir un objeto del teléfono de modo que pueda llamar y conferencias dos números de dentro de mi uso.

He intentado usar el static PhoneFactory.makeDefaultPhones((Context)this) pero no he tenido ninguna suerte.

 String phoneFactoryName = "com.android.internal.telephony.PhoneFactory"; String phoneName = "com.android.internal.telephony.Phone"; Class phoneFactoryClass = Class.forName(phoneFactoryName); Class phoneClass = Class.forName(phoneName); Method getDefaultPhone = phoneFactoryClass.getMethod("getDefaultPhone"); Object phoneObject = getDefaultPhone.invoke(null); 

Error – Causado por java.lang.RuntimeException: PhoneFactory.getDefaultPhone debe ser llamado desde el hilo Looper

Sí, puede ser instanciado. Pero hay que superar un par de obstáculos:

  • En tu conjunto de AndroidManifest.xml

    Android: sharedUserId = "android.uid.phone"

    Dentro de la etiqueta <manifest> . Esto es necesario para evitar que se lance una excepción de SecurityException cuando los intentos de protección se envían mediante los métodos que puede invocar (como android.intent.action.SIM_STATE_CHANGED ).

  • Conjunto

    Android: process = "com.android.phone"

    En su etiqueta <application> . Esto es necesario para permitir la invocación de getDefaultPhone() / makeDefaultPhone() .

  • Para hacer todo esto, su aplicación debe estar firmada con la clave de firma del sistema.

Al menos podemos responder o ignorar llamadas =) permítanme copiar y pegar mi post

¡¡¡DIOS MIO!!! ¡¡¡SÍ, PODEMOS HACER ESO!!!
Me iba a matar después de severas 24 horas de investigar y descubrir … ¡Pero he encontrado una solución "fresca"!

 // "cheat" with Java reflection to gain access // to TelephonyManager's ITelephony getter Class c = Class.forName(tm.getClass().getName()); Method m = c.getDeclaredMethod("getITelephony"); m.setAccessible(true); telephonyService = (ITelephony)m.invoke(tm); 

Las personas que quieren desarrollar su software de control de llamadas visitan este punto de inicio: http://www.google.com/codesearch/p?hl=es#zvQ8rp58BUs/trunk/phone/src/i4nc4mp/myLock/phone/CallPrompt.java&q = Itelephony% 20package: http: //mylockforandroid%5C.googlecode%5C.com&d=0

Hay un proyecto. Y hay comentarios importantes (y créditos).

En resumen: copie el archivo AIDL, añada permisos a manifiesto, copie y pegue la fuente para la administración de telefonía.

Algunos más información para usted. AT que sólo puede enviar si está enraizada. Que puede matar el proceso del sistema y enviar comandos, pero usted necesitará un reinicio para permitir que su teléfono para recibir y enviar llamadas.

¡Estoy muy feliz! =) Ahora mi Shake2MuteCall obtendrá una actualización!

Hy. Pude recuperar un ProxyPhone trought esta clase (y un poco de reflexión). Usted puede usar el (Reflejado) PhoneFactory a continuación:

 package your.package; import java.lang.reflect.Method; import android.content.Context; import android.util.Log; public class ReflectedPhoneFactory { public static final String TAG = "PHONE"; public static void makeDefaultPhones(Context context) throws IllegalArgumentException { try{ ClassLoader cl = context.getClassLoader(); @SuppressWarnings("rawtypes") Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory"); //Parameters Types @SuppressWarnings("rawtypes") Class[] paramTypes= new Class[1]; paramTypes[0]= Context.class; Method get = PhoneFactory.getMethod("makeDefaultPhone", paramTypes); //Parameters Object[] params= new Object[1]; params[0]= context; get.invoke(null, params); }catch( IllegalArgumentException iAE ){ throw iAE; }catch( Exception e ){ Log.e(TAG, "makeDefaultPhones", e); } } public static void makeDefaultPhone(Context context) throws IllegalArgumentException { try{ ClassLoader cl = context.getClassLoader(); @SuppressWarnings("rawtypes") Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory"); //Parameters Types @SuppressWarnings("rawtypes") Class[] paramTypes= new Class[1]; paramTypes[0]= Context.class; Method get = PhoneFactory.getMethod("makeDefaultPhone", paramTypes); //Parameters Object[] params= new Object[1]; params[0]= context; get.invoke(null, params); }catch( IllegalArgumentException iAE ){ throw iAE; }catch( Exception e ){ Log.e(TAG, "makeDefaultPhone", e); } } /* * This function returns the type of the phone, depending * on the network mode. * * @param network mode * @return Phone Type */ public static Integer getPhoneType(Context context, int networkMode) throws IllegalArgumentException { Integer ret= -1; try{ ClassLoader cl = context.getClassLoader(); @SuppressWarnings("rawtypes") Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory"); //Parameters Types @SuppressWarnings("rawtypes") Class[] paramTypes= new Class[1]; paramTypes[0]= Integer.class; Method get = PhoneFactory.getMethod("getPhoneType", paramTypes); //Parameters Object[] params= new Object[1]; params[0]= new Integer(networkMode); ret= (Integer) get.invoke(PhoneFactory, params); }catch( IllegalArgumentException iAE ){ throw iAE; }catch( Exception e ){ ret= -1; } return ret; } public static Object getDefaultPhone(Context context) throws IllegalArgumentException { Object ret= null; try{ ClassLoader cl = context.getClassLoader(); @SuppressWarnings("rawtypes") Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory"); Method get = PhoneFactory.getMethod("getDefaultPhone", (Class[]) null); ret= (Object)get.invoke(null, (Object[]) null); }catch( IllegalArgumentException iAE ){ throw iAE; }catch( Exception e ){ Log.e(TAG, "getDefaultPhone", e); } return ret; } public static Phone getCdmaPhone(Context context) throws IllegalArgumentException { Phone ret= null; try{ ClassLoader cl = context.getClassLoader(); @SuppressWarnings("rawtypes") Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory"); Method get = PhoneFactory.getMethod("getCdmaPhone", (Class[]) null); ret= (Phone)get.invoke(null, (Object[]) null); }catch( IllegalArgumentException iAE ){ throw iAE; }catch( Exception e ){ // } return ret; } public static Phone getGsmPhone(Context context) throws IllegalArgumentException { Phone ret= null; try{ ClassLoader cl = context.getClassLoader(); @SuppressWarnings("rawtypes") Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory"); Method get = PhoneFactory.getMethod("getGsmPhone", (Class[]) null); ret= (Phone)get.invoke(null, (Object[]) null); }catch( IllegalArgumentException iAE ){ throw iAE; }catch( Exception e ){ // } return ret; } } 

Con él, utilice el código:

  ReflectedPhoneFactory.makeDefaultPhone(yourContext); Object phoneProxy= ReflectedPhoneFactory.getDefaultPhone(yourContext); 

Tenga en cuenta que la llamada "makeDefaultPhone" actualizará el valor del miembro estático "static Private Looper sLooper;" Y todavía no he probado efectos colaterales.

Con el objeto "phoneProxy" recibido puede hacer la reflexión de la llamada de PhoneProxy. (Actualmente estoy implementando esta clase y puedo publicarla si se considera útil.

Estoy intentando conseguir un objeto del teléfono de modo que pueda llamar y conferencias dos números de dentro de mi uso.

Esto no es posible desde el SDK.

He intentado usar el static PhoneFactory.makeDefaultPhones ((Context) esto) pero no he tenido ninguna suerte.

Eso no está en el SDK. No pase por los límites del SDK .

Error – Causado por java.lang.RuntimeException: PhoneFactory.getDefaultPhone debe ser llamado desde el hilo Looper

Eso es porque usted está intentando hacer la cosa-usted no-se-se-para-ser-haciendo de un hilo de fondo.

Lo llamé de Activity.onCreate y se estrelló varias líneas después de su problema con el siguiente error:

¡Los teléfonos por defecto todavía no se han hecho!

Consulta las fuentes de Android :

 public static Phone getDefaultPhone() { if (sLooper != Looper.myLooper()) { throw new RuntimeException( "PhoneFactory.getDefaultPhone must be called from Looper thread"); } if (!sMadeDefaults) { throw new IllegalStateException("Default phones haven't been made yet!"); } return sProxyPhone; } 

Fyi, las clases internas Phone, CallManager y algunos más se mueven de /system/framework/framework.jar a /system/framework/telephony-common.jar en Jelly bean.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.