У меня есть простой вопрос, но я не могу найти ответ в любом месте, где я смотрю онлайн.
У меня есть активность 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 вопроса:
Можно ли активировать действие ACTION_VIEW в рамках моего процесса и пользовательского контекста (активности A)?
Как я могу делиться файлами между действиями? (Мне не нравится копировать файл под /sdcard/... но если это единственный вариант, который должен быть.)
Есть ли способ передать содержимое файла (не указатель файла) из моей активности в действие галереи или другие действия?
С уважением!
Можно ли активировать действие ACTION_VIEW в рамках моего процесса и пользовательского контекста (активности A)?
Нет, и вы не хотите этого, из соображений безопасности.
Как я могу делиться файлами между действиями?
Насколько я могу судить, этот вопрос такой же, как ваш следующий.
Есть ли способ передать содержимое файла (не указатель файла) из моей активности в действие галереи или другие действия?
Лучшим решением является использование ContentProvider
. Самое простое решение - использовать FileProvider
, который вы можете просто добавить в манифест и настроить для работы с вашими файлами без необходимости создания подкласса. См. Также: http://developer.android.com/training/secure-file-sharing/index.html
Приложение не может получить личные данные другого приложения. Таким образом, "Галерея" не может достичь "data/data/com.myapp.android/files". Вам нужно поместить каталог общих файлов во внешнее хранилище.