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        //解锁数据,连接电脑,就能看到默认连接模式为MTP        private boolean mUsbDataUnlocked = true;        //modified in 2017-05-22 end        private String mCurrentFunctions;        private String mDefaultFunctions;                ······         @Override        public 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                        //断开连接的时候,保持当前连接模式,下次连接的时候还是MTP                        mUsbDataUnlocked = 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 end        filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);        mContext.registerReceiver(mReceiver, filter, null, null);                ······    private BroadcastReceiver mReceiver = new BroadcastReceiver() {        @Override        public 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 start    private 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 start    public 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 start                changeByUser = 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模式,当然要根据用户是否在前台进行判断         @Override        public 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 first                    updateUsbMode();                    if (mUserPresent && !changeByUser) {   //用户在前台的                        mUsbDataUnlocked = true;//解锁数据,那么连接电脑就能看到连接模式为MTP了                    }                    //modified by xx in 2017-06-12 for bug 169853 end                    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) {                    }                            ·····//省略代码                case MSG_SET_USB_DATA_UNLOCKED:                    //add by xx in 2017-08-03 for swtich usb mode start                    if(!changeByUser && mUsbDataUnlocked) return;                    //add by xx in 2017-08-03 for swtich usb mode end                    setUsbDataUnlocked(msg.arg1 == 1);                    break;                }                            ·····            //在UsbHandler类中的方法,主要是因为用到USB状态值:mConnected            //add by xx in 2017-06-12 for bug 169853 start            private 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 start        changeByUser = true;        //add by xx in 2017-08-03 for swtich usb mode end        mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions);    }    //省略其他代码}


 

Android  8.0 +

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

@Override        public void handleMessage(Message msg) {          ...           case MSG_UPDATE_STATE:              ...                 if (!mConnected) {                            // restore defaults when USB is disconnected                            setEnabledFunctions(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 add                                        if (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);


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

更多相关文章

  1. JS调用Android里面的方法,Android调用JS里面的方法
  2. Android App多个入口的实现方法
  3. Android 项目导入eclipse中报错但找不到错误地方的解决方法
  4. Android USB下的Accessory模式
  5. Linux ubuntu repo安装方法
  6. 为android开放类增加自定义成员方法
  7. Android测试方法总结汇总
  8. Android项目源码混淆问题解决方法

随机推荐

  1. Android(安卓)Asynchronous Http Client
  2. Android本地语音识别引擎PocketSphinx-语
  3. 使用Android(安卓)OpenGL ES 2.0绘图之五
  4. 配置Android开发环境
  5. Android事件分发机制完全解析,带你从源码
  6. Android中图像变换Matrix的原理、代码验
  7. Eclipse 中打不开android sdk managerf
  8. android的数据存储和访问 附源码
  9. 【Android Api 翻译2】Android Testing(1
  10. Android编译系统二