UsbDevice requestPermission отклоняется без отображения диалогового окна запроса - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь использовать устройства USB-камеры, подключенные к моему android устройству. Итак, изначально у меня есть детали USB-устройств, подключенных с помощью метода UsbManager.getDeviceList(). Затем я прошел через все устройства и запросил разрешение, если разрешение уже не было предоставлено.

До запроса разрешения я зарегистрировал глобальный BroadCastReceiver для прослушивания ответа на запрошенное разрешение.

Вот MainActivity. java:

public class MainActivity extends AppCompatActivity {

    private UsbManager usbManager_;
    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
    public PendingIntent permissionIntent;
    private static String TAG = "testing";

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

//        SurroundView surroundView = new SurroundView(this);
//        setContentView(surroundView);

        usbManager_ = (UsbManager) getSystemService(USB_SERVICE);
        permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);

        requestUsbPermissions();
    }

    private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.i(TAG, "received intent by broadcast " + intent.getAction());
            if (ACTION_USB_PERMISSION.equals(action)) {
                synchronized (this) {
                    UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                        if (device != null) {
                            Log.i(TAG, "got the permission");
                        }
                    } else {
                        Log.d(TAG, "permission denied for device " + device);
                    }
                }
            }
        }
    };

    public void requestUsbPermissions(){
        HashMap<String, UsbDevice> deviceList = usbManager_.getDeviceList();
        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
        this.registerReceiver(usbReceiver, filter);
        Log.i(TAG, "registered broadcast receiver!");
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        while (deviceIterator.hasNext()) {
            UsbDevice device = deviceIterator.next();
            Log.i(TAG,
                    "Camera: device Id " + device.getDeviceId() + " device mName : " + device.getDeviceName());
            if (!usbManager_.hasPermission(device)) {
                Log.i(TAG, "requesting permission");
                usbManager_.requestPermission(device, permissionIntent);
            }
        }
    }
}

Так что, когда я запускаю приложение, оно обнаруживает, что подключено одно USB-устройство, и запрашивает разрешение на него. Но диалоговое окно, которое запрашивает пользовательский ввод, никогда не появляется. Вместо этого, когда намерение получено BroadCastReceiver, значение intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) всегда будет ложным, что означает, что в разрешении уже отказано. Может кто-нибудь объяснить мне, почему диалоговое окно не приходит в первую очередь и почему разрешение отклоняется автоматически.

Вот мой AndroidManifest. xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.vision_sdk_testing">

    <uses-feature android:name="android.hardware.usb.host" android:required="true"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

А ниже это выходной журнал:

2020-05-01 17:56:05.282 30769-30769/com.example.vision_sdk_testing I/testing: registered broadcast receiver!
2020-05-01 17:56:05.283 30769-30769/com.example.vision_sdk_testing I/testing: Camera: device Id 1003 device mName : /dev/bus/usb/001/003
2020-05-01 17:56:05.283 30769-30769/com.example.vision_sdk_testing I/testing: requesting permission
2020-05-01 17:56:05.301 30769-30769/com.example.vision_sdk_testing I/testing: received intent by broadcast com.android.example.USB_PERMISSION
2020-05-01 17:56:05.302 30769-30769/com.example.vision_sdk_testing D/testing: permission denied for device UsbDevice[mName=/dev/bus/usb/001/003,mVendorId=1443,mProductId=38192,mClass=239,mSubclass=2,mProtocol=1,mManufacturerName=Sonix Technology Co., Ltd.,mProductName=USB 2.0 Camera,mVersion=1.00,mSerialNumberReader=android.hardware.usb.IUsbSerialReader$Stub$Proxy@d41ebfa,mConfigurations=[
    UsbConfiguration[mId=1,mName=null,mAttributes=128,mMaxPower=128,mInterfaces=[
    UsbInterface[mId=0,mAlternateSetting=0,mName=HD USB Camera,mClass=14,mSubclass=1,mProtocol=0,mEndpoints=[]]
    UsbConfiguration[mId=3,mName=null,mAttributes=3,mMaxPower=88,mInterfaces=[]]

Любая помощь приветствуется. Спасибо!

...