Android 各版本 设置 USB 默认连接 MTP 模式 ( Android  6.0+ )

Android 6.0 以及之后的版本,google默认设计直接配置USB连接模式为 :仅充电;

项目开发需要配置USB的 默认连接方式为:MTP 模式;

废话不多说,直接给方案,不同平台源码有少许差异,请知悉!

Android 6.0 Before

modify /device/mediatek/common/device.mk

# default usb function ifeq ($(strip $(MTK_MASS_STORAGE)),yes)
ADDITIONAL_DEFAULT_PROPERTIES += persist.sys.usb.config=mass_storage
//修改上面成想要的功能,如 ADDITIONAL_DEFAULT_PROPERTIES += persist.sys.usb.config=mtp

Android 6.0 +

modify   frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java。

public class UsbDeviceManager {···省略很多代码···private boolean mConfigured;//modified in 2017-05-22 start//解锁数据,连接电脑,就能看到默认连接模式为MTPprivate boolean mUsbDataUnlocked = true;//modified in 2017-05-22 endprivate String mCurrentFunctions;private String mDefaultFunctions;······@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_UPDATE_STATE:mConnected = (msg.arg1 == 1);mConfigured = (msg.arg2 == 1);mUsbConfigured = mConfigured;if (!mConnected) {//modified in 2017-05-22 start//default usb connect mode as mtp// When a disconnect occurs, relock access to sensitive user data//断开连接的时候,保持当前连接模式,下次连接的时候还是MTPmUsbDataUnlocked = true;//modified in 2017-05-22 end}updateUsbNotification();updateAdbNotification();if (UsbManager.containsFunction(mCurrentFunctions,UsbManager.USB_FUNCTION_ACCESSORY)) {updateCurrentAccessory();} else if (!mConnected) {//modified  in 2017-05-22 start//change default usb connect mode as mtp,do not restore// 这里不恢复默认连接方式,保持保持当前的连接模式setEnabledFunctions(null, true);//modified  in 2017-05-22 end}if (mBootCompleted) {updateUsbStateBroadcastIfNeeded();updateUsbFunctions();}······}

Android 7 +

Modify

1.修改frameworks/base/services/usb/java/com/android/server/usb/UsbService.java

public class UsbService extends IUsbManager.Stub {······final IntentFilter filter = new IntentFilter();filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);filter.addAction(Intent.ACTION_USER_SWITCHED);filter.addAction(Intent.ACTION_USER_STOPPED);//add by xx in 2017-06-12 for bug 169853 start//注册三个广播filter.addAction(Intent.ACTION_USER_PRESENT);filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);//add by xx in 2017-06-12 for bug 169853 endfilter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);mContext.registerReceiver(mReceiver, filter, null, null);······private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);final String action = intent.getAction();if (Intent.ACTION_USER_SWITCHED.equals(action)) {setCurrentUser(userId);} else if (Intent.ACTION_USER_STOPPED.equals(action)) {synchronized (mLock) {mSettingsByUser.remove(userId);}} else if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals(action)) {if (mDeviceManager != null) {mDeviceManager.updateUserRestrictions();}//add by xx in 2017-06-12 for bug 169853 start//处理三个广播}else if (Intent.ACTION_USER_PRESENT.equals(action)) {if (mDeviceManager != null) {mDeviceManager.usbDataUnlocked(true);//这个方法系统有的mDeviceManager.setUserPresent();//这个方法是添加的}} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {if (mDeviceManager != null) {mDeviceManager.updateScreentSate(true);//这个方法是添加的,为了更新屏幕状态}} else if (Intent.ACTION_SCREEN_ON.equals(action)) {if (mDeviceManager != null) {mDeviceManager.updateScreentSate(false);//这个方法是添加的,为了更新屏幕状态}//add by xx in 2017-06-12 for bug 169853 end}}};
}

2.接下来修改frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

