android: sharedUserId = "android.uid.system" Получение файлов с SDCard - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть сценарий в Android (SDK 19 / KitKat 4.4.2), где мое приложение должно быть подписано как приложение системного уровня ( App 1 ) с использованием android: sharedUserId = "android.uid. система "в Manifest.xml. Это означает, что это приложение не может записывать или считывать данные с SD-карт, независимо от того, являются ли они внешними или встроенными в устройство.

Если мне нужно было получить большой файл с SDCard и прочитать его в моем приложении, каков наилучший подход для этого?

Моя цель - просто получить файлы изображений с SDCard. Однако даже изображения могут быть относительно большими, если они являются несжатыми растровыми изображениями.

Я пробовал следующие подходы:

  1. Создание нового приложения, которое не подписано как системный пользователь ( App2 ). Запустите службу, которая существует в этом App2 из App1 , затем прочитайте файл с карты SD, затем получите байт [] файла и отправьте его через AIDL для App1 кусками. Это работает с точки зрения чтения файла с SDCard и отправки его, однако AIDL имеет ограничение в 1 МБ для каждой транзакции и также очень медленный до такой степени, что я, вероятно, должен ограничить размер изображений, разрешенных для передачи приложению. чтобы сделать эту функцию полезной. Не самый идеальный на мой взгляд.

  2. Я пытался использовать 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 .

Есть ли альтернативные решения этой проблемы?

1 Ответ

0 голосов
/ 08 ноября 2018

Системное приложение не может читать с внешнего хранилища? Это новость для меня, но в любом случае.

Вы всегда можете просто создать канал и передать конец чтения обратно по выбранному вами механизму IPC (например, ContentProvider.call()). Служебная сторона запускает поток, записывает файл в конец записи и передает конец чтения обратно клиенту. Примерно так на стороне сервиса:

  ParcelFileDescriptor[] fds;
  try {
    fds = ParcelFileDescriptor.createPipe();
  } catch (IOException e) {
    e.printStackTrace();
    return false;
  }

  final ParcelFileDescriptor readFd = fds[0];
  final ParcelFileDescriptor writeFd = fds[1];

  // TODO: start a thread to write file to writeFd

  Bundle result = new Bundle();
  extras.putParcelable(EXTRA_READ_FD, readFd);

  return result; // Return from call() to client

Очевидно, что в качестве упражнения для читателя оставлено много стандартного кода.

...