Android 与第三方活动共享文件或内容

Android 与第三方活动共享文件或内容,android,android-intent,android-activity,android-gallery,android-permissions,Android,Android Intent,Android Activity,Android Gallery,Android Permissions,我有一个简单的问题,但似乎在网上的任何地方都找不到答案 我有一个活动A,它从internet下载文件,并将它们放在getApplicationContext().getFilesDir().getPath()获取的本地文件夹中,该文件夹指向:“/data/data/com.myapp.android/files” 现在,当用户选择一个文件时,我希望显示其内容,为此,我执行以下操作: File file = new File(filePath); Uri uri = Uri.fromFile(fi

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

我有一个活动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);
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)
当执行此操作时,用户将看到“打开文件”对话框,在用户选择“图库”后,图库活动将显示为空白

查看logcat,我看到以下内容:

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);
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)
E/panomatadata(17732):无法读取文件:/data/data/com.myapp.android/files/downloads/Splash.png
E/panomatadata(17732):java.io.FileNotFoundException:/data/data/com.myapp.android/files/downloads/Splash.png:open失败:EACCES(权限被拒绝)
E/panomatadata(17732):位于libcore.io.IoBridge.open(IoBridge.java:409)
E/panomatadata(17732):位于java.io.FileInputStream。(FileInputStream.java:78)
注意“打开失败:EACCES(权限被拒绝)”

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

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

我的3个问题是:

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

  • 如何在活动之间共享文件?(我不想复制/sdcard/…下的文件,但如果这是唯一选项,则必须复制。)

  • 是否有方法将文件内容(不是文件指针)从“我的活动”传递到“多媒体资料”活动或其他活动

  • 问候

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

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

    如何在活动之间共享文件

    据我所知,这个问题和你的下一个问题是一样的

    是否有方法将文件内容(不是文件指针)从“我的活动”传递到“多媒体资料”活动或其他活动


    最好的解决方案是使用
    ContentProvider
    。最简单的解决方案是,只需将其添加到清单并配置为提供文件,而无需创建子类。另请参见:

    一个应用程序无法访问另一个应用程序的私有数据。这样,“Gallery”就无法访问“data/data/com.myapp.android/files”。您需要将共享文件目录放在外部存储器中。

    我不确定这是否是您要寻找的确切答案,但您是否看过Android中的内容提供商。这是您的应用程序与其他应用程序共享数据的一种方式。为什么不将文件放在外部存储器(又名SD卡)上呢?FileProvider做得非常好!共享了我的应用程序子文件夹,效果很好。谢谢