gpt4 book ai didi

android - 重启后 USB 附件无法通信

转载 作者:行者123 更新时间:2023-11-29 01:04:31 27 4
gpt4 key购买 nike

我想弄清楚为什么我的应用程序在手机重启后没有开始与 USB 配件通信。如果我拔下电缆并将其重新插入,通信将恢复。该应用程序针对 Android API 19。

在安装应用程序时,我将它设置为始终是家庭应用程序,当我第一次将它连接到配件时,我选中该框以始终允许访问当前配件。

所以当我重新启动手机时,应用程序会自动打开,它会通过检查权限的步骤 (usbmanager.hasPermission) 并且它实际上已经获得了权限而没有出现任何警报,但是通信未在 OpenAccessory 方法中启动。

list :

        <intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
</intent-filter>

<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter"></meta-data>

通讯:

// Init USB Manager
usbmanager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
context.registerReceiver(mUsbReceiver, filter);

// Resume Accessory
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;
}
}
}

// 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();
Log.d("LED", "permission denied for accessory "+ accessory);

}
mPermissionRequestPending = false;
}
}
else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action))
{
DestroyAccessory(true);
//CloseAccessory();
}else
{
Log.d("LED", "....");
}
}
};

// OpenAccessory
private void OpenAccessory(UsbAccessory accessory)
{
filedescriptor = usbmanager.openAccessory(accessory);
if(filedescriptor != null){
usbaccessory = accessory;

FileDescriptor fd = filedescriptor.getFileDescriptor();

inputstream = new FileInputStream(fd);
outputstream = new FileOutputStream(fd);
/*check if any of them are null*/
if(inputstream == null || outputstream==null){
return;
}

if(READ_ENABLE == false){
READ_ENABLE = true;
readThread = new read_thread(inputstream);
readThread.start();
}

// Initialize the serial port here
SerialComm.getInstance().initPort();
}
}

最佳答案

UsbManagerIntentFilter 中,您使用 ACTION_USB_ACCESSORY_DETACHEDACTION_USB_ACCESSORY_ATTACHED 事件,它们在插入或拔出设备时触发.

如果这些事件/ Action 发生,代码将被执行,应用程序将运行

( https://developer.android.com/reference/android/hardware/usb/UsbManager.html )

现在的问题是,当应用程序在重启时启动时,这些事件/操作不会被触发,因此链接到它们的代码将不会被执行

要规避这一点并不容易,因为应用程序只能通过 ACTION_USB_ACCESSORY_ATTACHED Intent 获取 UsbAccessory 类的实例:

An instance of this class is sent to the application via the ACTION_USB_ACCESSORY_ATTACHED Intent. The application can then call openAccessory(UsbAccessory) to open a file descriptor for reading and writing data to and from the accessory.

来源:https://developer.android.com/reference/android/hardware/usb/UsbAccessory.html

如果应用程序没有实例,则应用程序无法使用类(附件)...

关于android - 重启后 USB 附件无法通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com