前提・実現したいこと
android studioを利用し、PDFを表示するアプリを作成しています。
具体的には、作成アプリでPDFをサーバから取得し、adobe acrobat readerで表示しています。
アプリの固有の外部ストレージからURIを生成し、intentでACTION_VIEWを渡すことで、PDFを表示することはできました。
ただ実際は、指定したPDFをacrobat readerがローカルストレージに複製を保存し、それを表示しているようです。
PDFを端末に残したくありません。(自作アプリに落としたPDFは自分で消しています)
acrobat readerの内部にコピーを作成させず、表示だけするにはどうすればよいのでしょうか。
ご解答、よろしくお願いします。
発生している問題・エラーメッセージ
次善の方法としては、コピーされたPDFを削除することも考えています。 acrobat readerだと内部ストレージにコピーされてしまうので、難しいと思っています。 別のビューアで試してみたところ、やはりコピーはされるのですが、外部領域のようなので、こちらは自作アプリから削除できそうです。 (メインストレージ/ezPDFREADER/bookdata/library) ただ、file.existで存在チェック・WRITE_EXTERNAL_STORAGEを確認したうえで、deleteを投げているのですが、AccessDeniedExceptionが返ってきます。
該当のソースコード
//adobe acrobat readerに渡すintent File shareFile =new File("/storage/emulated/0/Android/data/(パッケージ名)/files/(mkdirしたフォルダ)/temp.pdf"); Uri shareUri =FileProvider.getUriForFile(getApplicationContext(), BuildConfig.APPLICATION_ID + ".FileProvider", shareFile); Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(shareUri, "application/pdf"); // 別タスクとして実行 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); //権限付与 intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); //acrobatを指定 intent.setPackage("com.adobe.reader"); startActivity(intent); //コピーされたPDFの削除 if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==PackageManager.PERMISSION_GRANTED) { }else { //ここは通らないので権限はあるはず int PER_REQ_CODE = 1001; String per_req[] = new String[0]; ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},PER_REQ_CODE); } folderPath ="/storage/emulated/0/ezPDFReader/bookdata/library/temp.pdf"; File filedele = new File(folderPath); if(filedele.exists()) { try { //ここに入るので存在している Boolean fileio = filedele.canRead();//falseが返ってくる Boolean filecandele = filedele.delete();//falseが返ってくる java.nio.file.Files.delete(java.nio.file.Paths.get(folderPath)); } catch (Exception e){ e.printStackTrace(); //AccessDeniedExcptionが返ってくる }finally { } }
試したこと
intentのactionをVIEW以外にしてみました。
MAINやEDITだと開けましたが、やはりコピーされてしまいます。
補足情報(FW/ツールのバージョンなど)
・PDFを更新せずに何度もintentを投げてもコピーは作成されません。
タイムスタンプが変わると別ファイルと認識するのか、新規にコピーが作成されてしまいます。
その場合、android studioのログを見てみても、コピーされる場合・されない場合での違いが見つかりませんでした。
・コピーされる場所
ezPDFReader:ソースに記述
adobe acrobat reader:ユーザーデータ?
(アプリ情報-ストレージから確認。PDFの分だけ容量が増えるので。
/storage/emulated/0/Android/data/com.adobe.reader/files/ではないです。)
・adobe acrobat readerを立ち上げてPDFを開く場合
「ファイル-その他のファイルを参照」から開くと以下メッセージが表示され、コピーが作成されます。
「Adobe Acrobatによって自動的に文書のローカルコピーが作成されます」
PDFに何かステータスが付いているのかとも考えましたが、上記のように同じPDFでもオペレーションによりコピーされる場合があることから、intentの属性のような気もします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/21 00:50