public class UsbDeviceManager {·····//添加两个全局变量,作为标识//modified by xx in 2017-06-12 for bug 169853 startprivate boolean mUserPresent = false;//用户是否结果到前台private boolean screenOff = false;//屏幕是否是熄屏private boolean changeByUser = false;//切换USB模式的时候,是这里代码切换的,还是用户点击切换的。//modified by xx in 2017-06-12 for bug 169853 end·····//添加这两个方法,在UsbService.java中用到,更新这边的状态//modified by xx in 2017-06-12 for bug 169853 startpublic void setUserPresent(){mUserPresent = true;}public void updateScreentSate(boolean state){screenOff = state;if(!screenOff) {mUserPresent = false;}if(mHandler != null){mHandler.updateUsbMode();}}public void usbDataUnlocked(){changeByUser  = false;mHandler.sendMessage(MSG_SET_USB_DATA_UNLOCKED, true);}//modified by xx in 2017-06-12 for bug 169853 end·····//更新USB连接状态public void updateState(String state) {int connected, configured;if ("HWDISCONNECTED".equals(state)) {connected = 0;configured = 0;mHwDisconnected = true;//add by xx in 2017-08-03 for swtich usb mode startchangeByUser = false;//add by xx in 2017-08-03 for swtich usb mode end} else if ("DISCONNECTED".equals(state)) {connected = 0;configured = 0;mHwDisconnected = false;//modified by xx in 2017-06-12 for bug 169853 start//当熄屏的情况下,更新用户不在前台的标识if(screenOff){mUserPresent = false;}//modified by xxx in 2017-06-12 for bug 169853 end} else if ("CONNECTED".equals(state)) {connected = 1;configured = 0;·····private final class UsbHandler extends Handler { ·····//在收到更新USB状态的消息之后,更新USB模式,当然要根据用户是否在前台进行判断@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MSG_UPDATE_STATE:mConnected = (msg.arg1 == 1);mConfigured = (msg.arg2 == 1);mUsbConfigured = mConfigured;//modified by xx in 2017-06-12 for bug 169853 start//update usb state firstupdateUsbMode();if (mUserPresent && !changeByUser) {   //用户在前台的mUsbDataUnlocked = true;//解锁数据,那么连接电脑就能看到连接模式为MTP了}//modified by xx in 2017-06-12 for bug 169853 endif (!mConnected) {// When a disconnect occurs, relock access to sensitive user datamUsbDataUnlocked = false;}updateUsbNotification();updateAdbNotification();if (UsbManager.containsFunction(mCurrentFunctions,UsbManager.USB_FUNCTION_ACCESSORY)) {updateCurrentAccessory();} else if (!mConnected) {}·····//省略代码case MSG_SET_USB_DATA_UNLOCKED://add by xx in 2017-08-03 for swtich usb mode startif(!changeByUser && mUsbDataUnlocked) return;//add by xx in 2017-08-03 for swtich usb mode endsetUsbDataUnlocked(msg.arg1 == 1);break;}·····//在UsbHandler类中的方法,主要是因为用到USB状态值:mConnected//add by xx in 2017-06-12 for bug 169853 startprivate void updateUsbMode(){if(!mConnected && screenOff){mUserPresent = false;}}//add by xx in 2017-06-12 for bug 169853 end}·····}//省略其他代码public void setCurrentFunctions(String functions) {if (DEBUG) Slog.d(TAG, "setCurrentFunctions(" + functions + ")");//add by xx in 2017-08-03 for swtich usb mode startchangeByUser = true;//add by xx in 2017-08-03 for swtich usb mode endmHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);}//省略其他代码
}

Android  8.0 +

modify  /frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

