在某些开发场景中可能需要实现控制飞行模式的方法,这里列举几个控制飞行模式开关的思路。

1、通过adb命令

adb命令的方式是通过调用Settings的接口,可以在命令行窗口下使用adb命令adb shell settings put global airplane_mode_on 1开启飞行模式,通过adb shell settings put global airplane_mode_on 0关闭飞行模式。在应用中可以通过Runtime类模拟adb shell的运行环境,使用adb shell的命令运行相应的功能。

具体实现代码如下:

private void setAirPlaneMode(boolean enable) {

int mode = enable ? 1 : 0;

String cmd = "settings put global airplane_mode_on " + mode;

try {

Runtime.getRuntime().exec(cmd);

} catch (IOException e) {

e.printStackTrace();

}

}

2、通过广播

这种方式是通过发生系统广播,通过广播处理控制飞行模式。在Android4.2即API Level > 17以后的版本,Settings.System的属性迁移到了Settings.Global下,所以如果只调用Settings.System下的AIRPLANE_MODE_ON并不能控制飞行模式的开启与关闭。

具体实现代码如下:

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);

}

3、通过TelephonyManager

在TelephonyManager的源码(/frameworks/base/telephony/java/android/telephony/TelephonyManager.java)里面,有如下一个方法:

/**

* @hide

*/

@SystemApi

@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)

public boolean setRadio(boolean turnOn) {

try {

ITelephony telephony = getITelephony();

if (telephony != null)

return telephony.setRadio(turnOn);

} catch (RemoteException e) {

Log.e(TAG, "Error calling ITelephony#setRadio", e);

}

return false;

}

这是一个系统隐藏的系统API,需要权限android.Manifest.permission.MODIFY_PHONE_STATE,使用该方法需要在AndroidManifest.xml里面声明,同时这也是一个System App才可以调用的方法。

该方法的作用是去控制radio层的开关,也就是通过控制modem的开关达到飞行模式的作用,在参数为true的时候还需要调用另外一个系统的API:

/**

* @hide

*/

@SystemApi

@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)

public void toggleRadioOnOff() {

try {

ITelephony telephony = getITelephony();

if (telephony != null)

telephony.toggleRadioOnOff();

} catch (RemoteException e) {

Log.e(TAG, "Error calling ITelephony#toggleRadioOnOff", e);

}

}

关于setRadio和toggleRadioOnOff 方法的最终调用可以通过源码去跟踪,这是只说具体调用。源码可以通过AndroidXRef地址访问搜索。

具体实现代码如下:

