web-dev-qa-db-ja.com

FileProviderを使用すると、外部アプリでINTERNAL STORAGEからファイルを開くことができないのはなぜですか?

内部ストレージにファイルをインポートできるアプリを作成しました。外部アプリ(PFビューアや写真など)でファイルを開くために、次のガイドに従おうとしました: 公式ガイドtopic1topic2topic および topic4 ですが、成功しません。

これが私のコードです:

私のマニフェストで

<provider
   Android:name="Android.support.v4.content.FileProvider"
   Android:authorities="com.myapp.chatcher"
   Android:exported="false"
   Android:grantUriPermissions="true">
   <meta-data
       Android:name="Android.support.FILE_PROVIDER_PATHS"
       Android:resource="@xml/file_paths" />
</provider>

私のパッケージ値:package="com.myapp.catcher"

私のfile_paths.xml

<paths
    xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <files-path name="projection" path="." />
</paths>

私のコード

String fileName = path.substring(path.lastIndexOf("/") + 1);
String shelf = path.substring(path.lastIndexOf("PRIVATE") + 8, path.lastIndexOf("/"));
File filePath = new File(mContext.getFilesDir(), "PRIVATE".concat("/").concat(shelf).concat("/"));
File newFile = new File(filePath, fileName);
Uri contentUri = FileProvider.getUriForFile(mContext, "com.myapp.chatcher", newFile);

Intent myIntent = new Intent();
myIntent.setAction(Intent.ACTION_VIEW);
myIntent.setData(contentUri);
myIntent.setType(mimeType);
myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
mContext.startActivity(myIntent);

次のような階層を作成しました。

PRIVATE -> shelf1 -> my files

        -> shelf2 -> my files

        -> shelfN -> my files

例えば: data/user/0/com.myapp.chatcher/files/PRIVATE/testshelf/Screenshot_2017-01-04-09-45-13.png

newFile.getAbsolutePath()を出力した結果は次のとおりです。

/data/user/0/com.myapp.chatcher/files/PRIVATE/bogl/imagetest.jpg

このコードは、「写真」をクリックできるチューザーを開き、imagetest.jpgを表示せずに「写真アプリ」を開きますが、すべての写真が含まれているフォルダーです。 PDFファイルを試してみると、PDFが開かず、「メディアがありません」というメッセージが表示されたトーストが表示されます。

私のコードの何が問題になっていますか?

9
michoprogrammer

Androidエキスパートである@greenappsのおかげで、問題はプロバイダーではなく意図にあることがわかりました。

これの代わりに:

Intent myIntent = new Intent();
myIntent.setAction(Intent.ACTION_VIEW);
myIntent.setData(contentUri);
myIntent.setType(mimeType);
myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
mContext.startActivity(myIntent);

私はこれをする必要があります:

Intent myIntent = new Intent(Intent.ACTION_VIEW);
myIntent.setDataAndType(contentUri, mimeType);
myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
mContext.startActivity(myIntent);
14
michoprogrammer