Cordova не может найти подключенные устройства OTG - PullRequest
0 голосов
/ 10 мая 2019

Я пишу приложение Cordova для Android для просмотра отснятого материала с видеорегистратора через OTG-адаптер. Только на некоторых устройствах мое приложение не находит внешние накопители, подключенные через адаптер OTG.

Все остальные приложения (файловые менеджеры и т. Д.) Могут находить диски и просматривать файлы в них. Однако я не могу воспроизвести проблему самостоятельно, поскольку она работает безупречно на всех моих устройствах Android. Похоже, что проблема возникает на менее чем 10% устройств Android. Мне удалось отладить с помощью удаленного управления друга, у которого возникла проблема, и почему-то его флешка никогда не указана в файле: /// storage / для моего приложения, но все остальные файловые менеджеры могут это видеть. Моему приложению предоставлены разрешения WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE (я смог подтвердить, что разрешения были правильно предоставлены при наличии проблемы). Мне интересно, правильно ли я это делаю или мне не хватает каких-либо дополнительных разрешений ...

Вот некоторые соответствующие материалы в config.xml

    <preference name="AndroidPersistentFileLocation" value="Compatibility" />
    <preference name="MediaPlaybackAllowsAirPlay" value="true" />
    <preference name="AndroidExtraFilesystems" value="files,files-external,sdcard,cache,cache-external,root" />

    <platform name="android">
        <allow-intent href="market:*" />
        <config-file parent="/manifest/application/activity" target="AndroidManifest.xml">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.MEDIA_MOUNTED" />
            </intent-filter>
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />
                <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" />
        </config-file>
        <config-file parent="/manifest" target="AndroidManifest.xml">
            <uses-feature android:name="android.hardware.usb.host" />
            <uses-permission android:name="cordova.plugins.diagnostic.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="cordova.plugins.diagnostic.permission.READ_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
        </config-file>
        <resource-file src="android_device_filter.xml" target="app/src/main/res/xml/device_filter.xml" />
    </platform>

    <plugin name="cordova-plugin-file" spec="^6.0.1" />
    <plugin name="cordova.plugins.diagnostic" spec="^4.0.12">
        <variable name="ANDROID_SUPPORT_VERSION" value="27.+" />
    </plugin>

Вот код, который я использую для отображения всего хранилища:

cordova.plugins.diagnostic.requestExternalStorageAuthorization(function(){
    window.resolveLocalFileSystemURL('file:///storage/', function(storageDirEntry){
        var rootDirReader = storageDirEntry.createReader();
        rootDirReader.readEntries(function(drives){
            for (var i in drives) if (drives[i].isDirectory) {
                console.log('Searching In Drive: ', drives[i].name);
                //...
            }
        }, console.error);
    }, console.error);
}, console.error);

Я ожидаю увидеть устройство, перечисленное непосредственно как /storage/[DEVICE_ID], как на большинстве устройств ... Но на затронутых устройствах ошибки в консоли нет, и я вижу только один диск /storage/emulated и /storage/self. А в /storage/emulated/ есть только 0, который, конечно, не является внешней флешкой.

Вот еще один фрагмент кода, который я пробовал, но он просто выводит пустой массив без ошибок на задействованных устройствах:

cordova.plugins.diagnostic.getExternalSdCardDetails(console.log, console.error);

Я знаю, что диск правильно подключен и обнаружен, потому что другие файловые менеджеры на том же устройстве Android обнаруживают его и могут просматривать файлы. Кроме того, эти фрагменты кода выполняются каждые несколько секунд для непрерывного обнаружения ... и все равно никогда не находит диск.

Также интересно отметить: при использовании намерения android.hardware.usb.action.USB_DEVICE_ATTACHED на уязвимых устройствах оно фактически корректно открывает приложение при подключении флэш-накопителя, но затем приложение так и не находит его по-прежнему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...