Android 以编程方式在所有API级别上启用飞机模式

Android 以编程方式在所有API级别上启用飞机模式,android,Android,如何通过单击按钮以编程方式启用/禁用飞机模式? 我试过这个 // read the airplane mode setting boolean isEnabled = Settings.System.getInt( getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) == 1; // toggle airplane mode Settings.System.putInt( getContentResolver(

如何通过单击按钮以编程方式启用/禁用飞机模式? 我试过这个

// read the airplane mode setting
  boolean isEnabled = Settings.System.getInt(
  getContentResolver(), 
  Settings.System.AIRPLANE_MODE_ON, 0) == 1;

// toggle airplane mode
Settings.System.putInt(
  getContentResolver(),
  Settings.System.AIRPLANE_MODE_ON, isEnabled ? 0 : 1);

// Post an intent to reload
Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", !isEnabled);
sendBroadcast(intent);
但我得到错误“系统无法解析或不是字段”,因为它需要API 16或更高版本

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

是否有在所有api级别上都有效的工作方式?

Main

 package com.example.tutorial;
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Settings;
 import android.provider.Settings.Global;
 import android.view.View;
 import android.widget.Toast;

 public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 }

 @SuppressLint("InlinedApi")
 private static boolean isAirplaneModeOn(Context context) {

 return Settings.System.getInt(context.getContentResolver(),
 Global.AIRPLANE_MODE_ON, 0) != 0;

 }

 @SuppressLint("NewApi")
 public void airplaneModeOn(View view) {
 try {

 android.provider.Settings.System.putInt(getContentResolver(),
 Global.AIRPLANE_MODE_ON,
 isAirplaneModeOn(getApplicationContext()) ? 0 : 1);

 Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
 intent.putExtra("state", !isAirplaneModeOn(getApplicationContext()));
 sendBroadcast(intent);
 } catch (Exception e) {
 Toast.makeText(this, "Exception occured during Airplane Mode ON", Toast.LENGTH_LONG)
 .show();
 }
 }
 }
Main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Toggle"
        android:onClick="airplaneModeOn" />

</RelativeLayout>

Manifest.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/toggleButton1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="Toggle"
        android:onClick="airplaneModeOn" />

</RelativeLayout>

公共类MainActivity扩展了AppCompatActivity{
私有静态最终字符串标记=“AirplaneModeActivity”;
专用最终字符串命令\u FLIGHT\u MODE\u 1=“设置打开全局飞机模式”;
私有最终字符串命令\u FLIGHT\u MODE\u 2=“am广播-a android.intent.action.FLIGHT\u MODE--ez state”;
ToggleButton toggleBtn;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toggleBtn=(ToggleButton)findviewbyd(R.id.toggle\u btn);
toggleBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
setFlightMode(MainActivity.this);
}
public void setFlightMode(上下文){
if(Build.VERSION.SDK\u INT>Build.VERSION\u code.JELLY\u BEAN){
//API 17及以后。
如果(被引导(上下文)){
int enabled=isFlightModeEnabled(上下文)?0:1;
//使用su命令设置飞机/飞行模式。
字符串命令=命令飞行模式1+“”+已启用;
executeCommandWithoutWait(上下文“-c”,命令);
命令=命令飞行模式2+“”+已启用;
executeCommandWithoutWait(上下文“-c”,命令);
}否则{
试一试{
//无root权限,仅显示飞机/飞行模式设置屏幕。
意向意向=新意向(设置、动作、飞机、模式、设置);
intent.addFlags(intent.FLAG\u活动\u新任务);
背景。开始触觉(意图);
}捕获(ActivityNotFounde异常){
Log.e(标记,“由于:“+e.fillInStackTrace()”,未找到设置屏幕);
}
}
}否则{
//API 16及更早版本。
布尔启用=isFlightModeEnabled(上下文);
Settings.System.putInt(context.getContentResolver(),Settings.System.airpair\u MODE\u打开,已启用?0:1);
意向意向=新意向(意向、行动、飞机、模式改变);
intent.putExtra(“状态”!已启用);
发送广播(意图);
}
}
私有布尔值被引导(上下文){
//从构建信息获取
String buildTags=android.os.Build.TAGS;
if(buildTags!=null&&buildTags.contains(“测试键”)){
返回true;
}
//检查是否存在/system/app/Superuser.apk
试一试{
File File=新文件(“/system/app/Superuser.apk”);
if(file.exists()){
返回true;
}
}捕获(异常e1){
//忽略
}
//尝试执行命令
返回canExecuteCommand(“/system/xbin/which su”)
||canExecuteCommand(“/system/bin/which su”)| | canExecuteCommand(“which su”);
}
//在系统上执行命令
私有布尔canExecuteCommand(字符串命令){
布尔运算成功执行;
试一试{
Runtime.getRuntime().exec(命令);
ExecutedSuccessfully=true;
}捕获(例外e){
ExecutedSuccessfully=false;
}
返回成功执行;
}
@SuppressLint(“新API”)
@抑制警告(“弃用”)
专用布尔值isFlightModeEnabled(上下文){
布尔模式=假;
if(Build.VERSION.SDK\u INT>Build.VERSION\u code.JELLY\u BEAN){
//API 17及以后
mode=Settings.Global.getInt(context.getContentResolver(),Settings.Global.airpaire_mode_ON,0)==1;
}否则{
//API 16及更早版本。
mode=Settings.System.getInt(context.getContentResolver(),Settings.System.airpaire\u mode\u ON,0)==1;
}
返回模式;
}
私有void executecommand without wait(上下文上下文、字符串选项、字符串命令){
布尔成功=假;
字符串su=“su”;
对于(int i=0;i<3;i++){
//“su”命令已成功执行。
如果(成功){
//停止执行下面的替代su命令。
打破
}
如果(i==1){
su=“/system/xbin/su”;
}else如果(i==2){
su=“/system/bin/su”;
}
试一试{
//执行命令
Runtime.getRuntime().exec(新字符串[]{su,option,command});
}捕获(IOE异常){
Log.e(标记“su命令因“+e.fillInStackTrace()”而失败);
}
}
//布尔值isEnabled=Settings.System.getInt(this.getContentResolver(),Settings.System.player_MODE_ON,0)==1;
Settings.Global.putInt(context.getContentResolver(),Settings.Global.airpaire_MODE_ON,setFlightMode(context);?0:1);
}
});

此解决方案不起作用。它给出错误:权限拒绝:不允许从pid=9263,uid=10088发送广播android.intent.action.Planet\u模式