标签: android-usb

为什么UsbManager.getDevicesList()不能枚举这个特定的设备?

正如标题所述,我在使用UsbManager.getDeviceList()在具有USB功能的Android手机上枚举特定USB设备时遇到了麻烦.我在此手机和其他手机上枚举和与其他USB设备通信时没有遇到任何问题,但找不到这个特定的USB设备.它也无法使用第三方应用程序(如USB设备信息)进行枚举.

以下是在PC上正确枚举的USB属性.我与设备制造商进行了沟通,该设备制造商已确认外部公司认证该设备符合USB 2.0规范.最初,我怀疑该设备被Android拒绝,因为它省略了以下字段:iManufacturer,iProduct和iSerialNumber,它们被其他兼容设备包含.但是,在审阅了USB 2.0规范第9.5节中的摘录后,似乎没有必要使用这些字段:

适当时,描述符包含对字符串描述符的引用,这些字符串描述符提供以可读形式描述描述符的可显示信息.包含字符串描述符是可选的.但是,描述符中的引用字段是必需的.如果设备不支持字符串描述符,则必须将字符串引用字段重置为零,以指示没有可用的字符串描述符.

那么,我的问题是什么导致UsbManager拒绝枚举这个USB设备?而且,更重要的是,有什么我可以做的,迫使Android枚举这个设备?理想情况下,我最感兴趣的是一个不需要root访问权限的解决方案,但它不一定是一个交易破坏者.

USB属性


编辑:一些示例代码.

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
// When I plug in this USB device, deviceList is empty. 
// Other devices are discoverable, however.
Run Code Online (Sandbox Code Playgroud)

编辑2:我已经测试了更多手机.我已成功使用以下手机枚举USB设备:

  • 笔记2
  • LG-V400

以下设备无法枚举设备:

  • Nexus 5
  • Galaxy S4,S5,S6
  • LG G2,4G LTE

编辑3:以下是adb shell dmesg插入USB设备后调用Nexus 5 的日志.您可以在第4-16行清楚地看到手机无法枚举设备.

usb android android-usb

10
推荐指数
1
解决办法
656
查看次数

授予USB权限作为设备所有者

设备所有者可以授予运行时权限使用给第三方应用DevicePolicyManager.setPermissionGrantState() ,以避免用户提示。

但是,设备所有者也可以通过任何方式授予USB权限,以使该应用无需用户提示即可访问插入的USB设备吗?

我也尝试调用UsbManager.grantPermission()(反射),但是它引发了一个,SecurityException因为它需要MANAGE_USB仅授予系统应用程序(显然不授予设备所有者)的权限。

注意:我正在寻找在非root用户和非自定义Android系统上运行的解决方案,设备所有者应用是使用Android Enterprise设置方法设置的

android android-usb android-enterprise android-management-api

9
推荐指数
1
解决办法
486
查看次数

如何修复Android中使用USB网络摄像头拔掉usb电缆错误?

我创建了一个基于连接网络摄像头的Android应用程序.该应用程序在与网络摄像头连接时具有魅力.但当我拔掉电源时,我的手机应用程序崩溃并显示"不幸的是应用程序已停止运行".

视频活动:

