Я пишу приложение 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
на уязвимых устройствах оно фактически корректно открывает приложение при подключении флэш-накопителя, но затем приложение так и не находит его по-прежнему.