android - samsung - Modo avión en Jelly Bean
que significa el modo avion en celulares (1)
Estoy tratando de configurar el modo avión en un Nexus 4 con Android 4.2.2. Sé que no es posible ya que AIRPLANE_MODE_ON se movió a la configuración global del sistema y solo es una opción de lectura.
¿Hay alguna otra manera de hacer algo similar, me refiero a desactivar la radio? Puedo desactivar Bluetooth, wifi y conexión a Internet, pero la red de llamadas telefónicas aún está activa.
¿Podría ser posible crear una biblioteca con el NDK para desactivar completamente la red?
EDITAR : He intentado con java.lang.reflect
haciendo este método:
@SuppressLint("NewApi")
@SuppressWarnings("rawtypes")
private boolean putStringAirplaneMode() throws ClassNotFoundException,
NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
ContentResolver resolver = context.getContentResolver();
String name = Settings.Global.AIRPLANE_MODE_ON;
String value = (isEnabled() ? "1" : "0");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Log.v("AirplaneBatterySaver",
"Using reflection to change airplane mode");
// For JELLY_BEAN_MR1 use reflection. TODO test if works reflection
Class SystemProperties = android.provider.Settings.Global.class;
Class[] parameterTypes = new Class[3];
parameterTypes[0] = ContentResolver.class;
parameterTypes[1] = String.class;
parameterTypes[2] = String.class;
@SuppressWarnings("unchecked")
Method method = SystemProperties.getMethod("putString",
parameterTypes);
method.setAccessible(true);
return (Boolean) method.invoke(new Object(), resolver, name, value);
// return Settings.Global.putString(resolver, name, value);
} else {
Log.v("AirplaneBatterySaver",
"Using Settings.System to change airplane mode");
return Settings.System.putString(resolver, name, value);
}
}
Como puede ver, reemplazo el método Settings.System.putString(resolver, name, value);
sobre JELLY_BEAN_MR1
pero, por supuesto, recibo una SecurityException
porque mi aplicación no es una aplicación del sistema. Este es el rastro:
Caused by: java.lang.SecurityException: Permission denial: writing to secure
settings requires android.permission.WRITE_SECURE_SETTINGS
at android.os.Parcel.readException(Parcel.java:1425)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:574)
at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:777)
at android.provider.Settings$Global.putStringForUser(Settings.java:5421)
at android.provider.Settings$Global.putString(Settings.java:5411)
Si uso <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
obtengo el error El Permission is only granted to system apps
. Estaba revisando las fuentes del SDK (en los archivos del seguimiento) para tratar de encontrar una manera de configurar el modo avión sin este permiso, pero no tuve éxito.
A partir de 4.2.2, no se puede alternar el modo Avión, ya que ha sido de solo lectura.
Tienes dos opciones.
- Convierta su aplicación en una aplicación del
System
. es decir, rootee un teléfono, inserte su APK en/system/app
e instálelo desde allí. Esto le permitirá alternar el modo de avión. - Use
Reflection
para obtener la llamada a la función del sistema Android que activa el modo Avión.
Debería obtener ejemplos de código sobre cómo usar Reflection para obtener API de exposición que, de lo contrario, el desarrollador no estará expuesto a través del SDK.