杏仁果冻中的飞行模式

8
我正在尝试在安装有Android 4.2.2的Nexus 4中设置飞行模式。 我知道这是不可能的,因为AIRPLANE_MODE_ON已经移到了全局系统设置中,而且它只是一个只读选项。
有没有其他方法可以做类似的事情,我的意思是禁用无线电?我可以禁用蓝牙、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源代码(在跟踪文件中的文件)以尝试找到一种在没有此权限的情况下设置飞行模式的方法,但我没有取得任何成功。

你会发现这个问题的答案已经在这个网站上了!尝试搜索“4.2飞行模式”。基本上,从4.2开始,除非你的应用程序具有root权限(也有解释如何做到这一点的答案),否则不再可能更改此设置。 - shadrx
谢谢您的回答。实际上我并不是在寻找如何更改这个设置(飞行模式),无论如何我在Stackoverflow上进行了更深入的搜索。我正在寻找以不同的方式(如果可能的话)完成类似操作的方法。对于我的应用程序,使用root权限不是一个选项。 - Freefri
1个回答

5
截至4.2.2版本,由于已变为只读模式,您无法切换飞行模式。
您有两个选项。
1. 将您的应用程序设置为“系统”应用程序。即,对手机进行Root操作,将您的APK推送到“/system/app”,然后从那里安装。这将使您能够切换飞行模式。
2. 使用“反射”获取Android系统函数调用,以切换飞行模式。
您应该获得代码示例,以使用反射获取开发人员未通过SDK公开的API。

请问您是否有任何关于如何使用反射来获取Android系统函数调用的参考资料? - Freefri
https://dev59.com/oXVD5IYBdhLWcg3wQZQg 解释了一些。我相信你会发现更多的资源,因为它是一个常用的方法。 - Royston Pinto
谢谢,但我没能让它工作。我已经编辑了问题。 - Freefri
看起来你做得不对。你需要再搜索一下反射的应用方法。 - Royston Pinto
什么是系统调用?我一直没有找到需要通过反射调用的内容来使其工作。 - Thom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接