2013-04-22 15 views
8

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.

+0

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

+0

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

Odpowiedz

5

Od wersji 4.2.2 nie można przełączać trybu samolotowego w trybie tylko do odczytu.

Masz dwie opcje.

  1. Złóż wniosek aplikacji System. np. Root telefon, popchnij plik APK do /system/app i zainstaluj stamtąd. Umożliwi to przełączanie trybu samolotowego.
  2. Użyj Reflection, aby uzyskać wywołanie funkcji systemu Android, które przełącza tryb samolotowy.

Powinieneś otrzymać próbki kodu na temat korzystania z funkcji Odbicie, aby uzyskać interfejs API ekspozycji, w przeciwnym razie programista nie może go wyświetlić za pomocą SDK.

+0

Czy możesz podać mi jakieś informacje o tym, jak korzystać z Reflection, aby uzyskać wywołanie funkcji systemu Android? – Freefri

+0

http://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful to trochę wyjaśnia. Jestem pewien, że znajdziesz więcej zasobów, ponieważ jest to powszechnie stosowana metoda. –

+0

Dziękuję, ale nie mogłem sprawić, żeby działało. Zmieniłem to pytanie. – Freefri

Powiązane problemy