内部ストレージにファイルをインポートできるアプリを作成しました。外部アプリ(PFビューアや写真など)でファイルを開くために、次のガイドに従おうとしました: 公式ガイド 、 topic1 、 topic2 、 topic および 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が開かず、「メディアがありません」というメッセージが表示されたトーストが表示されます。
私のコードの何が問題になっていますか?
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);