Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android外部应用程序可以';t访问应用程序';s文件_Android_Android 4.0 Ice Cream Sandwich - Fatal编程技术网

Android外部应用程序可以';t访问应用程序';s文件

Android外部应用程序可以';t访问应用程序';s文件,android,android-4.0-ice-cream-sandwich,Android,Android 4.0 Ice Cream Sandwich,我正试图在另一个查看器(如股票库或PDF查看器)中打开我在一个应用程序上下载的文件。以下是我保存文件的方式: FileOutputStream fos = null; try { fos = from.openFileOutput(name, Context.MODE_WORLD_READABLE); fos.write(data); //data is my byte[] fos.flush(); fos.close(); }catch...

我正试图在另一个查看器(如股票库或PDF查看器)中打开我在一个应用程序上下载的文件。以下是我保存文件的方式:

FileOutputStream fos = null;

try {
      fos = from.openFileOutput(name, Context.MODE_WORLD_READABLE);
      fos.write(data); //data is my byte[]
      fos.flush();
      fos.close();
}catch...

// at this point the file IS written to the path. I can SFTP to my [rooted] device
// and can download the file, it's valid, it opens on my computer.

File outputFile = new File(from.getFilesDir().getAbsolutePath() + "/" + name);
if(!outputFile.exists()){
  //show some error message
  //we are NOT entering here, just a programmatic check that it exists.
  return;
}
String mime = MimeTypeMap.getSingleton().getMimeTypeFromExtension("." + extension.toUpperCase()); //extension is file extension as String
//if it doesn't work, I set it manually to some valid one by looking at the extension myself.
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(outputFile.getAbsolutePath()), mime);
intent.setAction(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

我可以看到“打开”对话框(它是正确的,例如,为PNG文件显示gallery,如果是PDF等,则显示Adobe Reader),并且活动正确打开。但是,他们无法访问该文件。为什么他们不能访问该文件?

在Android中有几种存储数据的方法,正如我所看到的,默认情况下,内存中的存储对于你的应用程序来说是“私有的”(我认为你正在这样做),所以从另一个应用程序访问数据就不那么简单了

解决方案似乎是使用“外部存储器”(可以是移动或可移动SD卡的内部存储器)

,您可以在其中找到此类存储的一些示例:

与第三方应用程序共享流的官方方式是通过
文件提供程序
,这些流来自应用程序的内部存储
FileProvider
ContentProvider
的一个实现,它为您处理共享这些流的问题


FileProvider
将适用于大多数编写良好的Android应用程序。有时,您共享或发送内容的应用程序会因
FileProvider
而失败,因为编写该应用程序的人很懒惰,他们认为所有内容都来自
MediaStore
,并且您始终可以将
Uri
映射到文件。为了帮助与那些坏掉的客户端兼容,我有一个建议,你可以将它融入你的
文件提供程序
,它提供了一个固定的实现。

模式世界可读的
已经被弃用,而且从一开始就不是一个好主意
FLAG\u GRANT\u READ\u URI\u权限
与文件权限无关,而是与
ContentProvider
权限有关。我建议您添加以提供该文件。您正在将该应用程序存储在应用程序的私有内存中。我认为您必须将该文件存储在SD卡中,以便其他应用程序可以访问它。内存是应用程序的专用内存,其他应用程序无法访问它。@Commonware我已经使用了
文件提供程序
,谢谢。