簡體   English   中英

Android 兩次請求 USB 訪問權限

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM