• 高通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广播代码逻辑

    1. mContentResolver = mContext.getContentResolver();
    2. /**mUsbReceiver = new BroadcastReceiver() {
    3. @Override
    4. public void onReceive(Context context, Intent intent) {
    5. Log.e("ZM","Receiver USBMode SHUTDOWN BroadcastReceiver Action="+intent.getAction());
    6. if (Intent.ACTION_POWER_DISCONNECTED.equals(intent.getAction()) || UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())) {
    7. Log.e("ZM","Receiver USBMode SHUTDOWN BroadcastReceiver");
    8. handleUsbDisconnected();
    9. }
    10. }
    11. };**/
    12. IntentFilter filter = new IntentFilter();
    13. filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
    14. mContext.registerReceiver(mUsbReceiver, filter);

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

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

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

    1. /**
    2. * 设置USB模式
    3. *
    4. * @param mode
    5. */
    6. public void setUSBMode(int mode) {
    7. //isSettingUsbMode = true; // 设置完成后将标志恢复为 false
    8. UsbManager mUsbManager = (UsbManager) mContext.getSystemService(UsbManager.class);
    9. if(mUsbManager != null){
    10. Log.e("ZM","=========setUSBMode============="+mode);
    11. mUsbManager.setCurrentFunctions((long) mode);
    12. // Log.e("tian getUSBMode::::::::::" + String.valueOf(mUsbManager.getCurrentFunctions()));
    13. //isSettingUsbMode = false; // 设置完成后将标志恢复为 false
    14. }
    15. }

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

    1. /**
    2. * 获取USB模式
    3. *
    4. * @return
    5. */
    6. public int getUSBMode() {
    7. UsbManager mUsbManager = (UsbManager) mContext.getSystemService(UsbManager.class);
    8. if(mUsbManager != null){
    9. Log.e("ZM","=========getUSBMode============="+(int) mUsbManager.getCurrentFunctions());
    10. return (int) mUsbManager.getCurrentFunctions();
    11. }
    12. return 0;
    13. }

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

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

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

    1. protected void updateUsbStateBroadcastIfNeeded(long functions) {
    2. // send a sticky broadcast containing current USB state
    3. Intent intent = new Intent(UsbManager.ACTION_USB_STATE);
    4. intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING
    5. | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
    6. | Intent.FLAG_RECEIVER_FOREGROUND);
    7. intent.putExtra(UsbManager.USB_CONNECTED, mConnected);
    8. //zm fix
    9. Slog.d(TAG, "ZM skip updateUsbStateBroadcastIfNeeded " + mConnected +"mCurrentFunctions="+(int)mCurrentFunctions);
    10. intent.putExtra(UsbManager.USB_HOST_CONNECTED, mHostConnected);
    11. intent.putExtra(UsbManager.USB_CONFIGURED, mConfigured);
    12. intent.putExtra(UsbManager.USB_DATA_UNLOCKED,
    13. isUsbTransferAllowed() && isUsbDataTransferActive(mCurrentFunctions));
    14. long remainingFunctions = functions;
    15. while (remainingFunctions != 0) {
    16. intent.putExtra(UsbManager.usbFunctionsToString(
    17. Long.highestOneBit(remainingFunctions)), true);
    18. remainingFunctions -= Long.highestOneBit(remainingFunctions);
    19. }
    20. // send broadcast intent only if the USB state has changed
    21. if (!isUsbStateChanged(intent)) {
    22. if (DEBUG) {
    23. Slog.d(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras());
    24. }
    25. return;
    26. }
    27. if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " extras: " + intent.getExtras());
    28. sendStickyBroadcast(intent);
    29. mBroadcastedIntent = intent;
    30. }

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

  • 相关阅读:
    【C++】AVL树
    WebService总结
    Django项目之图书管理系统
    精曲的竖曲线4800计算程序,可以计算直线与竖曲线通杀
    Windows虚拟机访问网页证书错误问题
    PostgreSQL之数据类型及开发技巧
    springboot项目启动失败,不打印报错详细信息(启动打印日记问题)
    Linux inotify 文件监控
    【微服务】SpringBoot启动流程注册FeignClient
    Html5+Css3第一讲:html5+Css3基础(2)
  • 原文地址:https://blog.csdn.net/qq_15950325/article/details/139356895