У меня есть сценарий в Android (SDK 19 / KitKat 4.4.2), где мое приложение должно быть подписано как приложение системного уровня ( App 1 ) с использованием android: sharedUserId = "android.uid. система "в Manifest.xml. Это означает, что это приложение не может записывать или считывать данные с SD-карт, независимо от того, являются ли они внешними или встроенными в устройство.
Если мне нужно было получить большой файл с SDCard и прочитать его в моем приложении, каков наилучший подход для этого?
Моя цель - просто получить файлы изображений с SDCard. Однако даже изображения могут быть относительно большими, если они являются несжатыми растровыми изображениями.
Я пробовал следующие подходы:
Создание нового приложения, которое не подписано как системный пользователь ( App2 ). Запустите службу, которая существует в этом App2 из App1 , затем прочитайте файл с карты SD, затем получите байт [] файла и отправьте его через AIDL для App1 кусками. Это работает с точки зрения чтения файла с SDCard и отправки его, однако AIDL имеет ограничение в 1 МБ для каждой транзакции и также очень медленный до такой степени, что я, вероятно, должен ограничить размер изображений, разрешенных для передачи приложению. чтобы сделать эту функцию полезной. Не самый идеальный на мой взгляд.
Я пытался использовать FileProvider в App 2 (UID: 10007) , однако в этом сценарии мне не нужно открывать какой-либо графический интерфейс для выбора нужного файла и целевого приложения. Мне нужно просто отправить его немедленно в Приложение 1 (UID: 10047) или получить его немедленно из Приложение 1 . Я не уверен, возможно ли использовать FileProvider без этих шагов графического интерфейса. Я попытался просто создать Uri из App2 , затем отправить Uri в App1 через AIDL, затем дать разрешения через context.grantUriPermissions (packageName, uri, READ / WRITE), но всегда заканчивалось с ошибкой безопасности, когда App1 не имеет разрешения на чтение URI App2 .
java.lang.SecurityException: Грант разрешения не найден для UID 10047 и контента Uri: //com.test.sdcard/folder/img.png
Где UID 10047 равен Приложение 1 , а UID 10007 равен Приложение 2 .
Есть ли альтернативные решения этой проблемы?