果冻豆中的飞行模式
Posted
技术标签:
【中文标题】果冻豆中的飞行模式【英文标题】:Airplane mode in Jelly Bean 【发布时间】:2013-04-16 00:19:19 【问题描述】:我正在尝试在装有 android 4.2.2 的 Nexus 4 中设置飞行模式。 我知道这是不可能的,因为 AIRPLANE_MODE_ON 已移至 Global system settings,它只是一个读取选项。
有没有其他方法可以做类似的事情,我的意思是禁用收音机?我可以禁用蓝牙、wifi 和 Internet 连接,但电话网络仍处于活动状态。
是否可以使用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 权限(也有解释如何执行此操作的答案)。 感谢您的回答。我实际上并不是在寻找如何更改此设置(飞行模式),无论如何我在 *** 中更努力地搜索。我正在寻找如何以不同的方式做类似的事情(如果可能的话)。对于我的应用,不能使用 root 权限。 【参考方案1】:从 4.2.2 开始,您无法切换飞行模式,因为它一直是只读的。
你有两个选择。
-
使您的应用程序成为
System
应用程序。即 Root 手机,将您的 APK 推送到 /system/app
并从那里安装。这将使您能够切换飞行模式。
使用Reflection
获取切换飞行模式的Android 系统函数调用。
您应该获取有关如何使用反射获取曝光 API 的代码示例,否则不会通过 SDK 向开发人员公开。
【讨论】:
你能给我一些关于如何使用反射来获取Android系统函数调用的参考吗? ***.com/questions/37628/… 稍微解释一下。我相信你会找到更多的资源,因为它是一种常用的方法。 谢谢,但我没能成功。我已经编辑了问题。 看起来你做得不对。您将需要更多地搜索如何应用反射。 什么系统调用?我无法通过反射找到我需要调用的内容。以上是关于果冻豆中的飞行模式的主要内容,如果未能解决你的问题,请参考以下文章
sim7600ce 4G模块设置飞行模式后重启模块自动关闭飞行模式,这个怎么实现重启后还是飞行模式
电脑飞行模式怎么关闭,飞行模式灰色默认开启,WLAN选项消失。