果冻豆的飞行模式



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

有没有其他类似的方法,我的意思是禁用收音机?我可以关闭蓝牙,wifi和互联网连接,但电话网络仍然有效。

是否可以创建一个带有NDK的库来完全禁用网络?

EDIT:我已经尝试与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源(在跟踪文件中),试图找到一种方法来设置没有此许可的飞行模式,但我没有得到任何成功。

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

你有两个选择。

  1. 使您的应用程序成为System应用程序。例如,Root手机,将APK推送到/system/app并从那里安装。这将使您能够切换飞行模式。
  2. 使用Reflection获取切换飞行模式的Android系统函数调用

你应该获得关于如何使用Reflection来获得暴露API的代码示例,否则不会通过SDK向开发人员暴露。

相关内容

  • 没有找到相关文章

最新更新