[英]Android asks for USB access permission twice
我有一個旨在操作 USB 串行設備的應用程序。 清單包含相應的過濾器:
<intent-filter>
<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/device_filter" />
當我插入 USB 設備時,系統彈出對話框詢問“打開...當此 USB 設備連接時?”。 我可以確認或拒絕,這部分工作正常。 但是,如果我拒絕然后從菜單中重新啟動應用程序,我的手機就會掛斷。 在堆棧跟蹤中,我看到錯誤:
User has not given permission to device UsbDevice...
因此,我必須明確要求 USB 許可。 我嘗試了幾種實現,最簡單的一種看起來像這樣(我使用 usb_serial_for_android 庫: https : //github.com/mik3y/usb-serial-for-android ):
@Override
protected void onResume() {
....
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
...
List<UsbSerialDriver> availableDrivers = CustomProber.getCustomProber().findAllDrivers(manager);
...
UsbSerialDriver driver = availableDrivers.get(0);
if (!manager.hasPermission(driver.getDevice())) {
manager.requestPermission(
driver.getDevice(),
PendingIntent.getBroadcast(this, 0, new Intent("com.android.example.USB_PERMISSION"), 0));
return;
}
....
}
問題是“manager.requestPermission”執行了兩次。
當我從菜單啟動應用程序時,彈出對話框詢問“允許應用程序...訪問 USB 設備?” 如果我確認,同樣的對話框會再次出現,但我的回復並不重要。 似乎權限已經被授予,好像我拒絕了第二個請求,應用程序繼續工作並成功與設備通信。 這是一個相當煩人的行為:(
我想念什么?
PS我還嘗試了Android開發人員描述的“規范”方式( https://developer.android.com/guide/topics/connectivity/usb/host )。 但是,這個基於 BroadcastReceiver 的實現的行為方式相同。 我看過相關的帖子,像這樣一個Android兩次請求USB權限並與作者溝通。 問題仍然存在。
更新
這是日志:
...
...
I/storage permission: DENIED
V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = null, this = DecorView@8856cab[]
D/WindowClient: Add to mViews: DecorView@8856cab[MainActivity], this = android.view.WindowManagerGlobal@5653205
...
出現了存儲訪問的彈出窗口。 我按了“允許”
I/storage permission: GRANTED
I/directory: EXISTS
I/usb permission: DENIED
V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = ViewRoot{632025a com.ERG.erglogger/com.ERG.erglogger.MainActivity,ident = 0}, this = DecorView@8856cab[MainActivity]
USB 訪問的第一個彈出窗口出現了。 我按了“確定”。
I/storage permission: GRANTED
I/directory: EXISTS
I/usb permission: DENIED
V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = ViewRoot{632025a com.ERG.erglogger/com.ERG.erglogger.MainActivity,ident = 0}, this = DecorView@8856cab[MainActivity]
我按了“確定”,但沒有授予權限(manager.hasPermission(driver.getDevice()) 是假的)。 因此,出現了第二個 USB 訪問彈出窗口,在我按下“確定”后,授予了權限:
I/storage permission: GRANTED
I/directory: EXISTS
I/usb permission: GRANTED
D/CdcAcmSerialDriver: trying default interface logic
...
也許您需要一個與最近更新的 usb-serial-for-android 示例應用程序中的onResume 方法中使用的類似解決方案,其中我使用一個標志來防止重復對話
將請求權限放在 onCreate() 中(應用程序啟動后)。 還請檢查應用程序設置-> 允許后的權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.