当前位置: 首页> 娱乐> 八卦 > 高通Android 12/13实现USB拔出关机功能

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

时间:2025/7/18 3:48:24来源:https://blog.csdn.net/qq_15950325/article/details/139356895 浏览次数:0次

思路流程

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博客,谢谢!

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: