usbmanger android 底下USB的工作模式
2023-09-14 08:59:07 时间
Android USB开发麻烦还是比较多的。
第一种:host模式
这种模式比较不错,由Android设备提供电源,然后与外部设备通信。举个例子来说:电脑连接USB设备,都是这个模式,非常常见的模式。
但是有一个万恶的问题,android接外部USB设备的时候,驱动怎么办?又有那款芯片敢说Android系统支持他们家的芯片,又有哪个厂家说不动android系统装上他们家的驱动,他们家的设备就可以在Android上使用,或许这点上Android很难超越windows。
造成想现状:想加外部设备,都要:重新自己做底层驱动程序--->编译系统--->刷机--->编写android程序--->接入硬件实现功能。
整个一套下来饭都吃好几顿了。还是希望以后android发展发展能向window一样支持多设备驱动吧。
第二种:Accessory模式
这个模式比较揪心,外部设备要供给电源,数据间通信:电脑---手机就是这种模式,手机作为Accessory设备,电脑供给它电源,同时进行数据通信。
恰巧我也是用了这种模式:
程序需要做的:
(1)添加Action BoardCast
private static final String ACTION_USB_PERMISSION ="com.ukey.USB_PERMISSION";
/***********USB broadcast receiver*******************************************/ private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { Toast.makeText(global_context, "Allow USB Permission", Toast.LENGTH_SHORT).show(); OpenAccessory(accessory); }else{ Toast.makeText(global_context, "Deny USB Permission", Toast.LENGTH_SHORT).show(); } mPermissionRequestPending = false; } } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)){ DestroyAccessory(true); }else{ Log.d("LED", "...."); } } };
android每次使用Accessory的时候都会询问你是否允许设备访问,这会点击是或否的结果又(2)中代码
启动请求。
(4)openAccessory功能
public int OpenAccessory() { // Intent intent = getIntent(); if (inputstream != null && outputstream != null) { return 1; } UsbAccessory[] accessories = usbmanager.getAccessoryList(); if(accessories != null){ Toast.makeText(global_context, "Accessory Attached", Toast.LENGTH_SHORT).show(); }else{ // return 2 for accessory detached case return 2; } UsbAccessory accessory = (accessories == null ? null : accessories[0]); if (accessory != null) { if( -1 == accessory.toString().indexOf(ManufacturerString)){ Toast.makeText(global_context, "Manufacturer is not matched!", Toast.LENGTH_SHORT).show(); return 1; } if( -1 == accessory.toString().indexOf(ModelString1) && -1 == accessory.toString().indexOf(ModelString2)) { Toast.makeText(global_context, "Model is not matched!", Toast.LENGTH_SHORT).show(); return 1; }if( -1 == accessory.toString().indexOf(VersionString)) { Toast.makeText(global_context, "Version is not matched!", Toast.LENGTH_SHORT).show(); return 1; } Toast.makeText(global_context, "Manufacturer, Model & Version are matched!", Toast.LENGTH_SHORT).show(); if (usbmanager.hasPermission(accessory)) { OpenAccessory(accessory); }else{ synchronized (mUsbReceiver) { if (!mPermissionRequestPending) { Toast.makeText(global_context, "Request USB Permission", Toast.LENGTH_SHORT).show(); usbmanager.requestPermission(accessory,mPermissionIntent); mPermissionRequestPending = true; } } } } return 0; }
相关文章
- android系统开机画面_Android开机画面
- android activity自动跳转,Android activity跳转之finish()方法的作用
- android 混淆不起作用,Android代码混淆的写法总结
- android autosize原理,Android屏幕适配头条:autosize的原理
- Android Studio安装教程(超级详细)「建议收藏」
- android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解…
- android-studio安装及android开发环境搭建[通俗易懂]
- android短信验证码方案,Android开发之属于你的短信验证码(一)
- 适用于 Android™ 的 Windows 子系统 Magisk + LSPosed 指南
- android触摸屏事件,Android Touch事件分析
- Android resource linking failed_android sdk location should not
- android跳转到相册需要权限,Android打开相册获取图片路径[通俗易懂]
- android线程间通信的几种方法_Android进程间和线程间通信方式
- Android画中画(PIP)模式使用
- 【Android 应用开发】Paint 图形组合 Xfermod 之 合成模式表示方法 ( Xfermod 使用步骤 | 透明度 颜色值 公式表示方法 | 老版本表示方法 | 合成区域分块 )
- 【错误记录】Flutter / Android 报错 ( AAPT: error: attribute android:requestLegacyExternalStorage not found )
- 【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )
- 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
- 【Android 逆向】ARM CPU 架构体系 ( ARM 处理器工作模式 | ARM 架构模型 )
- 【Android 逆向】Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )
- 【Android 逆向】Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
- 【ijkplayer】编译 Android 版本的 ijkplayer ② ( 切换到 k0.8.8 分支 | 执行 init-android.sh 脚本进行初始化操作 )
- 【Android UI】Paint ComposeShader 组合渲染 ( Shader 叠加模式 | Xfermode | PorterDuff.Mode | BlendMode )
- 【Android NDK 开发】CMake 中查找链接 Android 自带动态库位置说明 ( ndk-bundleplatformsandroid-29arch-armusrlib )
- 【Kotlin 协程】协程异常处理 ④ ( Android 协程中出现异常导致应用崩溃 | Android 协程中使用协程异常处理器捕获异常 | Android 全局异常处理器 )
- Windows PC、Linux、Android、iOS 跨平台视频云客户端 QML 开发解决方案
- Android 控件之TextureView详解手机开发
- Android Studio安装插件Genymotion详解手机开发
- 微软押注混合工作模式崛起 推出Cloud PC吸引苹果和Android用户
- 安卓编年史(26):Android Wear
- Android版Chrome“隐身模式”可能很快就会推出
- 浅谈AnDroidDraw+DroidDraw实现Android程序UI设计的分析说明
- android短信拦截的实现代码
- android自定义进度条渐变色View的实例代码
- Android判断和监听底座状态和类型的方法介绍