我有一个简单的问题,但在网上看到的任何地方似乎都找不到答案。

我有一个活动A,该活动可以从Internet下载文件并将其放到由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)


请注意“打开失败:EACCES(权限被拒绝)”

但是文件确实存在,我可以使用活动A毫无问题地显示它。

问题似乎是开始使用ACTION_VIEW的其他活动(在本例中为Gallery)似乎在不同的进程/用户下运行,因此它没有对我的文件的读取权限。

我的三个问题是:


是否可以使ACTION_VIEW活动在我的流程和用户上下文(活动A)中运行?
如何在活动之间共享文件? (我不喜欢将文件复制到/ sdcard / ...下,但是如果这是唯一的选择,那么它将必须是。)
有没有办法将文件内容(而非文件指针)从我的活动传递到Gallery活动或其他活动?


问候!

最佳答案

是否可以使ACTION_VIEW活动在我的流程和用户上下文(活动A)中运行?


不,出于安全原因,您也不希望这样做。


  如何在活动之间共享文件?


据我所知,这个问题与您的下一个问题相同。


  有没有办法将文件内容(不是文件指针)从我的活动传递到Gallery活动或其他活动?


最好的解决方案是使用ContentProvider。最简单的解决方案是use FileProvider,您可以将其添加到清单中并进行配置以提供文件,而无需创建子类。另请参阅:http://developer.android.com/training/secure-file-sharing/index.html

07-28 01:21
查看更多