2013-04-22 71 views
8

我正嘗試在Android 4.2.2中設置Nexus 4中的飛行模式。 我知道這是不可能的,因爲AIRPLANE_MODE_ON被移動到Global system settings,它只是一個讀取選項。Jelly Bean中的飛行模式

是否有任何其他方式來做類似的事情,我的意思是禁用收音機?我可以禁用藍牙,wifi和互聯網連接,但電話網絡仍然有效。

可以創建一個庫,NDK完全禁用網絡?

編輯:我曾嘗試與java.lang.reflect使得這種方法:

@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); 
    } 
} 

正如你可以看到我用替換法Settings.System.putString(resolver, name, value);JELLY_BEAN_MR1但是,當然,我得到一個SecurityException,因爲我的應用程序是不是系統應用程序。這是跟蹤:

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) 

如果我使用<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>我得到的錯誤Permission is only granted to system apps。我正在檢查SDK源(在跟蹤文件中)試圖找到一種方法來設置沒有此權限的飛行模式,但我沒有取得任何成功。

+0

你會發現這個問題的答案已經在這個網站!嘗試搜索「4.2飛行模式」。基本上,它不再可能將此設置從4.2更改爲,除非您的應用程序具有根目錄(有解釋如何執行此操作的答案)。 – shadrx 2013-04-22 23:20:31

+0

感謝您的回答。我實際上並沒有在尋找如何改變這個設置(飛行模式),無論如何,我在Stackoverflow中更努力地搜索。我正在尋找如何以不同的方式做類似的事情(如果可能的話)。對於我的應用程序,使用root權限不是一個選項。 – Freefri 2013-04-22 23:31:34

回答

5

從4.2.2開始,您不能切換飛行模式,因爲它是隻讀的。

您有兩種選擇。

  1. 使您的應用程序成爲System應用程序。即Root電話,將您的APK推送到/system/app並從那裏安裝。這將使您能夠切換飛行模式。
  2. 使用Reflection可以獲取切換飛行模式的Android系統函數調用。

您應該獲取有關如何使用Reflection獲取暴露API的代碼示例,否則不會通過SDK向開發人員公開開發人員。

+0

你能給我一些關於如何使用Reflection來獲得Android系統函數調用的參考嗎? – Freefri 2013-04-23 10:17:03

+0

http://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful解釋了一下。我相信你會發現更多的資源,因爲它是一種常用的方法。 – 2013-04-23 17:01:36

+0

謝謝,但我無法完成工作。我編輯了這個問題。 – Freefri 2013-04-27 19:22:39