PDFファイルを作成し、ローカルストレージに保存しています。これを開こうとすると、Android N.Iを除くすべてのデバイスで完全に機能します。 FileProviderを使用してPDFファイルをAndroid Nで開くことができますが、空白で表示されています。
これは私のURIです
content://com.products.provider/external_storage_root/Android/data/com.products/in_17052017_170502_1_1001.pdf
これは私のコードです
Uri path;
File pdfFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
+ "Android" + "/" + "data" + "/" + "com.products" + "/" + file);
if (Build.VERSION.SDK_INT >= 24) {
path = FileProvider.getUriForFile(getActivity(), "com.products.provider", pdfFile);
} else {
path = Uri.fromFile(pdfFile);
}
// Setting the intent for pdf reader
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
try {
startActivity(pdfIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(getActivity(), "Can't read pdf file", Toast.LENGTH_SHORT).show();
}
問題は、インテントにフラグを設定する方法にあります
pdfIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
代わりに、これを試してください:
pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
pdfIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
Grzegorz Matyszczakのソリューションは、私の場合に有効でした。私はサビヤサチと非常によく似たセットアップをしていました。より具体的には、この行により、PDFファイル(FileProvider.getURIForFile呼び出しからのURI)を確認できました。
pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
grantUriPermissions
here の詳細については、Android:grantUriPermissions
セクション。
ご覧のとおり、ヌガーにFileProvider
を使用しました。 AndroidManifest.xmlにFileProviderタグを追加する必要があります。
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="com.mydomain.fileprovider"
Android:exported="false"
Android:grantUriPermissions="true">
</provider>
FileProviderは、事前に指定したディレクトリ内のファイルのコンテンツURIのみを生成できます。このファイルをFileProviderにリンクするには、FileProviderを定義する要素の子として要素を追加します。
<provider
Android:name="Android.support.v4.content.FileProvider"
Android:authorities="${applicationId}.provider"
Android:exported="false"
Android:grantUriPermissions="true">
<meta-data
Android:name="Android.support.FILE_PROVIDER_PATHS"
Android:resource="@xml/file_paths"/>
</provider>
コンテンツURIが必要なファイルを含むディレクトリごとにの子要素を指定する必要があります。それらをres/xml/file_paths.xml
という新しいファイルに追加できます。たとえば、これらのXML要素は2つのディレクトリを指定します。
<paths xmlns:Android="http://schemas.Android.com/apk/res/Android">
<files-path name="my_images" path="images/"/>
<files-path name="my_docs" path="docs/"/>
</paths>
-> file_paths.xml
にPDFディレクトリパスを設定する必要があります
詳細については、 this を参照してください。
path = MyFileProvider.getUriForFile(getActivity(), "com.products.provider", pdfFile);
ここで、MyFileProvider
はFileProvider
を拡張するジェネリッククラスである必要があります。
public class MyFileProvider extends FileProvider {
}
provider
セクションのAndroid:name
属性に設定して、AndroidManifestを変更します。Android:name=".utils.MyFileProvider"