Совместное использование файлов или контента с действиями третьих лиц

1

У меня есть простой вопрос, но я не могу найти ответ в любом месте, где я смотрю онлайн.

У меня есть активность A, которая загружает файлы из Интернета и помещает их в локальную папку, полученную getApplicationContext(). GetFilesDir(). GetPath() указывает на: "/data/data/com.myapp.android/files"

Теперь, когда пользователь выбирает файл, я хочу показать его содержимое, и для этого я делаю следующее:

File file = new File(filePath);
Uri uri = Uri.fromFile(file);

MimeTypeMap mime = MimeTypeMap.getSingleton();
String type = mime.getMimeTypeFromExtension(fileExtension);

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(uri, type);

Intent intentChooser = Intent.createChooser(intent, "Open File");
startActivity(intentChooser);

Когда это выполняется, пользователю предоставляется диалоговое окно "Открыть файл", и после того, как они выберет "Галерея", действие "Галерея" появляется без ничего.

Посмотрев на logcat, я вижу следующее:

E/PanoMetadata(17732): Could not read file: /data/data/com.myapp.android/files/downloads/Splash.png
E/PanoMetadata(17732): java.io.FileNotFoundException: /data/data/com.myapp.android/files/downloads/Splash.png: open failed: EACCES (Permission denied)
E/PanoMetadata(17732):  at libcore.io.IoBridge.open(IoBridge.java:409)
E/PanoMetadata(17732):  at java.io.FileInputStream.<init>(FileInputStream.java:78)

Обратите внимание, что "open failed: EACCES (Permission denied)"

Но файл действительно есть, и я могу отображать его, используя свою активность A без проблем.

Проблема заключается в том, что другая деятельность, которая начинает использовать ACTION_VIEW (в данном случае Gallery), кажется, работает под другим процессом/пользователем, поэтому у нее нет доступа для чтения к моему файлу.

Мои 3 вопроса:

  1. Можно ли активировать действие ACTION_VIEW в рамках моего процесса и пользовательского контекста (активности A)?

  2. Как я могу делиться файлами между действиями? (Мне не нравится копировать файл под /sdcard/... но если это единственный вариант, который должен быть.)

  3. Есть ли способ передать содержимое файла (не указатель файла) из моей активности в действие галереи или другие действия?

С уважением!

  • 0
    Я не уверен, что это именно тот ответ, который вы ищете, но вы смотрели на поставщиков контента в Android. Это способ для вашего приложения поделиться своими данными с другим приложением.
  • 0
    Почему бы не положить файлы на внешнее хранилище (он же SD-карта)?
Теги:
android-activity
android-permissions
android-intent
android-gallery

2 ответа

1
Лучший ответ

Можно ли активировать действие ACTION_VIEW в рамках моего процесса и пользовательского контекста (активности A)?

Нет, и вы не хотите этого, из соображений безопасности.

Как я могу делиться файлами между действиями?

Насколько я могу судить, этот вопрос такой же, как ваш следующий.

Есть ли способ передать содержимое файла (не указатель файла) из моей активности в действие галереи или другие действия?

Лучшим решением является использование ContentProvider. Самое простое решение - использовать FileProvider, который вы можете просто добавить в манифест и настроить для работы с вашими файлами без необходимости создания подкласса. См. Также: http://developer.android.com/training/secure-file-sharing/index.html

  • 0
    FileProvider работал очень хорошо! Делили папку с приложениями и работали прекрасно. Благодарю.
0

Приложение не может получить личные данные другого приложения. Таким образом, "Галерея" не может достичь "data/data/com.myapp.android/files". Вам нужно поместить каталог общих файлов во внешнее хранилище.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню