Android USB 枚举

2024-01-11

我正在编写一个 Android USB 主机应用程序,我试图枚举与平板电脑连接的设备。我遵循开发者网站的 android USB 主机文档中的代码。

我的代码如下

AndroidUSB活动

public class AndroidUSBActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    USBClass usb = new USBClass();
    ArrayList<String> deviceList = usb.GetUSBDevices(getBaseContext());
    final CharSequence[] items = deviceList.toArray(new CharSequence[deviceList.size()]);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Select a Reader");
    builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {
            String selectedDevice = (String) items[item];
            dialog.dismiss();

            TextView DeivceName = (TextView)findViewById(R.id.textView1);
            DeivceName.setText(selectedDevice);
        }
    });
    AlertDialog alert = builder.create();
    alert.show();
}
}

USBClass

public class USBClass {


private static UsbManager mManager = null;
private static HashMap<String, UsbDevice> mdevices;
private static PendingIntent mPermissionIntent;
private static final String ACTION_USB_PERMISSION =
        "com.android.example.USB_PERMISSION";
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(device != null){
                        //call method to set up device communication 
                        Log.i("usb", "permission granted for device " + device);
                    }
                } 
                else {
                    Log.i("usb", "permission denied for device " + device);
                }
            }
        }
    }
};   


public ArrayList<String> GetUSBDevices(Context context){
    mManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
    mdevices = new HashMap<String, UsbDevice>();
    ArrayList<String> deviceList = new ArrayList<String>();
    mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent("com.android.example.USB_PERMISSION"), 0);
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
    context.registerReceiver(mUsbReceiver, filter);


    // check for existing devices
    for (UsbDevice device :  mManager.getDeviceList().values()) {
        String deviceName = null;
        UsbDeviceConnection connection = null;
        if(device.getVendorId() == 0x0123){
            mManager.requestPermission(device, mPermissionIntent);
            connection = mManager.openDevice(device);
            byte rawBuf[] = new byte[255];
            int len = connection.controlTransfer(0x80, 0x06, 0x0302, 0x0409, rawBuf, 0x00FF, 60);
            rawBuf = Arrays.copyOfRange(rawBuf, 2, len);
            deviceName = new String(rawBuf);
            deviceList.add(deviceName);
            mdevices.put(deviceName, device);
        }

     }
    context.unregisterReceiver(mUsbReceiver);
    return deviceList;
}
}

LOGCAT

