如何在Android 4.2上通过编程实现飞行模式的开启和关闭?

31

有没有一种方法可以在Android 4.2上禁用或启用飞行模式?

我使用的代码仅适用于早期版本的Android:

android.provider.Settings.System.putInt(
    c.getContentResolver(),   
    android.provider.Settings.System.AIRPLANE_MODE_ON, enable ? 0 : 1
);
4个回答

44

在已经获取root权限的设备上,存在一个简单的解决方法。

可以使用以下root shell命令启用飞行模式:

settings put global airplane_mode_on 1
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true

要禁用飞行模式,可以使用这些root shell命令:

settings put global airplane_mode_on 0
am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false

参考这里获取的信息。

免责声明:本信息按“原样”提供,不附带任何形式的保证。


暴露的框架可能需要用户通过计算机安装其他东西到他们的手机上。 - Edison
你的链接无法访问! - Saeed

24

除非使用由固件签名密钥签名的应用程序,或者安装在系统分区上(通常是由已root设备的用户安装),否则将不再可能实现此操作。


2
http://commonsware.com/blog/2012/11/20/miscellaneous-android-4p2-regressions.html - CommonsWare
天啊...为什么每个人都非得要 root 呢? - gumuruh

16

根据官方Android 4.2 API文档,一些由Settings.System定义的设备设置现在是只读的。如果您的应用程序尝试更改已移动到Settings.GlobalSettings.System中定义的设置,则在运行Android 4.2及更高版本时,写操作将会静默失败。即使您的android:targetSdkVersionandroid:minSdkVersion的值低于17,您的应用程序也无法在运行Android 4.2及更高版本时修改已转移到Settings.Global的设置。

但是,如果您是操作系统开发人员,则可以在设置这些权限时写入它们。

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

然后写和阅读,

// To Write
Settings.Global.putString(getContentResolver(), "airplane_mode_on", "1");

// To Read
String result = Settings.Global.getString(getContentResolver(), Settings.Global.AIRPLANE_MODE_ON);
Toast.makeText(this, "result:"+result, Toast.LENGTH_SHORT).show();

嗯,但这个方法只在Android 4.2及以上版本中添加。 - Sruit A.Suk
1
哦,是的。它不能。只有当您授予android.permission.WRITE_SECURE_SETTINGS权限时才可以。这意味着您必须是一个操作系统开发人员,而我不是,所以我没有注意到它。 - Sruit A.Suk
@ToonSuperLove,我尝试了你的代码片段,但在添加WRITE_SECURE_SETTINGS权限到清单文件时遇到了问题。让我指导一下如何实现禁用飞行模式的结果。 - Senthil Mg
2
什么是操作系统开发者?任何拥有root手机的人都可以吗?我该如何让它工作? - Zaz
什么?只支持操作系统开发...?天哪...我感到在Android开发中我们迄今为止取得的一些限制是一场噩梦。 - gumuruh
显示剩余3条评论

0

对于KitKat,您需要在清单文件中添加android:sharedUserId="android.uid.system"

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.airplanesetting"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="android.uid.system" >

2
当我尝试安装包含此内容的apk时,从eclipse中出现“安装错误:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE”。 - CompEng88
2
除非您还使用系统的密钥库进行签名,否则更改sharedUserId将无效。 - Blundell

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