Jelly Bean中的飞行模式

我正在尝试使用Android 4.2.2在Nexus 4中设置飞行模式。 我知道这是不可能的,因为AIRPLANE_MODE_ON被移动到全局系统设置 ,它只是一个读取选项。

有没有其他的方式来做类似的事情,我的意思是禁用收音机? 我可以禁用蓝牙,WiFi和互联网连接,但电话networking仍然活跃。

可以用NDK创build一个库来完全禁用networking?

编辑 :我已经尝试使用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); } } 

正如你所看到的,我replace了方法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来源(在跟踪文件中)试图find一种方法来设置没有这种权限的飞行模式,但我没有得到任何成功。

Solutions Collecting From Web of "Jelly Bean中的飞行模式"

从4.2.2开始,您不能切换飞行模式,因为它是只读模式。

你有两个select。

  1. 使你的应用程序成为System应用 即根电话,推你的APK到/system/app并从那里安装。 这将使您能够切换飞行模式。
  2. 使用Reflection来获取切换飞行模式的Android系统函数调用。

你应该得到关于如何使用reflection来获取暴露API的代码示例,否则不通过SDK暴露给开发者。