1

Android アプリケーション内のファイル システムに保存した PDF を開く際に問題があります。

サーバーからバイト配列をシリアル化する残りの呼び出しがあり、このバイト配列を pdf ファイルとして保存します。この部分は正常に動作し、pdf が保存されているディレクトリに移動して、すべて問題なく開くことができます。

ただし、電話GS4(POLARIS Office View 5)またはAdobe Readerのデフォルトのpdfビューアを介してアプリケーション内からpdfを開こうとすると、両方のアプリケーションでファイルを開くことができません。POLARIS が「このドキュメントを開けません」というトーストを返します Adob​​e は起動しますが、その後スローされます ドキュメントのパスが無効です。

ファイルを永続化するための以下のコード。

private String createFile(AttachmentDTO dto) {
    String fileExtention = getMimeType(dto);    
    File file = new File(context.getExternalFilesDir(Constants.BASE_EXTERNAL_DIRECTORY_ATTACHMENTS),  dto.getId() + fileExtention);
    FileOutputStream fos;

    try {
        Files.write(dto.getAttachment(), file);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return file.getPath();
}

私のファイルのフルパスは

/storage/emulated/0/Android/data/com.rsd.childcare.mobile.client/files/attachments/2.pdf

今私の仮定は、許可のためにどちらのアプリもpdfを開くことができないということです。ただし、マニフェスト内に次のものがあります

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

WRITE_EXTERNAL_STORAGE を宣言すると READ パーミッションも得られることはわかっていますが、4.2 でこれが追加されたので、試してみようと思いましたが、まだ喜びはありません。

私が「考えた」もう1つのことは、「getExternalFilesDir」を呼び出して、これらのファイルへのサードパーティアプリへの読み取りアクセスを許可することでした??!!

以下のコードは、pdfを読み取ろうとしている方法を示しています

String filePath = Attachment.findAttachmentPath(Integer.parseInt((String) view.getContentDescription()));
        File file = new File(Environment.getExternalStorageDirectory() + filePath);
        Uri path = Uri.fromFile(file);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(path, "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        context.startActivity(intent);

誰かが私を正しい方向に向けることができれば、私は最も感謝しています

ありがとう

4

1 に答える 1

1

Uriパスを決定するためのコードが少し重複しているようです - を作成するためのコードとは異なるコードを使用して、パスを決定するようですIntent。それらが一致することは確かですか?

getExternalFilesDir(Constants.BASE_EXTERNAL_DIRECTORY_ATTACHMENTS)はファイルの作成にgetExternalStorageDirectory()使用され、 はUri. Logすべてが期待どおりに並んでいることを確認するために、いくつかのステートメントまたはブレークポイントをドロップすることをお勧めします。さらに良いことに、このロジックを少し統合して、両方の場所で同じ値を使用していることを確認してください。

于 2013-05-08T12:58:40.947 に答える