2016-12-06 52 views
3

Android 4,5,6で正しく動作しているアプリがあります。このアプリケーションはサーバー内のリモートファイルを一覧表示し、サーバーからダウンロードできますファイル)。ファイルをクリックすると、それは "Android Downloads folder"にダウンロードされ、終了するとデフォルトのPDFリーダーで開きます。Android 7 - PDFを表示できません(pdf_nameは無効な形式です)

問題は、Android 7の同じコードが次のエラー(「PDFを表示できません(pdf_nameは無効な形式です)」に失敗していることです)。

ので、それは面白いです:私はダウンロードフォルダにアクセスし、ダウンロードしたファイルをクリックした場合、それが適切に開く

  • ダウンロードが完了すると、通知が表示されます。クリックすると通知が正しく開きます。

この問題は、同じAppがダウンロード後に自動的にファイルを開こうとする場合にのみ発生します。私は、ダウンロードするにはどうすればよい

:一度

fileName="file.pdf"; 
request = new DownloadManager.Request(Uri.parse(Constants.GetURL())); 
request.setMimeType(mime) 
    .setTitle(fileName).setVisibleInDownloadsUi(true) 
    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE) 
    .setDescription(mContext.getString(R.string.app_name)) 
    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) 
    .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); 
enqueue = dm.enqueue(request); 

がダウンロードされます:

Uri path = Uri.parse(c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))); 
//path contains the route where file was downloaded. Something like: file:///storage/emulated/0/Download/file.pdf 
    Intent pdfOpenintent = IntentHelper.getViewPDFIntent(path);            
    mContext.startActivity(pdfOpenintent); 

私はそれを開く方法:FileProviderについて

public static Intent getViewPDFIntent(Uri path){ 
    Intent i = new Intent(Intent.ACTION_VIEW); 
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    pdfOpenintent.setDataAndType(path, "application/pdf"); 
    return i; 
} 

を: 私が使用して実装されていますFileProviderと問題はtです彼は同じです。これはアクセス許可に関連していないため、ダウンロードフォルダはパブリックフォルダであり、SecurityException発生またはアクセス許可に関連するその他の例外はありません。

これは、ドキュメントを送信するためにGmailと同じ共有が行われるため、PDFアプリケーションとは関係ありません。

範囲外の振舞い:ステップごとにアプリケーションのステップをデバッグすると、完全に動作します。正常に実行すると失敗します。私が睡眠や5秒の遅れを入れた場合、動作しません。したがって、デバッグのみが機能します。

Android 7について:Android 7(https://developer.android.com/about/versions/nougat/android-7.0-changes.html)の正式な変更を読んで、それはうまくいくはずだが、これ以上はお勧めできません。それ以外の場合、動作しません。

新しいアイデアはありますか?

+1

どのPDFビューアを使用しますか?あなたはそれを 'path 'の値として与えているのですか? 'getViewPDFIntent()'とは何ですか? – CommonsWare

+0

こんにちは@CommonsWare私はあなたの質問に答えるコードを変更しました。どうも。 – Christian

+1

あなたが 'targetSdkVersion'を25以上に上げると、' file'' Uri'はAndroid 7.0以降では動作しません。既に 'FileProvider'への移動を開始したいかもしれません。そして、以前に尋ねたように、どのPDFビューアを使用しようとしていますか? – CommonsWare

答えて

1

調査の日や関係者の中には、アンドロイド7のDownloadManagerの動作をFileProviderの権限を追加するように変更したという結論に達しました。 (Android 7 Changelogで説明しています)

Android 7(および7.1)以降のAndroidは、一時フォルダにファイルを保存している可能性があります。その後、ブロードキャストファイルのダウンロードが正常に完了し、ファイルを最終ファイルに移動します。移動先フォルダ。

ファイルを移動する前にFileDownloaded Broadcastがジャンプするため、ファイルを開くことができません。つまり、デバッグや10秒間のスリープ状態が続いている間に、それが動作します。

は、ダウンロード&オープンのためDownloaderManagerの使用を停止し、私自身を実装するよりも、もっとこの問題のいずれかの解決策を見つけることができませんでした。 (ファイルのダウンロードだけに使用され、他の操作は含まれません)。

この問題を発見した次の人に役立つことを願っています。

-1

編集:
修正 もう少し掘り、これはアクセス許可の問題のようですが示されているが見つかりました。この許可を設定することで、問題が解決されました。

「android.permission.READ_EXTERNAL_STORAGE」


これは本当にそれを識別するのに役立つと周りの恐ろしい仕事を提供するために多くの情報を答える、私はまだコメントをするカントイマイチながら。

AsyncTaskを使用してPDFをダウンロードした後、同じ問題が発生しています。

doInBackground()は、すべての読み取り/書き込みストリームは()onPostExecute、閉鎖され、正常に完了し、このコードを使用して呼び出されます。

\t \t  Intent target = new Intent(Intent.ACTION_VIEW); 
 
\t \t  target.setDataAndType(Uri.fromFile(file), "application/pdf"); 
 
\t \t  target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
 
      Intent intent = Intent.createChooser(target, "View PDF Bill...");

とPDFの形式が無効ですエラーで起動に失敗します。

(既存のPDFの上にロードする)第二負荷PDFビューアの起動は、ほとんどの時間を正常に動作しますが、それでも時折失敗ありません。

私はデバッグする場合、それは私が10秒睡眠を追加する場合、私はそれがdoens't 9秒のスリープを追加する場合には、正常に動作し、(私はそれがかかる時間に起因すると仮定)罰金が開きます。そのファイルのクローズに失敗したり、OSで他の終了呼び出しがあったりするなど、例外は発生しませんが、例外は発生しません。

10秒の遅延は、私はコードが下のAndroid 7.0以上のすべてのデバイス上で正常に動作しているエクスプローラ

ファイルESからPDFを開こうとする場合にも適用されます。

関連する問題