Abrir el menú de ServiceMode por programa en Android

Cómo abrir el menú Android ServiceMode en forma programática en los teléfonos Samsung?
Manualmente, puedo hacerlo marcando el código de ussd * # 0011 #.

Introduzca aquí la descripción de la imagen

Este fue un reto y he estado unas horas buscando una solución. Pero me temo que no tengo buenas noticias.

1. Primer intento, Intent.ACTION_DIAL

Es cierto que al principio era posible llamar directamente a códigos USSD desde una aplicación (utilizando la intención Intent.ACTION_DIAL), e incluso desde un sitio web, simplemente usando el esquema "tel:". Eso abre el dialer, y pone el número deseado. Como cuando pones el último #, el código se envía automáticamente, era casi transparente para el usuario, cuya interacción no era necesaria. Pero eso fue considerado como una vulnerabilidad del sistema, ya que alguien podría escribir software malicioso, o incluso más, insertar código malicioso en un sitio web que incluso podría limpiar su teléfono o bloquear la tarjeta SIM. Puede leer sobre esto, por ejemplo en este enlace A partir de septiembre de 2012, parece que Samsung finalmente arregló esa vulnerabilidad por lo que por ejemplo su S3 no es capaz de eso. En este punto será difícil encontrar cualquier dispositivo aún vulnerable.

2. Segundo intento, la solución

Ok todo en Android es una aplicación, incluso el teléfono en sí es una aplicación. Entonces, ¿por qué no podríamos intentar replicar su código? Y en realidad, ¿qué sucede cuando el usuario envía manualmente un ussd? Había demasiadas respuestas posibles:

  • El teléfono envía el código al proveedor y espera una respuesta, o
  • El teléfono hace algo localmente

Fácil de probar: Puse mi teléfono en modo de vuelo, por lo que si tiene que enviar un código, esperemos que no será capaz de hacerlo. Era como esperé: marcé el código, y la pantalla de ServiceMode apareció! Y estaba vacío, así que podemos decir que el marcador abre una aplicación del sistema, y ​​esta aplicación llama al proveedor. Es fácil averiguar cuál es esta aplicación. En los dispositivos Samsung, al menos en S4, su nombre es ServiceMode. Puede encontrarla en Settings > Application manager > All . Así podemos intentar averiguar cómo se lanza más por medio de una de estas:

2.1. Lectura del código de la aplicación del teléfono

Lo intenté, pero era bastante confuso al principio, así que fui a la opción 2

2.2. Comprobación de la aplicación Modo servicio

He abierto ES explorador de archivos> administrador de aplicaciones. Conectado el teléfono, y en phone / backups / apps tuve el servicestatus apk. Unos minutos o la ingeniería inversa después, tuve el archivo de manifiesto, tan revelador como se utiliza para ser. Allí pude ver un montón de actividades, y también unos receptores de difusión. No sabía de lo que tenía más miedo.

2.2.1 Vamos a intentar con las actividades.

Dado que sabemos que podemos abrir una aplicación específica de otra, trataré de escribir una aplicación sencilla, que abra una de estas actividades. Esto es tan sencillo como:

 Intent i= new Intent(Intent.Action_MAIN); i.setClass( "package name", "class name"); startActivity(i); 

Dado que esta aplicación no está destinada a ser abierta desde un icono de lanzador, no tiene una actividad con un filtro de intención que nos permite saber que es la actividad principal. Así que tengo que probar por lo menos algunos de ellos. Pero de todos modos, vi algo que no me gustó. Te lo diré más tarde.

Lo intenté, pero, como esperaba, no puedo abrir esas actividades. Recibo una excepción de actividad no encontrada. Así que, vamos a intentar con un receptor. Al menos esto será divertido.

2.2.2 Permite probar con los receptores.

Hay algunos, pero sobre todo me gustó uno con este intento-filtro:

  <intent-filter> <action android:name="android.provider.Telephony.SECRET_CODE" /> ... 

Se ve bien. Fui yo Telephony.java, y allí pude ver esto:

  /** * Broadcast Action: A "secret code" has been entered in the dialer. Secret codes are * of the form *#*#<code>#*#*. The intent will have the data URI:</p> * * <p><code>android_secret_code://&lt;code&gt;</code></p> */ public static final String SECRET_CODE_ACTION = "android.provider.Telephony.SECRET_CODE"; 

Parece genial, es una intención específica, probablemente el esquema que necesitamos no es "tel:" sino "android_secret_code: //" y probablemente los códigos tienen que estar en un formato interno diferente. Lo intenté, más o menos sólo por diversión, ya que sabía que hay el mismo problema que vi en las actividades, y es esto:

  <permission android:name="com.sec.android.app.servicemodeapp.permission.KEYSTRING" android:protectionLevel="signatureOrSystem" /> 

La aplicación declara este permiso y cada componente lo utiliza. Por lo tanto, o sabe cómo declarar y establecer una firma, o si es una aplicación del sistema. De lo contrario, no se puede interactuar con esta aplicación en absoluto.

