正如标题所述,我在使用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访问权限的解决方案,但它不一定是一个交易破坏者.
编辑:一些示例代码.
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设备:
以下设备无法枚举设备:
编辑3:以下是adb shell dmesg插入USB设备后调用Nexus 5 的日志.您可以在第4-16行清楚地看到手机无法枚举设备.
甲设备所有者可以授予运行时权限使用给第三方应用DevicePolicyManager.setPermissionGrantState() ,以避免用户提示。
但是,设备所有者也可以通过任何方式授予USB权限,以使该应用无需用户提示即可访问插入的USB设备吗?
我也尝试调用UsbManager.grantPermission()(反射),但是它引发了一个,SecurityException因为它需要MANAGE_USB仅授予系统应用程序(显然不授予设备所有者)的权限。
注意:我正在寻找在非root用户和非自定义Android系统上运行的解决方案,设备所有者应用是使用Android Enterprise设置方法设置的。
android android-usb android-enterprise android-management-api
我创建了一个基于连接网络摄像头的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) 按照简单的教程我可以连接到设备(带有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, 0x00或0x00, 0x00 (这可能是规范中的错误,因为这个字节序列被定义为两个不同状态的结果)或0x20, 0x00作为回报,但我没有看到任何方式api返回任何东西,我是对的吗?
我的应用程序中有2个活动.说FirstActivity和SecondActivity. 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)
这是在做以下事情:
如何修改此项以实现以下目标:
如果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运行时连接时,问题再次重新启动.我该如何避免这种情况?
如果需要,将添加更多信息.感谢任何帮助.
我的目标是从配备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提供的连接之间架起桥梁.你有什么想法或建议吗?
我有一个使用的应用程序
<uses-feature
android:name="android.hardware.usb.accessory"
android:required="true" />
Run Code Online (Sandbox Code Playgroud)
我希望USB能够与前台运行的App1和后台运行的App2进行通信.在我的背景中运行的App2.在前台运行的App1由第三方运行.我将无法访问App1.
当我试图做的时候,每当一个应用程序获得访问权限时,另一个应用程序就失去了连接.有没有办法让两个应用程序同时与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但它们都失败了:
https://github.com/jollen/libv4l2-android:
fatal error: 'ui/CameraHardwareInterface.h' file not found
https://github.com/antmicro/android-camera-hal:
error: use of undeclared identifier 'kMaxStride'
no member named 'I422ToABGRRow_NEON' in namespace 'libyuv'
https://github.com/aosp-mirror/platform_hardware_libhardware/tree/master/modules/camera/3_4
ninja: error: 'out/target/product/rpi3/obj/STATIC_LIBRARIES/libgtest_prod_intermediates/export_includes', needed by 'out/target/product/rpi3/obj/SHARED_LIBRARIES/camera.v4l2_intermediates/import_includes', missing and no known rule to make it
简而言之,如何通过Raspberry Pi上的Android Camera …
android android-source android-camera raspberry-pi android-usb
在Android应用中,我需要获得特定USB设备(已知供应商/产品ID)的许可,该设备会永久插入Android设备.
到目前为止,我已经做了以下观察:
是否可以确保权限弹出窗口仅显示一次?(特别是在Android设备重启且USB设备仍然插入的情况下)
注意:该应用程序未安装在系统文件夹中,因此无法使用MANAGE_USB权限.
我想在以下代码中使用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)