2010-08-18 21 views
6

en los teléfonos Android, bajo petición -> Ajustes adicionales -> Identificador de llamadascómo ocultar mediante programación identificador de llamadas en Android

es posible ocultar su identificador de llamadas. Quiero hacer eso programáticamente desde mi código, pero no pude encontrar una manera de hacerlo.

he buscado en

android.provider android.telephony

para la versión 2.1 y no era capaz de encontrarlo.

¿Alguien ha resuelto con éxito este problema?

Gracias de antemano. Atentamente.

Respuesta

1

Aquí describiré dos enfoques que probé.

1.) Es posible visualizar la pantalla Configuración de llamadas adicionales desde su aplicación. Aunque parece que es parte de la aplicación de Configuración, eso no es cierto. Esta actividad forma parte de la aplicación Teléfono nativo, y puede ser abordado con la siguiente intención:

Intent additionalCallSettingsIntent = new Intent("android.intent.action.MAIN"); 
ComponentName distantActivity = new ComponentName("com.android.phone", "com.android.phone.GsmUmtsAdditionalCallOptions"); 
additionalCallSettingsIntent.setComponent(distantActivity); 
startActivity(additionalCallSettingsIntent); 

Entonces usuario tiene que presionar manualmente sobre la preferencia de identificación de llamadas y obtiene botón de radio con 3 opciones.

Esto no era lo que realmente quería lograr cuando formulé esta pregunta. Quería evitar el paso donde el usuario tiene que seleccionar cualquier otra opción.

2.) Cuando el enfoque descrito en 1.) se ejecuta en la aplicación de teléfono nativo, se ha utilizado la función setOutgoingCallerIdDisplay() de com.android.internal.telephony.Phone. Esta fue la base para el siguiente enfoque: utilizar la reflexión de Java en esta clase y tratar de invocar la función con los parámetros apropiados:

try 
{ 
    Class <?> phoneFactoryClass = Class.forName("com.android.internal.telephony.PhoneFactory"); 

    try 
    { 
     Method getDefaultPhoneMethod = phoneFactoryClass.getDeclaredMethod("getDefaultPhone");    
     Method makeDefaultPhoneMethod = phoneFactoryClass.getMethod("makeDefaultPhone" , Context.class);     

     try 
     {      
      makeDefaultPhoneMethod.invoke(null, this); 
      Object defaultPhone = getDefaultPhoneMethod.invoke(null); 

      Class <?> phoneInterface = Class.forName("com.android.internal.telephony.Phone"); 
      Method getPhoneServiceMethod = phoneInterface.getMethod("setOutgoingCallerIdDisplay", int.class, Message.class); 

      getPhoneServiceMethod.invoke(defaultPhone, 1, null);      
     } 
     catch (InvocationTargetException ex) 
     { 
      ex.printStackTrace();     
     } 
     catch (IllegalAccessException ex) 
     { 
      ex.printStackTrace();     
     }  
    } 
    catch (NoSuchMethodException ex) 
    { 
     ex.printStackTrace();     
    }   
} 
catch (ClassNotFoundException ex) 
{ 
    ex.printStackTrace();     
}  

En primer lugar he intentado sólo para usar getDefaultPhone(), pero me da RuntimeException

"PhoneFactory.getDefaultPhone se debe llamar desde el hilo de Looper"

Obviamente, el problema radica en el hecho de que traté de llamar a este método desde el bucle de mensajes que no era el de la aplicación de teléfono nativo.

tratado de evitar esto haciendo propio teléfono por defecto, pero esto era una violación de seguridad:

ERROR/Android Runtime (2338): java.lang.SecurityException: Permiso Negación: no se les permite enviar android.provider emisión. Telefonía.SPN_STRINGS_UPDATED de PID = 2338, uid = 10048

La única manera de superar (ambos de) esta sería firmar su aplicación con la misma clave que la aplicación sistemas centrales, como se describe en

Run secure API calls as root, android

+0

cómo obtener la misma clave que la aplicación de sistemas centrales y cómo iniciar sesión en mi aplicación? – pengwang

+0

Por favor, consulte el enlace en la parte inferior de mi respuesta. Encontrarás una discusión más detallada allí. Pero en términos generales, debido a razones de seguridad, no debería ser posible obtenerlo, a menos que esté "cocinando" su propia compilación del sistema Android. – Zelimir

+0

@Zelimir puede ayudarme por favor [aquí] (http://stackoverflow.com/questions/22908750/how-to-know-whether-hiding-caller-id-is-enabled-or-not-in-android) ... – RuntimeException

0

no estoy seguro si esto es una característica global, pero los teléfonos de Australia puede ocultar su número anteponiendo el número del llamante con # 31 # o . Puede que esta no sea la solución perfecta, pero un prefijo como este podría funcionar para sus necesidades durante la codificación.

+0

Sí, estoy al tanto de eso, pero estaba buscando alguna forma de hacerlo a través de Android System y ser un proveedor de red independiente. De todos modos, gracias por la pista. – Zelimir

Cuestiones relacionadas