4

PDF ドキュメントを ParcelFileDescriptor として提供するカスタム コンテンツ プロバイダを実装しました。ファイルは、プライベートとしてマークされたローカル ストレージに保存されます。URI に基づいて、ドキュメントは選択された pdf アプリケーションに渡されます。

これは、Adobe Reader を除くすべての PDF Viewer アプリケーションで機能します。Adobe Reader がコンテンツ プロバイダーで動作しないことを誰か確認できますか? 以下のコード:

ドキュメントがダウンロードされた場合:

private void loadDocInReader(String doc) throws ActivityNotFoundException, Exception 
{
    Uri uri = Uri.parse(doc);   

    logger.debug("PDF Application ID is: " + pdfAppID);

    if (this.pdfAppID != null && this.pdfAppID.length() > 0) 
    {
        boolean pdfApplicationIsInstalled = checkPDFApplicationIsInstalled(this.pdfAppID);

        if(pdfApplicationIsInstalled) {
            Intent intent = new Intent();
            intent.setPackage(pdfAppID);
            intent.setData(uri);
            intent.setType("application/pdf");
            startActivity(intent);
        }
        else {
            logger.error("Please install Adobe Reader first!");
        }
    }
    else {
        Intent intent = new Intent();
        intent.setData(uri);
        intent.setType("application/pdf");
        startActivity(intent);
    }
}

Adobe Reader を除く他のすべての PDF ビューアー アプリは、このメソッドを呼び出します。

public class DocumentProvider extends ContentProvider 
{
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
{
    File file = null;

    try {

        file = new File(uri.getPath());
        logger.debug("Delivering ParcelFileDescriptor for path: " + file.getPath());
        return ParcelFileDescriptor.open(file,   ParcelFileDescriptor.MODE_READ_ONLY);

    } catch (FileNotFoundException e) {
        logger.error("Error loading Document: ",e);
    } finally {
        if(file.exists()) {
        file.delete();
        }
    }
    return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
}
}

Adobe Reader は常に「無効なファイル パス」と表示します。

前もって感謝します!!!ケイ。

4

2 に答える 2

1

私が判断できる限り、Adobe Reader は ContentProvider からファイルを読み取るための不安定なサポートを持っています。私の場合、openFile メソッドが呼び出され、有効な ParcelFileDescriptor が返されますが、Adobe Reader は「ドキュメントを開けませんでした」と報告します。私のコンテンツ プロバイダは、Play ストアのトップ PDF ビューアの一部である「Drive PDF Viewer」、「PDF Reader」、および「qPDF Reader」で正常に動作します。

Adobe Reader は、Gmail コンテンツ プロバイダーを使用して Gmail で PDF ファイルの添付ファイルを開くことができますが、それがどのように、またはなぜ機能するのかはわかりません。

于 2014-12-03T19:48:15.947 に答える
0

また、Adobe Acrobat Reader がカスタム プロバイダーで動作しないという問題があり、最終的に動作するようになりました。私の問題は、アプリ ローカル ファイル スペース内のファイルが暗号化され、その名前がハッシュされることでした。したがって、次のUriようなものでした:

content://my.app.provider/08deae8d9ea9bc0b84f94475d868351830e9f7e7

Adobe Reader を除く、私がテストしたすべての PDF ビューアー アプリで動作します。今日、Content Uri に拡張機能を追加する.pdf最後の試みを行いました(これは絶対に必要ではありません)。Adobe がopenFile()関数を呼び出すと、拡張機能が取り除かれます。出来上がり、それは動作します!!!

アップデート

クエリの結果として返される_display_name列にも拡張子が含まれていることを確認してください!!!ContentProviderquery(Uri, String[], String, String[], String).pdf

ノート

Adobe Acrobat Readerバージョン16.3でテスト済み

于 2016-09-23T08:36:31.787 に答える