生活随笔
收集整理的這篇文章主要介紹了
Android 启用/禁用通过otg连接T卡功能
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.調用方法:
private String setSDOTGEnable(boolean enable) {if (enable)mDPM.clearUserRestriction(admin, UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA);elsemDPM.addUserRestriction(admin, UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA);
}
2.在【mt67xx_11.0】上調用以上方法并不能控制到ES文件瀏覽器識別SD卡,增加以下控制:
--- a/alps/frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/alps/frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -50,6 +50,10 @@ import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.LinkedList;
+//add for setSDOTGEnable
+import android.os.UserHandle;
+import android.os.UserManager;
+//add end/*** UsbHostManager manages USB state in host mode.
@@ -353,6 +357,13 @@ public class UsbHostManager {@SuppressWarnings("unused")private boolean usbDeviceAdded(String deviceAddress, int deviceClass, int deviceSubclass,byte[] descriptors) {
+ //add by lfy for setSDOTGEnable
+ UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ boolean flag = um.hasUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,UserHandle.of(um.getUserHandle()));
+ if (flag) {
+ return false;
+ }
+ //add endif (DEBUG) {
以上方法實現的啟用/禁用otg功能在使用過程中需要在調接口前先插拔otg設備,完善缺陷修改如下:
1.在禁用前先unmount已掛載的設備&在啟用后mount已插入的設備,順序不能亂
if(!enable){unmountSD(!enable); //禁用前先unmount已掛載的設備mDPM.addUserRestriction(admin, UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA);
}else{mDPM.clearUserRestriction(admin, UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA);unmountSD(!enable); //在啟用后mount已插入的設備
}private void unmountSD(boolean disabled) {try { //一定要有try...catchandroid.util.Log.d("lfy","mountUnmountSD......");StorageManager mStorageManager = mContext.getSystemService(StorageManager.class);StorageVolume[] volumeList = mStorageManager.getVolumeList();if (volumeList.length > 0) {for (StorageVolume vol : volumeList) {android.util.Log.d(TAG," mountUnmountSD...vol="+vol+",getId="+vol.getId()+",path="+vol.getPath()+",InternalPath="+vol.getInternalPath()+",filePath="+vol.getPathFile().getPath()+",getDescription="+vol.getDescription(mContext));if (disabled) {if (!"/storage/emulated/0".equals(vol.getPath()) && "mounted".equals(vol.getState())) {mStorageManager.unmount(vol.getId());}}else{if (!"/storage/emulated/0".equals(vol.getPath()) && "unmounted".equals(vol.getState())) {mStorageManager.mount(vol.getId());}}}}} catch(Exception e){android.util.Log.d("lfy","[FuncTools] mountUnmountSD...e="+e);e.printStackTrace();}
}
2.打印log
3.如果unmountSD順序調用錯誤(統一在enable判斷前調用會報如下錯誤)
4.報錯信息具體出處:
//frameworks/base/services/core/java/com/android/server/StorageManagerService.java
@Overridepublic void mount(String volId) {enforcePermission(android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);final VolumeInfo vol = findVolumeByIdOrThrow(volId);if (isMountDisallowed(vol)) { //決定存儲是否能掛載的關鍵throw new SecurityException("Mounting " + volId + " restricted by policy");}mount(vol);}/*** Decide if volume is mountable per device policies.*/
private boolean isMountDisallowed(VolumeInfo vol) {UserManager userManager = mContext.getSystemService(UserManager.class);boolean isUsbRestricted = false;if (vol.disk != null && vol.disk.isUsb()) {isUsbRestricted = userManager.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER,Binder.getCallingUserHandle());}boolean isTypeRestricted = false;if (vol.type == VolumeInfo.TYPE_PUBLIC || vol.type == VolumeInfo.TYPE_PRIVATE|| vol.type == VolumeInfo.TYPE_STUB) {isTypeRestricted = userManager.hasUserRestriction(UserManager.DISALLOW_MOUNT_PHYSICAL_MEDIA,Binder.getCallingUserHandle());}return isUsbRestricted || isTypeRestricted;
}
總結
以上是生活随笔為你收集整理的Android 启用/禁用通过otg连接T卡功能的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。