@Overridepublic void handleMessage(Message msg) {...case MSG_UPDATE_STATE:...if (!mConnected) {// restore defaults when USB is disconnectedsetEnabledFunctions(null, !mAdbEnabled, false);                         setEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false, true); //chc add}...             case MSG_BOOT_COMPLETED:mBootCompleted = true;if (mPendingBootBroadcast) {updateUsbStateBroadcastIfNeeded(false);mPendingBootBroadcast = false;}//setEnabledFunctions(null, false, false);setEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false, true); //chc addif (mCurrentAccessory != null) {getCurrentSettings().accessoryAttached(mCurrentAccessory);}if (mDebuggingManager != null) {mDebuggingManager.setAdbEnabled(mAdbEnabled);}break;}

连接电脑,看电脑上MTP的图标显示之后,然后将延迟进行相应的调整

Android 9.0

modify 

--- a/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -824,7 +824,7 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver&& mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {setScreenUnlockedFunctions();} else {
-                                setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
+                                setEnabledFunctions(UsbManager.FUNCTION_MTP, false);}}updateUsbFunctions();
@@ -1012,7 +1012,9 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver&& mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {setScreenUnlockedFunctions();} else {
-                    setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
+                   Slog.e(TAG, "finishBoot");
+                    //setEnabledFunctions(UsbManager.FUNCTION_NONE, false);
+                   setEnabledFunctions(UsbManager.FUNCTION_MTP, false);}if (mCurrentAccessory != null) {mUsbDeviceManager.getCurrentSettings().accessoryAttached(mCurrentAccessory);

---------------------

Android 各版本 设置 USB 默认连接 MTP 模式 ( Android 6.0+ )相关推荐

  1. Android 连接USB默认选中MTP模式

    Android 连接USB默认选中MTP模式 需求分析 Android系统默认连接USB会显示:正在通过USB为此设备充电,并且无法在电脑查看存储内容.需要实现的效果:Android 连接USB默认选 ...

  2. 修改USB默认选中MTP模式

    Android连接USB默认选中MTP模式,并删除"为设备充电选项" Android系统默认连接USB会显示:正在通过USB为此设备充电,需求是删除"为设备充电选项&qu ...

  3. vmware虚拟机中ubuntu系统里设置USB串口连接海思开发板

    vmware虚拟机中ubuntu系统里设置USB串口连接海思开发板 作为海思平台的一个新手,在学习海思开发板时,会因为一个很小的问题折腾半天,但是当解决一个小问题时还是很兴奋的,记录下自己学习过程. ...

  4. 如何将Chrome谷歌浏览器的桌面快捷方式和任务栏快捷方式设置成默认打开无痕模式

    1.桌面Chrome谷歌浏览器的快捷方式设置成默认打开模式为无痕模式 第一步:在桌面上找到Chrome谷歌浏览器图标,右击鼠标,点击最下方属性(R) 第二步:在属性内点击上方菜单栏-[快捷方式],找到 ...

  5. 取消usb计算机连接网络,usb连接(如何设置usb网络连接)

    手机USB连接电脑地的方法: 第一步:将USB数据线连接电脑,并确保数据线完好 第二步:打开手机系统设置------开发者选项 第三步:点开开发者选项---------USB调试 . 我不会额...教 ...

  6. android setting模块,android O版本 设置(Settings)模块总结--设置的一级界面的加载

    O版本的设置界面相对有N有了一些变化,O上面增加了顶级类别的菜单,而之前一些在一级菜单的则移动到了二级界面里面, 如"WIFI","移动网络"等之前是在一级界面 ...

  7. android设置成默认应用程序,在Android中设置和取消设置默认应用

    我有一个尝试"进入信息亭模式"的应用程序,但是我只希望它仅出现在一个Activity上.在修改了一些控件之后,我想到了Intent.createChooser(). 我想做的是,一 ...

  8. android线性布局设置控件固定在底部,Android UI组件LinearLayout线性布局详解

    LinearLayout 线性布局,该布局的继承关系: 1. 什么是线性布局 通俗的说感觉起来和线有关,参照线的特点,有么是横向的,要么是竖向的. LinearLayout是线性布局控件,它包含的子控 ...

  9. android 5.0 pie,Android各版本份额占比出炉:Android Pie仍未知

    据最新的数据显示,有19.2%的设备装载Android8.0 Oreo系统,相比起上个月的数据来说有了不错的提升达到4.6个百分点,甚至还要比去年的安卓7.0要高出3.4个百分点.2016发布Andr ...

最新文章

  1. 通过源代码研究ASP.NET MVC中的Controller和View(二)
  2. java mysql安装教_大学java教案之MySQL安装图解
  3. 契约式设计(DbC)感想(二)
  4. dojo中的this.own()
  5. 沈逸老师ubuntu速学笔记(2)-- ubuntu16.04下 apache2.4和php7结合编译安装,并安裝PDOmysql扩展...
  6. 数据中台和业务中台的区别
  7. 并发安全的mysql序列实现
  8. apache简单安全配置
  9. 凸优化极简笔记(三):椭圆方程的矩阵形式
  10. DNS资源纪录(Resource Record)介绍
  11. 样本切分器—利用python按比例均匀切分样本
  12. 安卓手机快速将IOS微信消息换行
  13. 四.电影/综艺网站(包含搜索经验, 我的经验, 必看) 彻底帮你解决看电影/综艺的问题
  14. [Python]TempConvert.py(温度转换)解释拓展
  15. 从拼多多解析社交电商
  16. 让你的 Android 应用拥有微信一样的实时沟通体验【转自 丰俊文】
  17. 用C语言编程写高考祝福,2020高考祝福自己的句子_高考给自己加油打气的话精选100句...
  18. 网络、浏览器专题重点知识(含原理)
  19. 【亚马逊运营】什么情况下使用Coupon卖家们知多少?
  20. mac 连接上l2tp但是无法访问百度

热门文章

  1. Arduino用超声波测距模块HC-SR04获得精确测量值——误差数据的排除
  2. OpenCV图像处理-区域分割-形态学操作应用
  3. Mysql时间函数用法
  4. 红帽 Red Hat Linux相关产品iso镜像下载【百度云】【更新7.2】
  5. Win11自带的输入法不见了
  6. gensim corpora的简单使用
  7. 成为一名大数据工程师,需要具备什么技能?
  8. 【ML】关于什么是概率图模型?
  9. SEDA(Staged Event-Driven Architecture)
  10. SSM框架搭建,及遇到的问题