Próbuję ustawić tryb samolotowy na Nexusie 4 z Androidem 4.2.2. Wiem, że nie jest to możliwe, ponieważ AIRPLANE_MODE_ON został przeniesiony do Global system settings i jest to tylko opcja odczytu.Tryb samolotowy w Jelly Beanie
Czy jest jakikolwiek inny sposób na zrobienie czegoś podobnego, mam na myśli wyłączenie radia? Mogę wyłączyć Bluetooth, Wi-Fi i połączenie z Internetem, ale sieć połączeń telefonicznych jest nadal aktywna.
Może być możliwe utworzenie biblioteki z NDK, aby całkowicie wyłączyć sieć?
EDIT: Próbowałem z java.lang.reflect
czyni tę metodę:
@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);
}
}
Jak widać zastąpić metodę Settings.System.putString(resolver, name, value);
nad JELLY_BEAN_MR1
ale, oczywiście, jestem coraz SecurityException
ponieważ moja aplikacja nie jest aplikacja systemowa. To jest ślad:
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)
Jeśli używam <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>
pojawia się błąd Permission is only granted to system apps
. Sprawdzałem źródła SDK (w plikach ze śledzenia), aby znaleźć sposób na ustawienie trybu samolotowego bez tego pozwolenia, ale nie odniosłem żadnego sukcesu.
Znajdziesz odpowiedź na to pytanie jest już na tej stronie! Spróbuj wyszukać "4.2 tryb samolotowy". Zasadniczo nie można już zmienić tego ustawienia z 4.2, chyba że aplikacja ma root (istnieją odpowiedzi wyjaśniające, jak to zrobić). – shadrx
Dziękuję za odpowiedź. W rzeczywistości nie szukam sposobu zmiany tego ustawienia (tryb samolotowy), w każdym razie szukam ciężej w Stackoverflow. Szukam, jak zrobić coś podobnego w inny sposób (jeśli to możliwe). W mojej aplikacji uprawnienia root nie są opcją. – Freefri