高通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() {
            @Override
            public 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; // 设置完成后将标志恢复为 false
        UsbManager 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 state
            Intent 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 fix
			Slog.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 changed
            if (!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博客,谢谢!

相关推荐

  1. Android 12/13实现USB关机功能

    2024-06-05 20:16:04       38 阅读
  2. Android OpenMAX(三)OMX组件实现基础

    2024-06-05 20:16:04       35 阅读
  3. Android 14.0 USB鼠标右键改成返回键的功能实现

    2024-06-05 20:16:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-05 20:16:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-05 20:16:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-05 20:16:04       82 阅读
  4. Python语言-面向对象

    2024-06-05 20:16:04       91 阅读

热门阅读

  1. git命令

    git命令

    2024-06-05 20:16:04      25 阅读
  2. IntelliJ IDEA安装

    2024-06-05 20:16:04       34 阅读
  3. mysql聚簇索引

    2024-06-05 20:16:04       25 阅读
  4. pnpm包管理器总结

    2024-06-05 20:16:04       28 阅读
  5. 计算机系统基础知识-经典题目

    2024-06-05 20:16:04       29 阅读