Android Java:如何在另一个应用程序中使用FileProvider打开下载的文件

时间:2016-11-01 06:24:59

标签: java android android-fileprovider

我有以下设置,但在第三方应用中打开文件时,找不到该文件。

下载文件(以字节为单位)后,我将其存储。

public File storeFile(byte[] b, String ref) throws IOException {
      String           path = String.valueOf(ref).replaceAll("/+", "_");
      final File       f    = new File(A.getDir(path, Context.MODE_PRIVATE), "downloads");
      FileOutputStream out  = new FileOutputStream(f);
      out.write(b);
      out.flush();
      out.close();
      return f;
   }

然后尝试阅读并打开它。

try {
    Uri  uri               = Uri.fromFile(storeFile(bytes, ref));
    MimeTypeMap mime       = MimeTypeMap.getSingleton();
    Intent      i          = new Intent(Intent.ACTION_VIEW);
    String      type       = mime.getMimeTypeFromExtension(ext);
    File        imagePath  = new File(getFilesDir(), "downloads");
    File        file    = new File(imagePath, uri.getPath());
    Uri         newUri     = FileProvider.getUriForFile(context, "com.do.app.fileprovider", file);

    i.setDataAndType(uriContent, type);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    A.startActivity(i);
} catch (IOException e) {
    e.printStackTrace();
}

并且在清单中

<provider
     android:name="android.support.v4.content.FileProvider"
     android:authorities="com.do.app.fileprovider"
     android:exported="false"
     android:grantUriPermissions="true">
     <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/provider_paths"/>
</provider>

路径

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="cloud_files" path="downloads"/>
</paths>

我似乎无法找到我失踪的东西。

1 个答案:

答案 0 :(得分:0)

File        imagePath  = File(getFilesDir(), "downloads");

这是

中使用的完全不同的目录
 File       f    = new File(A.getDir(path, Context.MODE_PRIVATE), "downloads");

只需比较imagePath.getAbsolutePath()f.getAbsolutePath();

最好不要构造相同的路径或File实例两次,而是使用一个变量。

更新。

我现在看到你的代码更糟糕了。

Uri  uri               = Uri.fromFile(storeFile(bytes, ref));
Uri         newUri     = FileProvider.getUriForFile(context, "com.do.app.fileprovider", file);

您根本没有使用urinewUri,而是contentUri。为什么两个/三个uries?改为一个。

Uri uri  = FileProvider.getUriForFile(context
        , "com.do.app.fileprovider"
        , storeFile(bytes, ref));

然后将uri与setDataAndType()放在已使用的意图中。