Android M USB流程

Android M USB流程

在最新AndroidM上,由之前的USBSettings界面变换为了UsbModeChooserActivity界面,具体的显示样式是一个Diag,可以看oncreate方法。

 
UsbModeChooserActivity.java
builder.setSingleChoiceItems(items, getCurrentFunction(),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (!ActivityManager.isUserAMonkey()) {
setCurrentFunction(which);
}
dialog.dismiss();
UsbModeChooserActivity.this.finish();
}
});

在这里可以看到两个方法getCurrentFunction()和setCurrentFunction(which),作用分别是用来得到Item的index和设置function。具体的调用流程以后者来简单介绍下。
 
1.UsbModeChooserActivity -> setCurrentFunction()
2.UsbManager -> setCurrentFunction()
3.UsbService -> setCurrentFunction()
4.UsbDeviceManager -> setCurrentFunctions()
-> case MSG_SET_CURRENT_FUNCTIONS:
-> setEnabledFunctions()
-> trySetEnabledFunctions()
-> setUsbConfig()

以上就是和setCurrentFunction的具体流程,下面有一些应该注意的地方。
 
1.在步骤3中会调用到方法isSupportedCurrentFunction()
private static boolean isSupportedCurrentFunction(String function) {
if (function == null) return true;
switch (function) {
case UsbManager.USB_FUNCTION_NONE:
case UsbManager.USB_FUNCTION_AUDIO_SOURCE:
case UsbManager.USB_FUNCTION_MIDI:
case UsbManager.USB_FUNCTION_MTP:
case UsbManager.USB_FUNCTION_PTP:
case UsbManager.USB_FUNCTION_RNDIS:
return true;
}
return false;
}
所以如果你自己在UsbManager中定义了一些function,要用的话需要添加到这里才能够设置下去。

 
2.和之前Android L 上有所不同的是关于function:charging的设置,因为在M之前,原先在UsbManager
中就有function charging而现在点击charging传递下去的值是NONE。
private boolean trySetEnabledFunctions(String functions, boolean forceRestart) {
if (functions == null) {
functions = getDefaultFunctions();
}
functions = applyAdbFunction(functions);
functions = applyOemOverrideFunction(functions);
if (!mCurrentFunctions.equals(functions) || !mCurrentFunctionsApplied
|| forceRestart) {
Slog.i(TAG, "Setting USB config to " + functions);
mCurrentFunctions = functions;
mCurrentFunctionsApplied = false;
// Kick the USB stack to close existing connections.
setUsbConfig(UsbManager.USB_FUNCTION_NONE);
// Set the new USB configuration.
if (!setUsbConfig(functions)) {
Slog.e(TAG, "Failed to switch USB config to " + functions);
return false;
}
mCurrentFunctionsApplied = true;
}
return true;
}
在这里可以看到如果传递下来的function的值null时,function就会取默认值。这个值是“persist.sys.usb.config”的值。

 
3.setUsbConfig设置的属性是“sys.usb.config”的值,所以在M上运行会出现的问题是当你设置为MTP后,断开USB连接后再次连接USB时,依旧为默认的charge属性,原因是UEventObserver会监测到USB的state变化,变化时更新状态。
case MSG_UPDATE_STATE:
mConnected = (msg.arg1 == 1);
mConfigured = (msg.arg2 == 1);
if (!mConnected) {
// When a disconnect occurs, relock access to sensitive user data
mUsbDataUnlocked = false;
}
updateUsbNotification();
updateAdbNotification();
if (UsbManager.containsFunction(mCurrentFunctions,
UsbManager.USB_FUNCTION_ACCESSORY)) {
updateCurrentAccessory();
} else if (!mConnected) {
// restore defaults when USB is disconnected
setEnabledFunctions(null, false);
}
if (mBootCompleted) {
updateUsbStateBroadcast();
updateUsbFunctions();
}
break;
可以看到当USB断开时,function会被还原到默认值。

那么现在在我们的面前有一个问题那就是如何去完成function的设置保证再次连接属性不变呢?修改的方法是我们在setUsbConfig时,我们将去设置的属性为“persist.sys.usb.config”,而不是原先的“sys.usb.config”,原因可以看下面:

 
在文件init.usb.rc文件中可以看到
on property:persist.sys.usb.config=*
setprop sys.usb.config ${persist.sys.usb.config}
所以可以保证同时修改两个值,保证在断开连接时,不会受到影响。

本人在CSDN的第一份博客,希望能给你提供帮助!

你可能感兴趣的:(Android M USB流程)