网站现在用h5做的吗,自己做开奖网站,哪些网站的网站怎么做的,做网站怎样上传文件项目需求#xff0c;需要在电脑端adb发送通知手机端接收指令#xff0c;将USB的仅充电模式更改成传输文件#xff08;MTP#xff09;模式#xff0c;便捷用户在我的电脑里操作内存文件#xff0c;下面是我们的常见的修改方式
1、android12以下、android21以上是这种方式…项目需求需要在电脑端adb发送通知手机端接收指令将USB的仅充电模式更改成传输文件MTP模式便捷用户在我的电脑里操作内存文件下面是我们的常见的修改方式
1、android12以下、android21以上是这种方式
UsbManager mUsbManager (UsbManager) MyApplication.context.getSystemService(Context.USB_SERVICE);
mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP,true);
UsbManager.USB_FUNCTION_MTP mtp ,所有 也可以直接传mtp
2、android12以上
UsbManager mUsbManager (UsbManager) MyApplication.context.getSystemService(Context.USB_SERVICE);
mUsbManager.setCurrentFunction(UsbManager.FUNCTION_MTP); UsbManager.FUNCTION_MTP的指向是GadgetFunction.MTP查看源码是long12;也就是4所以在android12及以上也可以传setCurrentFunction4
这就是我们设置MTP模式的代码触发的地方有的人就会问了setCurrentFunction是系统api我们根本就不能去调用所以有两种解决方案1是你要设置系统app2是修改下系统源码用反射的方法调用上面的方法我们项目的特殊性所以我们是有项目的源码的可以直接修改我的系统源码所以我使用的反射方法基于android8.1 new Thread(new Runnable() {Overridepublic void run() {try {UsbManager mUsbManager (UsbManager) MyApplication.context.getSystemService(Context.USB_SERVICE);// 获取Class对象Class? clazz mUsbManager.getClass();Method setCurrentFunctionMethod clazz.getDeclaredMethod(setCurrentFunction,String.class, boolean.class);setCurrentFunctionMethod.invoke(mUsbManager, mtp, true);} catch (Exception e) {// e.printStackTrace();Log.i(TAG, setCurrentFunction: e.getMessage());}}}).start();
官方源码里说要在异步里面去调用这个方法否则可能会出现异常这一点大家注意下在setCurrentFunction后会有一个异常会提示我们缺少android.permission.MANAGE_USB这个权限当我们的app不是系统权限和root的话是不能申请这个权限的所以我说我们是改了系统api我们可以看到setCurrentFunction是调用了Service.setCurrentFunctions(functions);这个方法UsbService是在frameworks-base-services\frameworks-base-services\usb\java\com\android\server\usb\UsbService.java这个目录下的如果要跟其他工程师协调就可以告诉他是这个文件目录 看截图知道了他通过enforceCallingOrSelfPermission判断权限是否用了。所以只需要注释掉这行就可以了app就不用去申请权限了然后刷机ok UsbManager.USB_FUNCTION_MTP翻译 搜索 复制