2011-12-22 18 views
5

Esto es para la versión Verizon LTE del Samsung Galaxy Nexus.Android 4.0 4G toggle

Tengo la tarea de escribir una pequeña aplicación que efectivamente deshabilitará/habilitará la capacidad 4G. Esto puede hacerse manualmente a través del settings > mobile network > network mode y eligiendo LTE/CDMA (4g activado) o CDMA (solo 3g).

No he intentado nada todavía porque el desarrollo de Android no es mi fuerte. Estoy buscando orientación ... ejemplos, ejemplos de código, etc. Supongo que debería ser casi un trazador de líneas, pero mi experiencia es que con el desarrollo de Android nada es tan simple como parece.

Cualquier ayuda será muy apreciada.

+0

yo sepa, las aplicaciones ordinarias del SDK de Android no pueden cambiar esto. – CommonsWare

+0

Ah, muy interesante. Espero que ese no sea el caso. Investigando ahora. Escuché que existe un widget para teléfonos HTC, lo que me lleva a creer que * se puede * hacer. –

+1

Si el widget de la aplicación en cuestión se envía con teléfonos HTC, esa no es una aplicación ordinaria de Android SDK. – CommonsWare

Respuesta

5

Hay una preferencia en la clase Settings.Secure que se oculta desde el SDK:

/** 
    * The preferred network mode 7 = Global 
    *        6 = EvDo only 
    *        5 = CDMA w/o EvDo 
    *        4 = CDMA/EvDo auto 
    *        3 = GSM/WCDMA auto 
    *        2 = WCDMA only 
    *        1 = GSM only 
    *        0 = GSM/WCDMA preferred 
    * @hide 
    */ 
    public static final String PREFERRED_NETWORK_MODE = 
      "preferred_network_mode"; 

Usted podría utilizar la reflexión sobre este o simplemente localizar la constante para su proyecto. El problema con esto es que no puede cambiar el valor de esta configuración (como con todas las configuraciones seguras), solo puede leerla. Los valores mencionados anteriormente no son los únicos posibles, en realidad hay algunos más ubicados en com.android.internal.telephony.RILConstants, que de nuevo se oculta del SDK y requeriría Reflection para acceder.

Hay otro método oculto en TelephonyManager, pero nuevamente es de solo lectura, no hay otro método para establecer esta constante. Esto dirá exactamente lo que quiere saber, si el dispositivo está ajustado en "LTE/CDMA" (LTE_ON_CDMA_TRUE) o "Sólo CDMA" (LTE_ON_CDMA_FALSE):

/** 
* Return if the current radio is LTE on CDMA. This 
* is a tri-state return value as for a period of time 
* the mode may be unknown. 
* 
* @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE} 
* or {@link Phone#LTE_ON_CDMA_TRUE} 
* 
* @hide 
*/ 
public int getLteOnCdmaMode() { 
    try { 
     return getITelephony().getLteOnCdmaMode(); 
    } catch (RemoteException ex) { 
     // Assume no ICC card if remote exception which shouldn't happen 
     return Phone.LTE_ON_CDMA_UNKNOWN; 
    } catch (NullPointerException ex) { 
     // This could happen before phone restarts due to crashing 
     return Phone.LTE_ON_CDMA_UNKNOWN; 
    } 
} 

De mi investigación no se podía hacer tal una aplicación sin acceso de root y usando algo como setprop desde la línea de comandos, pero incluso entonces puede necesitar reiniciar todo el proceso de telefonía para que esta configuración surta efecto.

Finalmente, si todavía está interesado, consulte com.android.phone.Settings para ver cómo el sistema maneja esta alternancia. Es bastante elaborado, y como mencioné requeriría permisos que una aplicación Android normal no se otorgaría.

2

También estoy interesado en cambiar la configuración de sólo WCDMA, WCDMA/LTE, ...

he encontrado la manera de cambiar Settings.secure. * Con privilegios de raíz que se muestra el siguiente.

new ExecuteAsRootBase() { 
     @Override 
     protected ArrayList<String> getCommandsToExecute() { 
      ArrayList<String> cmds = new ArrayList<String>(); 
      cmds.add("su -c 'chmod 755 "+mySqlite+"'"); 
      cmds.add("echo \"UPDATE secure SET value='"+ value +"' WHERE name='"+ key +"'; \" | "+mySqlite+" /data/data/com.android.providers.settings/databases/settings.db"); 
      //TODO: SQL injection can be done!!! 
      return cmds; 
     } 
    }.execute(); 

ExecuteAsRootBase se introduce here y mySqlite es "/data/data/"+context.getPackageName()+"/files/sqlite3" sqlite3, donde se pone de antemano.

Sin embargo, parece que tenemos que llamar a com.android.internal.telephony.Phone. setPreferredNetworkType() para la conmutación (WCDMA solo < => WCDMA/LTE) después de establecer Settings.secure.PREFERRED_NETWORK_MODE. Mi teléfono (incluso establece Settings.secure.PREFERRED_NETWORK_MODE = 2) conectado a la red LTE ...

+0

¿Alguna vez lo hiciste funcionar? Se ve prometedor – BriCo84