Por supuesto que ni siquiera podía pensar en crear su propia aplicación servicemode, ya que no realizaría ese tipo de comunicación con el proveedor sin ser una aplicación del sistema (ya que tienes que pasar por algunas aplicaciones de firmware que dirá un triste "que Piensas que eres

Conclusiones

No hay nada que podamos hacer en su punto, al menos con un teléfono Samsung, y podemos pensar que cada otro teléfono será el mismo.

Alternativas

Bueno, en realidad ninguno realmente bueno. Pero veamos:

Alternativa 1. Encuentra otro tipo de código ussd

Sabemos que hay 2 tipos de USSD. Los que al marcar el último #, la acción se activa automáticamente, y el otro, que requieren que usted presione el botón de llamada.

Si intenta con un marcador de terceros, puede ver que

  • Cuando se marca el primer tipo de código, no se activa nada (sólo el marcador del firmware puede activarlos)
  • Usted puede utilizar el otro tipo (tipo código + llamada de la prensa). Supongo que esto significa que este tipo de códigos son menos riesgosos, ya que no cambia nada en el dispositivo, por lo que se les permite.
  • Por supuesto, si escribe un código del primer tipo y presiona llamada, obtendrá un error porque ese código no funciona de esa manera.

Por lo tanto, si un tercero puede enviar ese tipo de códigos, cada aplicación podría. Así que si usted podría tratar de encontrar un código alternativo ussd , de ese tipo que se activan después de que el usser presione el botón de llamada, usted podría lograr lo que usted necesita. En ese caso, debe usar una intención Intent.ACTION_CALL

// si utiliza la intención ACTION_DIAL, abre el marcador y coloca el número dado en él. // mientras tanto, si usamos ACTION_CALL, la aplicación llamará directamente.

 Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+ "*" + Uri.encode("#") + "0011" + Uri.encode("#"))); //here you woud put your alternative code startActivity(intent); 

También tendrías que declarar este permiso en tu manifiesto

 <uses-permission android:name="android.permission.CALL_PHONE"></uses-permission> 

Probablemente podría encontrar un código alternativo para hacer esto, ya que he visto algunos en Internet, pero en este momento nadie trabajó para mí. Puedes darle una oportunidad

Alternativa 2. Espere a que aparezca una api oficial

En la página de proyecto android en el código de coogle , hay una solicitud para agregar soporte de API de USSD. Tiene muchos suscriptores, pero es bastante viejo (más de 5 años), me temo que no es realmente bueno. De todos modos, eso podría suceder, probablemente el android tendrá que considerar preparar una api para que una aplicación pueda declarar algunos permisos, y hacer solicitudes de algún tipo de código. Pero, lo sé, esto puede estar esperando para siempre.

Entonces, qué decir. Tendría suerte buscando una solución, o una alternativa a su aplicación. Lo siento mi investigación no fue más fructífera 🙁

Creo que tengo una solución.

Al ejecutar el código de abajo en un teléfono con raíz debe abrir el Samsung ServiceModeApp (el modo de servicio mostrado en esta publicación). Programáticamente, creo que se puede ejecutar cualquier cosa si se registra como root. Sin embargo, hay problemas a enfrentar como:

  1. Teléfono enraizado . Si está creando aplicaciones para publicar, considere que menos del 2% de todos los dispositivos Android están enraizados;
  2. Aplicación muy específica . Este código abajo se ejecuta en una versión específica del dispositivo Samsung (lo he ejecutado en un Galaxy SIII GT-9300). Es posible que no se ejecute en otros modelos, y seguramente no en otras marcas. Debe volver a implementar cada caso.

Repare que 0011 es el argumento que debe pasar a la actividad. El código sigue:

 PackageManager packageManager = this.getPackageManager(); if (packageManager != null) { measure_intent = new Intent(Intent.ACTION_MAIN). addCategory(Intent.CATEGORY_LAUNCHER).setComponent(new ComponentName( "com.sec.android.app.servicemodeapp", "com.sec.android.app.servicemodeapp.ServiceModeApp")); measure_intent.putExtra("keyString", "0011"); ResolveInfo resolved = packageManager.resolveActivity( measure_intent, PackageManager.MATCH_DEFAULT_ONLY); if (resolved != null) { startActivity(measure_intent); return; } else { Toast.makeText(this, "version not implemented", Toast.LENGTH_LONG).show(); } } 

He llegado a él tirando de ServiceModeApp desde el directorio de Android / system / app, descompilando el archivo .apk y luego analizando su código. ¡Espero eso ayude! 🙂

FWIW: El acceso de ServiceMode (SM) depende tanto de HW como de SW, y cada fabricante intenta ocultar repetidamente la funcionalidad SM en cada iteración de la API AOS. El SM se encuentra realmente en el módem FW y lo que ves es sólo el envoltorio de Java haciendo y presentando los resultados de las diversas llamadas al RTOS del módem. Además, con el reciente archivo FW de Samsung / HTC, también requieren habilitar ciertos archivos en el directorio / efs /.

  • Problemas con TTS en el Samsung Galaxy S3
  • El dispositivo Samsung con Android 5.0 cambia el color de la barra de progreso
  • Desactivación o detección del modo de ahorro de energía específico de la aplicación
  • Android Capture USB Mic Audio sin root
  • Appcompat-v7 v21.0.0 causando bloqueo en dispositivos Samsung con Android v4.2.2
  • MP3 streaming en C # .NET 4.5.1 MVC 5.2.2 en Samsung 6S
  • Libgdx: SpriteBatch, shader de fragmentos en dispositivos Samsung Android funcionan incorrectamente
  • Samsung inhabilita paquetes
  • Antecedentes de los procesos de muerte al azar mientras la aplicación se está ejecutando en Samsung S3
  • La actividad no se reproducirá al azar, muestra sólo la pantalla en blanco en Samsung
  • Cámara: la función setDisplayOrientation no funciona para Samsung Galaxy ACE con Android 2.3.6
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.