Android Q 之 USB-记住上一次的选择功能实现

前言
最近接到这样一个客户需求:在连接USB的时候,我们可以选择相应的usb传输模式,如只充电,PTP,mtp等。客户需要在我们选择模式之后将选择的模式记录下来,等到下一次连接USB的时候直接进入该模式。
最开始我的思路是采用直接模拟开关的切换来实现:
首先找到USB模式切换的控制类alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java
在onRadioButtonClicked方法中将选择的模式记录下来

+        Settings.System.putString(mContext.getContentResolver(), "function_default", new Long(function).toString());

然后在refaush方法中



             mProfilesContainer.setEnabled(true);
         }
         RadioButtonPreference pref;
+        String functionDefault = Settings.System.getString(mContext.getContentResolver(), "function_default");
         for (long option : FUNCTIONS_MAP.keySet()) {
             int title = FUNCTIONS_MAP.get(option);
             pref = getProfilePreference(UsbBackend.usbFunctionsToString(option), title);
             // Only show supported options
             if (mUsbBackend.areFunctionsSupported(option)) {
-                pref.setChecked(functions == option);
+                                       if(functionDefault != null){
+                                               pref.setChecked(Long.parseLong(functionDefault) == option);
+                                               if(Long.parseLong(functionDefault) == option){
+                                                               mUsbBackend.setCurrentFunctions(option);                                        
+                                               }
+                                       }else{
+                                               pref.setChecked(functions == option);
+                                       }
+                       
             } else {
                 mProfilesContainer.removePreference(pref);
             }

这样做只有在我们进入选择页面的时候才会自动选择上次选择的模式,这显然时不符合客户的需求的。因为我都已经进入了选择界面,我还差点一下来选择吗?客户需要的是一连接USB就自动选择。所以我们只能继续跟踪代码,因为从当前的信息中,我们可以完全确定选择模式的实际方法是setCurrentFunctions。有了方向我们就进行跟踪,不难发现这最终调用的是aidl里面的方法。我们使用全局查询发现它的最终调用来自alps/frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java,这就非常好办啦,我们直接找到其中的UsbUEventObserver方法,这个方法的注释是这样的

     /*
     * Listens for uevent messages from the kernel to monitor the USB state
     */

掏出大宝贝(谷歌翻译,嘻嘻嘻)这段意思是,侦听来自内核的uevent消息以监视USB状态。成,它就是监视USB状态的,直接在这个方法中先判定保存的值是否为空,如果不为空我们就设置它的状态。

+                       String functionDefault = android.provider.Settings.System.getString(mContext.getContentResolver(), "function_default");
+                       if(functionDefault != null){
+                                       setCurrentFunctions(Long.parseLong(functionDefault));                                           
+                                       }

这样我们的目的就实现啦。

你可能感兴趣的:(Android Q 之 USB-记住上一次的选择功能实现)