06-13 10:13:54.556: D/dalvikvm(2219): Late-enabling CheckJNI
06-13 10:13:54.586: I/System.out(2219): Sending WAIT chunk
06-13 10:13:54.586: W/ActivityThread(2219): Application bri.sample is waiting for the debugger on port 8100...
06-13 10:13:54.596: I/dalvikvm(2219): Debugger is active
06-13 10:13:54.786: I/System.out(2219): Debugger has connected
06-13 10:13:54.786: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:54.986: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:55.186: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:55.406: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:55.596: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:55.796: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:55.996: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:56.206: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:56.406: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:56.645: I/System.out(2219): waiting for debugger to settle...
06-13 10:13:56.846: I/System.out(2219): debugger has settled (1337)
06-13 10:13:57.116: E/UsbManager(2219): exception in UsbManager.openDevice
06-13 10:13:57.116: E/UsbManager(2219): java.lang.SecurityException: User has not given  permission to device   UsbDevice[mName=/dev/bus/usb/001/004,mVendorId=1254,mProductId=20758,mClass=0,mSubclass=0,mProtocol=0,mInterfaces=[Landroid.hardware.usb.UsbInterface;@41679100]
06-13 10:13:57.116: E/UsbManager(2219):     at android.os.Parcel.readException(Parcel.java:1327)
06-13 10:13:57.116: E/UsbManager(2219):     at android.os.Parcel.readException(Parcel.java:1281)
06-13 10:13:57.116: E/UsbManager(2219):     at android.hardware.usb.IUsbManager$Stub$Proxy.openDevice(IUsbManager.java:340)
06-13 10:13:57.116: E/UsbManager(2219):     at android.hardware.usb.UsbManager.openDevice(UsbManager.java:250)
06-13 10:13:57.116: E/UsbManager(2219):     at  bri.sample.USBClass.GetUSBDevices(USBClass.java:66)
06-13 10:13:57.116: E/UsbManager(2219):     at bri.sample.AndroidUSBActivity.onCreate(AndroidUSBActivity.java:19)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.Activity.performCreate(Activity.java:4465)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-13 10:13:57.116: E/UsbManager(2219):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 10:13:57.116: E/UsbManager(2219):     at android.os.Looper.loop(Looper.java:137)
06-13 10:13:57.116: E/UsbManager(2219):     at android.app.ActivityThread.main(ActivityThread.java:4424)
06-13 10:13:57.116: E/UsbManager(2219):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 10:13:57.116: E/UsbManager(2219):     at java.lang.reflect.Method.invoke(Method.java:511)
06-13 10:13:57.116: E/UsbManager(2219):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-13 10:13:57.116: E/UsbManager(2219):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-13 10:13:57.116: E/UsbManager(2219):     at dalvik.system.NativeStart.main(Native Method)
06-13 10:13:57.566: D/dalvikvm(2219): threadid=1: still suspended after undo (sc=1 dc=1)
06-13 10:14:04.266: D/AndroidRuntime(2219): Shutting down VM
06-13 10:14:04.266: W/dalvikvm(2219): threadid=1: thread exiting with uncaught exception (group=0x40a531f8)
06-13 10:14:04.296: E/AndroidRuntime(2219): FATAL EXCEPTION: main
06-13 10:14:04.296: E/AndroidRuntime(2219): java.lang.RuntimeException: Unable to start activity ComponentInfo{bri.sample/bri.sample.AndroidUSBActivity}: java.lang.NullPointerException
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.os.Looper.loop(Looper.java:137)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.ActivityThread.main(ActivityThread.java:4424)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at java.lang.reflect.Method.invoke(Method.java:511)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at dalvik.system.NativeStart.main(Native Method)
06-13 10:14:04.296: E/AndroidRuntime(2219): Caused by: java.lang.NullPointerException
06-13 10:14:04.296: E/AndroidRuntime(2219):     at bri.sample.USBClass.GetUSBDevices(USBClass.java:68)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at bri.sample.AndroidUSBActivity.onCreate(AndroidUSBActivity.java:19)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.Activity.performCreate(Activity.java:4465)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-13 10:14:04.296: E/AndroidRuntime(2219):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
06-13 10:14:04.296: E/AndroidRuntime(2219):     ... 11 more

PROBLEM

我已插入设备,然后安装应用程序。这第一次当应用程序启动时,它会崩溃。


当您尝试使用以下命令访问设备时会发生崩溃

connection = mManager.openDevice(device);

它崩溃是因为它抛出了一个SecurityException因为您尚未获得用户使用该设备的许可。看起来您尝试在此之前从该行中的用户那里获得许可

mManager.requestPermission(device, mPermissionIntent);

但你需要明白,调用requestPermission()是异步的。获得许可后它不会立即返回。它的作用是向用户显示一个对话框,并询问用户是否授予您的应用程序权限。一旦用户授予或拒绝权限,对话框就会消失,并且PendingIntent你传递给requestPermission()用于广播指示已授予(或未授予)权限的 Intent。您需要在注册的BroadcastReceiveronReceive()方法被调用,然后您可以检查收到的额外信息Intent并决定如何进行。只有用户授予您权限,您才能继续通话openDevice().

这听起来有点复杂,但这就是它的工作原理。

基本上,你需要打电话

mManager.requestPermission(device, mPermissionIntent);

然后等待获得许可后再尝试访问该设备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android USB 枚举 的相关文章

随机推荐

  • 为什么我在尝试批量打印变量时收到“Echo is on”

    我尝试执行一个简单的批处理文件脚本 echo 1 set var 1 echo var 当我在 XP 中运行它时 它给出了预期的输出 但是当我在 Vista 或 Windows 7 中运行它时 我在尝试打印 回显 值时收到 Echo is
  • 在 MATLAB 中仅查找相关点

    我有一个 MATLAB 函数可以查找样本中的特征点 不幸的是 它仅在大约 90 的时间内有效 但是 当我知道应该查看样本中的哪些位置时 我可以将其提高到几乎 100 所以我想知道MATLAB中是否有一个函数可以让我找到大部分结果所在的范围
  • GetPrivateProfileInt-仅读取默认值

    我正在尝试读取 C 中包含内容的 init 配置文件 IP地址 IP地址 169 254 115 22 扫描配置 扫描频率 2500 扫描分辨率 2500 起始角度 700000 停止角度 1100000 到目前为止 我已经使用这段代码来读
  • 有效检查数据帧是否具有范围内的日期,并返回计数

    假设我们有一个数据框df包含按日期按时间顺序排列的日期列表 目标是获取给定日期内包含给定日期的日期范围的人数 df pd DataFrame data date datetime date 2007 12 1 datetime date 2
  • 在启用 IAM 登录的情况下通过 cloud-sql-proxy 从 Cloud Run 连接到 Cloud SQL

    我想使用服务帐号从 Cloud Run 连接到 Cloud SQL 实例 连接过去是在 VPC 内创建的 我们只需提供一个带有user and a password到我们的 PostgreSQL 客户端 但现在我们希望身份验证由 Googl
  • 在 lubuntu 15.04 上构建 Kurento

    我正在尝试在我的 lubuntu 15 04 上构建整个 Kurento 与 ubuntu 15 04 相同 但 UI 不同 我首先克隆所有存储库 mkdir kurento cd kurento git clone https githu
  • 通过redux改变状态后如何更新React组件?

    我正在学习 React 和 Redux 在学习的同时 我决定制作一个带有按钮的网页 单击该按钮就会改变状态 在按钮下方 我想在不同的组件中显示当前状态 虽然单击按钮会更改状态 但它不会反映在组件中 这是我的代码 App js import
  • 如何查看整个表

    我正在尝试使用 quandl 获取表 数据集 该表有 5 行 X 12 列 但在输出中仅显示 4 列 其余列被 3 个点替换 我使用Python编写了以下代码 import quandl df quandl get WIKI GOOGL p
  • printf("%f",x) 好的,printf("%F",x) 错误格式参数过多

    当我在 CodeBlocks 中使用说明符 F 时 为什么编译器会给出错误 格式参数过多 include
  • app.config 转换

    我非常喜欢添加web config 转换 http msdn microsoft com en us library dd465318 aspx在 Visual Studio 2010 中 另请参阅Scott Hanselman 最近在 M
  • 牛找到长栅栏间隙的算法

    我正在看这个挑战 一头名叫萨姆的近视奶牛在目前的牧场上找不到足够的草 它记得牧场的围栏有一个缺口 不幸的是 栅栏很长 要绕一整圈 Sam 需要沿着栅栏走几步 山姆只能看到间隙就在它旁边 记住牛是近视的 在本题中 您将设计不同的算法 使 Sa
  • 无法配置 CMake 来查找 Bison 的 Homebrew 安装版本

    我正在运行 macOS 10 14 并且安装了bison版本 3 2 与brew 但它拒绝链接 brew link bison force Warning Refusing to link macOS provided software b
  • struts2 将 URL 传递给 Action

    我读了struts手册通配符映射 http struts apache org 2 1 8 1 docs wildcard mappings html并决定自己测试一些例子 我有一个行动指向
  • 创建 Liferay portlet 配置页面

    我正在尝试为 Liferay portlet 创建一个配置页面 以便我可以为其设置一些参数 例如 我想选择控制器在查看时应显示哪个页面 配置应位于此处 所以我为配置创建了一个控制器 如下所示 import com liferay porta
  • 学习WPF和MVVM

    我最近加入了一个新的开发项目 使用 WPF 和 MVVM 构建胖客户端应用程序 我在各种 NET 框架 从 1 1 到 3 5 以及所有主要技术中开发过应用程序 WebForms MVC 和 WinForms 在我所有的项目中 我都很享受其
  • 如何仅在 3 边应用盒子阴影? [复制]

    这个问题在这里已经有答案了 我在下面使用我的 CSS 页面 他在 4 边应用了方框阴影 我希望它只应用于右侧 底部和左侧 如何仅在 3 边应用框阴影 webkit box shadow 0 0 10px rgba 0 0 0 0 22 mo
  • 显示格式 ApplyFormatInEditMode

    我在 C 中使用 MVC 3 我有一个具有此属性的类 DisplayFormat DataFormatString 0 dd MMM yyyy ApplyFormatInEditMode true 我想在用户处于状态时强制执行验证EDIT
  • 将 cout 和 stdout 重定向到 C++ 中的字符串以进行单元测试

    我正在努力在单元测试下获取一些遗留代码 有时感知现有程序行为的唯一方法是从控制台输出 我在网上看到很多关于如何将 stdout 重定向到 C 中的另一个文件的示例 但是有没有办法可以将其重定向到内存中的流 以便我的测试不必依赖于磁盘 我希望
  • YouTube Iframe API onError 事件近几个月没有触发

    我非常确定 YouTube Iframe API onError 事件过去会触发 因为我运行一个基于此 API 的项目 但最近 onError 事件不会触发 即使是最简单的错误 这是一个基于官方页面的简单示例代码 https develop
  • Android USB 枚举

    我正在编写一个 Android USB 主机应用程序 我试图枚举与平板电脑连接的设备 我遵循开发者网站的 android USB 主机文档中的代码 我的代码如下 AndroidUSB活动 public class AndroidUSBAct