前言

由于业务需要, 需要代码控制飞行模式的开启和关闭, 百度了一圈发现, 大部分的代码都是android4.2的上面可以用, 但是对于现在的android6.0, 7.0, 8.0都不能用,  因为只有系统应用才能有这个权限.   那么问题来了, 如果我非要用代码来控制飞行模式, 怎么办呢? 猿曰: 只要智商不滑坡, 方法总比困难多.

1.通过广播(无效,需要配置权限,但是配置的权限只有系统应用才能用)

private void setAirPlaneMode(Context context, boolean enable) {

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.JELLY_BEAN) {

Settings.System.putInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enable ? 1 : 0);

} else {

Settings.Global.putInt(context.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0);

}

Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);

intent.putExtra("state", enable);

context.sendBroadcast(intent);

}

2.通过adb方式(亲测有效)

private final static String COMMAND_AIRPLANE_ON = "settings put global airplane_mode_on 1 \n " +

"am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true\n ";

private final static String COMMAND_AIRPLANE_OFF = "settings put global airplane_mode_on 0 \n" +

" am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false\n ";

private final static String COMMAND_SU = "su";

//设置飞行模式

public void setAirplaneModeOn(boolean isEnable) {

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {

Settings.System.putInt(getContentResolver(),

Settings.System.AIRPLANE_MODE_ON, isEnable ? 1 : 0);

Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);

intent.putExtra("state", isEnable);

sendBroadcast(intent);

} else {//4.2或4.2以上

if (isEnable){

writeCmd(COMMAND_AIRPLANE_ON);

}else {

writeCmd(COMMAND_AIRPLANE_OFF);

}

}

}

//写入shell命令

public static void writeCmd(String command){

try{

Process su = Runtime.getRuntime().exec(COMMAND_SU);

DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

outputStream.writeBytes(command);

outputStream.flush();

outputStream.writeBytes("exit\n");

outputStream.flush();

try {

su.waitFor();

} catch (Exception e) {

e.printStackTrace();

}

outputStream.close();

}catch(Exception e){

e.printStackTrace();

}

}

这种方式如果你是android4.2之前的版本,可以直接用,  如果是之后的版本, 那就需要用adb命令了,  那你如果要用adb命令, 你的手机就需要获取root权限(自行百度root权限获取), 当你运行到写入adb命令的代码的时候,  手机就会自动弹窗提示是否授予root权限.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