private void setAirPlaneModeByRadio(boolean enable) {

try {

Class> telephonyManager = Class.forName("android.telephony.TelephonyManager");

Method setRadio = telephonyManager.getMethod("setRadio", boolean.class);

setRadio.invoke(telephonyManager.getMethod("getDefault").invoke(null), enable);

if (enable) {

Method toggleRadioOnOff = telephonyManager.getMethod("toggleRadioOnOff");

toggleRadioOnOff.invoke(telephonyManager.getMethod("getDefault").invoke(null));

}

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

在自测中,adb的方式可以达到控制飞行模式设置界面下的开关,但是功能并没有实现;通过广播的方式可以很好实现控制飞行模式的开关;第三种方式需要在System App下运行,测试时调用出现了异常,具体问题没有跟踪。

android 广播 飞行模式,Android 开启飞行模式的几种方式相关推荐

  1. Android:销毁所有的Activity退出应用程序几种方式

    Android:销毁所有的Activity退出应用程序几种方式 author:DRC工作室 我们都知道,Activity是存放在栈中.在默认的情况下(standard)Activity在栈中是以先进后 ...

  2. android sqlite使用之模糊查询数据库数据的三种方式

    android sqlite使用之模糊查询数据库数据的三种方式 android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sql ...

  3. android儿童模式,miui7儿童模式如何开启?儿童模式开启及使用方法总结

    8月13日下午,小米秋季新品发布会在北京国家会议中心如期举行,雷军在此次发布会上正式公布了全新的MIUI 7.,此外MIUI 7还新加入了"儿童模式",可以设置允许开启的应用,并自 ...

  4. android广播intent原理,Android中BroadcastReceiver详解

    BroadcastReceiver是什么? Android app可以发送广播也可以接收系统或者其它app发送的广播,是发送/订阅的设计模式.这些广播被发送当重要的事件发生的时候.例如,安卓系统发送广 ...

  5. android 广播解绑,Android四大组件之BroadCast

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Android四大组件之BroadCast 一.广播概述 Android应用可以从Android系统和其他Android ...

  6. android广播面试题,Android相关面试题

    面试过程中遇到的题集,都会摘要记录下来 一,Java部分 1.什么是反射? 2.反射的实现原理是什么? 3.Java线程sleep join yield wait notify notifyAll 4 ...

  7. oracle存档模式,Oracle开启归档模式并设置RMAN自动备份策略

    title: Oracle开启归档模式并设置RMAN自动备份策略 categories: 数据库 tags: - Oracle - RMAN timezone: Asia/Shanghai date: ...

  8. android 广播唤醒应用,Android通过广播实现灭屏和唤醒

    1.要实现灭屏和唤醒,需要在Manifest文件添加如下权限: 2.以下是封装的一个工具类,实现屏幕唤醒和熄灭 package testWakeAndLock; import android.cont ...

  9. ES6/04/严格模式,开启严格模式,严格模式与普通模式对比发生了那些变化,高阶函数,闭包函数,递归函数,递归实例(1,阶乘,2,斐波那契数列,3,根据id返回对应数据对象),浅拷贝和深拷贝

    函数 开启严格模式 1,用 " use strict"; 语句为整个脚本(即:script标签)开启严格模式;在<script>标记的第一行写上"use st ...

  10. android广播 有序 无序,Android中的有序和无序广播浅析

    BroadcastReceiver所对应的广播分两类:无序广播和有序广播. 无序广播即为我们平时经常使用的广播,其主要是通过public abstract void sendBroadcast (In ...

最新文章

  1. 收回误删并清除了回收站的文档
  2. UA SIE545 优化理论基础4 对偶理论简介6 求解对偶问题的梯度算法
  3. rtos与linux软件开发,实时Linux和RTOS的基本特性及技术进行比较
  4. java 采集rtsp_通过Java程序调用RTSP拉流协议视频平台EasyNVR程序接口步骤概览
  5. boost::lexical_cast模块将创建一个to_long_double方法,将 Boost.Variant 的值转换为long double
  6. 搜集到的数学分析例题(不断更新)
  7. OSError: [Errno 22] Invalid argument:**
  8. macos 安装scala_如何在MacOS上安装Scala和Apache Spark
  9. 4、组件注册-自定义TypeFilter指定过滤规则
  10. 在virtualbox上安装64位centos7和virtual增强工具以及设置共享文件夹
  11. python照片过人脸_python图片人脸检测
  12. 【IT之路】LoadRunner系列-Win7 64bit下搭建Loadrunner11破解版
  13. 免费实用的录屏工具!支持全屏、特定窗口、选定区域录制,支持添加水印、嵌入摄像头!
  14. 新手入门|计算机科普
  15. 英语情景对话计算机专业,英语情景对话 寒假生活 5人
  16. 腾讯云TRTC接入测试以及状态同步功能重点验证
  17. 模板引擎Beet的6大创新点
  18. Java实现CSV文件的读写
  19. springMVC的生命周期
  20. 「实验性讲稿」载谭 Binomial Sums 详解

热门文章

  1. RDS PG如何安装DTS需要的增量迁移插件?
  2. JPA的常用操作和配置总结
  3. System Center 2012 R2 CM系列之配置configuration manager防火墙设置
  4. 前后端分离状态下的工作与交互
  5. nginx + lua 构建网站防护waf(一)
  6. java模拟面试题目_JAVA模拟面试题库
  7. 创建data文件_剑指信奥 | C++ 之文件操作
  8. nvm nodejs npm快速安装
  9. OpenCV-Android平台应用实战 - 银行卡卡号识别(01、环境搭建)
  10. keras中使用ImageDataGenerator对MINST数据集数据增强