web-dev-qa-db-ja.com

PDFファイルを開いたときAndroid Nougatは空白の画面を表示しています

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();
        }
10
Sabya Sachi

問題は、インテントにフラグを設定する方法にあります

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);
40

Grzegorz Matyszczakのソリューションは、私の場合に有効でした。私はサビヤサチと非常によく似たセットアップをしていました。より具体的には、この行により、PDFファイル(FileProvider.getURIForFile呼び出しからのURI)を確認できました。

pdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

grantUriPermissionshere の詳細については、Android:grantUriPermissions セクション。

7
Andrey P.

ご覧のとおり、ヌガーに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 を参照してください。

4
Akshay
  1. FileProviderクラスをMyFileProviderクラスに置き換えます。

path = MyFileProvider.getUriForFile(getActivity(), "com.products.provider", pdfFile);

ここで、MyFileProviderFileProviderを拡張するジェネリッククラスである必要があります。

public class MyFileProvider extends FileProvider {
}
  1. MyFileProviderクラスの場所をproviderセクションのAndroid:name属性に設定して、AndroidManifestを変更します。
Android:name=".utils.MyFileProvider"
0