2014-03-12 45 views
3

我想以編程方式設置飛行模式。權限拒絕:不允許發送廣播android.intent.action.AIRPLANE_MODE

Settings.System.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); 

Intent aeroPlaneIntent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
aeroPlaneIntent.putExtra("state", true); 
context.sendBroadcast(aeroPlaneIntent); 

設置Global.AIRPLANE_MODE_ON失敗,如果我檢查狀態則返回0(OFF)

試圖播放它會引發以下異常的意圖:

03-12 07:01:18.747: E/AndroidRuntime(1579): java.lang.RuntimeException: Unable to start receiver com.example.toggleaeroplanemode.AeroplaneModeReceiver: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.AIRPLANE_MODE from pid=1579, uid=10050 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2431) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ActivityThread.access$1500(ActivityThread.java:141) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1332) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.os.Looper.loop(Looper.java:137) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at java.lang.reflect.Method.invoke(Method.java:525) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at dalvik.system.NativeStart.main(Native Method) 
03-12 07:01:18.747: E/AndroidRuntime(1579): Caused by: java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.intent.action.AIRPLANE_MODE from pid=1579, uid=10050 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.os.Parcel.readException(Parcel.java:1431) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.os.Parcel.readException(Parcel.java:1385) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ActivityManagerProxy.broadcastIntent(ActivityManagerNative.java:2224) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ContextImpl.sendBroadcast(ContextImpl.java:1046) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:344) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.content.ContextWrapper.sendBroadcast(ContextWrapper.java:344) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at com.example.toggleaeroplanemode.AeroplaneModeReceiver.onReceive(AeroplaneModeReceiver.java:31) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2424) 
03-12 07:01:18.747: E/AndroidRuntime(1579):  ... 10 more 

有一種設置飛行模式ON/OFF的方法? 請幫助

+0

可能重複[關閉Android中的飛行模式](http://stackoverflow.com/questions/7066427/turn-off-airplane-mode-in-android) – CommonsWare

回答

3

對於一點信息:

使用此權限第一..

<uses-permission android:name="android.permission.WRITE_SETTINGS" />

進一步的信息:只要檢查該conversation

+1

請注意,只有安裝在系統分區上的應用程序(例如通過設備用戶的根源)或由簽署固件的簽名密鑰簽署的應用程序。普通SDK應用程序無法修改飛行模式的狀態。 – CommonsWare

+0

謝謝你的幫助。對不起,我有這個權限設置,我應該提到它。但是你指出的對話非常有幫助。它看起來像這樣的路徑將導致我無處,因爲Intent.ACTION_AIRPLANE_MODE_CHANGED是一個受保護的意圖。 – Mule

+8

在Android 5.0中,當我嘗試發送廣播(ACTION_AIRPLANE_MODE_CHANGED)時,出現安全異常。我把所有需要的權限和我的應用程序是一個系統應用程序。 – yasinkafadar

0

下面的測試,並在Android API驗證23模擬器;

需要的清單權限如下;

<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" tools:ignore="ProtectedPermissions"/> 

代碼如下;

boolean turnOnOffAirplaneMode(boolean isTurnOn) { 
    boolean result = true; 
    try { 
     Settings.Global.putInt(context.getContentResolver(), 
       Settings.Global.AIRPLANE_MODE_ON, isTurnOn ? 1 : 0); 
     // The below old code is now not necessary @ API Level 23 
     //Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
     //context.sendBroadcast(intent); 
    } catch (Exception e) { 
     result = false; 
    } 
    return result; 
} 

的APK應與上述工作平臺相關密鑰簽名。在模擬器測試中,APK使用Google Sign Keys簽名。密鑰取決於設備的OEM。

相關問題