public class VideoActivity extends AppCompatActivity {
ActionBar actionBar;


public static int mCurrentPosition = -1;
private Handler handler;
private Runnable mRunnable;

//--------------------------------
private static final boolean DEBUG = true;
private static final String TAG = "VIDEO ACTIVITY";


private static final int DEFAULT_WIDTH = 640;  //640
private static final int DEFAULT_HEIGHT = 480; //480

private USBMonitor mUSBMonitor;
private ICameraClient mCameraClient;

private CameraViewInterface mCameraView;

private boolean isSubView;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.new_video_layout);

    if (mUSBMonitor == null) {
        mUSBMonitor …
Run Code Online (Sandbox Code Playgroud)

usb webcam android android-usb

7
推荐指数
1
解决办法
417
查看次数

如何进入Android Usb主机主机发送命令后的Usb设备响应?

按照简单的教程我可以连接到设备(带有ADNS-5000芯片的usb光学鼠标)并制作批量传输.

UsbInterface intf = device.getInterface(0);
UsbEndpoint endpoint = intf.getEndpoint(0);
UsbDeviceConnection connection = manager.openDevice(device);
connection.claimInterface(intf, forceClaim);
connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
Run Code Online (Sandbox Code Playgroud)

ADNS-5000规范(可以用google搜索)定义了一些"USB命令",例如:

助记符:Get_Status_Device

命令:80 00 00 00 00 00 02 00

注意:通常返回00 00,自供电00 00,远程唤醒02 00

所以我理解为:当我写数据时:

private byte[] bytes = {(byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00};
Run Code Online (Sandbox Code Playgroud)

我应该得到的设备0x00, 0x000x00, 0x00 (这可能是规范中的错误,因为这个字节序列被定义为两个不同状态的结果)0x20, 0x00作为回报,但我没有看到任何方式api返回任何东西,我是对的吗?

android usb-hostcontroller android-usb

7
推荐指数
1
解决办法
369
查看次数

USB权限没有提示

我的应用程序中有2个活动.说FirstActivitySecondActivity. FirstActivity是MAIN和LAUNCHER活动.SecondActivity使用USB设备.我希望USB权限提示在应用程序的生命周期内只出现一次.

如果只有一个Activity,则清单中的以下行解决了我的目的:

<activity android:name=".FirstActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
    </intent-filter>

    <meta-data
        android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
        android:resource="@xml/usb_device_filter" />
</activity>
Run Code Online (Sandbox Code Playgroud)

这是在做以下事情:

  1. 每当usb设备(在xml中提到)连接时启动FirstActivity是app尚未打开.
  2. 提示usb设备权限仅出现一次.

如何修改此项以实现以下目标:

  1. 如果SecondActivity已经运行并且连接了新的USB设备,我必须能够在不重新启动应用程序的情况下使用该设备.所以我写了一个广播接收器,如下所示:

    public class TriggerReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { 
            read connected usb devices and register serial port call listener back.
        }
    }    
    
    Run Code Online (Sandbox Code Playgroud)

但是FirstActivity当usb设备在SecondActivity运行时连接时,问题再次重新启动.我该如何避免这种情况?

如果需要,将添加更多信息.感谢任何帮助.

android android-usb

7
推荐指数
1
解决办法
3807
查看次数

在Android应用中使用libCEC + USB加密狗

我的目标是从配备Pulse-Eight USB加密狗的Android机箱上运行的标准(即非系统)应用程序发送HDMI CEC命令.

按照这些说明,我成功地设法为Android 编译libcec并在框中以root身份执行它,使用以下命令:

echo <my-cec-command> | cec-client -s /dev/ttyACM0
Run Code Online (Sandbox Code Playgroud)

/dev/ttyACM0插入加密狗时系统在哪里创建设备文件.

但是,此文件的权限会阻止该命令由非root用户执行(因此无法从我的Android应用程序执行).

另一方面,应用程序实际上可以通过Android SDK 的USB Host API访问USB加密狗(前提是用户授予权限),甚至可以用UsbSerial库封装到USB串行控制器中.

但是我没有看到任何方法在Android的USB Host API和libcec/cec-client提供的连接之间架起桥梁.你有什么想法或建议吗?

android hdmi android-usb hdmi-cec

7
推荐指数
1
解决办法
702
查看次数

如何同时为两个应用程序使用相同的Usb附件?

我有一个使用的应用程序

<uses-feature
        android:name="android.hardware.usb.accessory"
        android:required="true" />
Run Code Online (Sandbox Code Playgroud)

我希望USB能够与前台运行的App1和后台运行的App2进行通信.在我的背景中运行的App2.在前台运行的App1由第三方运行.我将无法访问App1.
当我试图做的时候,每当一个应用程序获得访问权限时,另一个应用程序就失去了连接.有没有办法让两个应用程序同时与USB通信,

android android-usb

7
推荐指数
1
解决办法
185
查看次数

Nougat Camera API支持USB网络摄像头

我正按照以下说明为Raspberry Pi 3构建Nougat AOSP映像:https://github.com/tab-pi/platform_manifest.我有一个兼容UVC的 USB网络摄像头(Logitech C525),我想通过Android Camera API访问.

到目前为止,网络摄像头在UsbManager.getDeviceList()中可见,但Camera.getNumberOfCameras()返回0.

我已经定制了内核,以便/dev/video0在插入网络摄像头时出现具有适当权限的内容:

$ adb shell ls -l /dev/video0
crw-rw---- 1 system camera 81,   0 2018-09-20 10:16 /dev/video0
Run Code Online (Sandbox Code Playgroud)

我试图针对我的AOSP树构建以下HAL但它们都失败了:

简而言之,如何通过Raspberry Pi上的Android Camera …

android android-source android-camera raspberry-pi android-usb

7
推荐指数
1
解决办法
705
查看次数

重启后保持USB权限,无需重新插入设备

在Android应用中,我需要获得特定USB设备(已知供应商/产品ID)的许可,该设备会永久插入Android设备.

到目前为止,我已经做了以下观察:

  • 当使用UsbManager.requestPermission()时,在重新插入/重启时权限被取消,弹出框的复选框似乎对此行为完全没有影响
  • 使用意图过滤器时,在重新插入USB设备时正确地重新授予权限(即使在重新启动后重新插入,如果选中了弹出框的复选框)但是在重启后不会重新授予权限,除非我拔下并重新插入USB设备.

是否可以确保权限弹出窗口仅显示一次?(特别是在Android设备重启且USB设备仍然插入的情况下)

注意:该应用程序未安装在系统文件夹中,因此无法使用MANAGE_USB权限.

android android-usb

7
推荐指数
1
解决办法
465
查看次数

如何使用usb manager授予打开usb设备的权限?openDevice()始终返回null

我想在以下代码中使用USB设备.它成功列出了usb设备并迭代它们.在下面的代码中,对象"device"是我需要打开的usbdevice.除了总是返回null值的OpenDevice()方法之外,一切似乎都很好!

[Activity(Label = "TestApp", MainLauncher = true, Icon = "@drawable/icon")]
[IntentFilter(new[] {UsbManager.ActionUsbDeviceAttached})]
[MetaData(UsbManager.ActionUsbDeviceAttached, Resource = "@xml/device_filter")]

public class MainActivity : Activity
{
    int count = 1;
   {
       base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        UsbManager manager = (UsbManager)GetSystemService(Context.UsbService);
        UsbDevice device = null;
        foreach (var dev in manager.DeviceList)
        {
            if (dev.Value.VendorId == 5401)
            {
                device = dev.Value;
            }
        }
        var connection = manager.OpenDevice(device);
        // Read some data! Most have just one port (port 0).
    } …
Run Code Online (Sandbox Code Playgroud)

android xamarin.android xamarin android-usb

5
推荐指数
1
解决办法
2万
查看次数