当前位置: 首页 > news >正文

高通Android 12/13实现USB拔出关机功能

思路流程

1、监听广播->接受USB断开或者USB不充电广播->执行关机逻辑

涉及类 UsbManager/UsbDeviceManager

\frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java

\frameworks\base\services\com\android\hardware\usb\UsbManager.java

2、自定义系统服务Service接收Intent.ACTION_POWER_DISCONNECTED广播代码逻辑

mContentResolver = mContext.getContentResolver();/**mUsbReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Log.e("ZM","Receiver USBMode SHUTDOWN BroadcastReceiver Action="+intent.getAction());if (Intent.ACTION_POWER_DISCONNECTED.equals(intent.getAction()) || UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {Log.e("ZM","Receiver USBMode SHUTDOWN BroadcastReceiver");handleUsbDisconnected();}}};**/IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_POWER_DISCONNECTED);mContext.registerReceiver(mUsbReceiver, filter);

3、 handleUsbDisconnected()具体实现逻辑如下所示

private void handleUsbDisconnected() {int usbPlugShutdown = Settings.Global.getInt(mContentResolver, USB_PLUG_SHUTDOWN_KEY, 0);Log.e("handleUsbDisconnected","usbplugShutdown="+usbPlugShutdown);if(usbPlugShutdown == 1 ){Log.e("handleUsbDisconnected","device shutdown");shutdown();			   }}

4、设置USB拔出关机模式 代码如下图所示

  /*** 设置USB模式** @param mode*/public void setUSBMode(int mode) {//isSettingUsbMode = true; // 设置完成后将标志恢复为 falseUsbManager mUsbManager = (UsbManager) mContext.getSystemService(UsbManager.class);if(mUsbManager != null){Log.e("ZM","=========setUSBMode============="+mode);mUsbManager.setCurrentFunctions((long) mode);// Log.e("tian getUSBMode::::::::::" + String.valueOf(mUsbManager.getCurrentFunctions()));//isSettingUsbMode = false; // 设置完成后将标志恢复为 false}}

5、获取USB拔出关机模式状态 代码如下图所示

/*** 获取USB模式** @return*/public int getUSBMode() {UsbManager mUsbManager = (UsbManager) mContext.getSystemService(UsbManager.class);if(mUsbManager != null){Log.e("ZM","=========getUSBMode============="+(int) mUsbManager.getCurrentFunctions());return (int) mUsbManager.getCurrentFunctions();}return 0;}

6、设置USB拔出关机和不关机adb指令 

adb shell settings put global usb_plug_shutdown 0 //设置USB拔出不关机db shell settings put global usb_plug_shutdown  1 //设置USB拔出关机adb shell settings get global usb_plug_shutdown 获取USB拔出状态值

7、感兴趣可以去了解USB模式 UsbDeviceManager 打印 mCurrentFunctions值

  protected void updateUsbStateBroadcastIfNeeded(long functions) {// send a sticky broadcast containing current USB stateIntent intent = new Intent(UsbManager.ACTION_USB_STATE);intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND| Intent.FLAG_RECEIVER_FOREGROUND);intent.putExtra(UsbManager.USB_CONNECTED, mConnected);//zm fixSlog.d(TAG, "ZM skip updateUsbStateBroadcastIfNeeded " + mConnected +"mCurrentFunctions="+(int)mCurrentFunctions);intent.putExtra(UsbManager.USB_HOST_CONNECTED, mHostConnected);intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured);intent.putExtra(UsbManager.USB_DATA_UNLOCKED,isUsbTransferAllowed() && isUsbDataTransferActive(mCurrentFunctions));long remainingFunctions = functions;while (remainingFunctions != 0) {intent.putExtra(UsbManager.usbFunctionsToString(Long.highestOneBit(remainingFunctions)), true);remainingFunctions -= Long.highestOneBit(remainingFunctions);}// send broadcast intent only if the USB state has changedif (!isUsbStateChanged(intent)) {if (DEBUG) {Slog.d(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras());}return;}if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " extras: " + intent.getExtras());sendStickyBroadcast(intent);mBroadcastedIntent = intent;}

8、到这里结束了,转载请注明出处高通Android 12/13实现USB拔出关机功能-CSDN博客,谢谢!

相关文章:

  • 了解CSS中的link和@import引入CSS的区别
  • Linux搭建PHP下的RabbitMQ环境(php-amqp/rabbitmq-c/erlang)
  • 如何管理和维护组件库?
  • WPF实现简单的3D图形
  • Android ViewPager和ViewPager2的区别
  • jenkins插件之plot
  • TypeScript 在前端开发中的应用
  • 品牌舆情监测系统是什么?怎么监测?
  • Hbase 面试题(七)
  • PDF编辑流程,另附5款好用的PDF编辑器
  • 2024.5.29晚训参考代码
  • 解析《动物园规则怪谈》【逻辑】
  • ffmpeg.dll在哪个文件夹?怎么快速的修复ffmpeg.dll文件的丢失
  • vue2实现将el-table表格数据导出为长图片
  • Qt富文本语法高亮
  • 【5+】跨webview多页面 触发事件(二)
  • 【面试系列】之二:关于js原型
  • css布局,左右固定中间自适应实现
  • E-HPC支持多队列管理和自动伸缩
  • EventListener原理
  • Hibernate【inverse和cascade属性】知识要点
  • Logstash 参考指南(目录)
  • PHP变量
  • php中curl和soap方式请求服务超时问题
  • Python爬虫--- 1.3 BS4库的解析器
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 工作中总结前端开发流程--vue项目
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于for循环的简单归纳
  • 力扣(LeetCode)56
  • 巧用 TypeScript (一)
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我感觉这是史上最牛的防sql注入方法类
  • No resource identifier found for attribute,RxJava之zip操作符
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (30)数组元素和与数字和的绝对差
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (补)B+树一些思想
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)一些感悟
  • ***监测系统的构建(chkrootkit )
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [20170728]oracle保留字.txt
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)