web-dev-qa-db-ja.com

android:組み込みのpdfビューアを使用して、アプリからpdfを開きます

これは私の最初の質問でした:

Androidに組み込まれているpdfビューアアプリを使用して、アプリでpdfファイルを開くことができるようにしたいのですが、他のアプリを起動する方法がわかりません。開始アクティビティを呼び出す必要があると確信しています。開いているアプリを特定する方法と、その特定のアプリにファイルを渡す方法はわかりません。

誰にも手がかりがありますか?

私の携帯電話にあるpdfビューアは実際にHTCによって作成され、AdobeはAndroid pdfビューア(これは素晴らしい)です)をリリースしたことを知りました。ユーザーがAdobeのビューアをインストールしたことを確認し、アプリからそのアプリでファイルを開くにはどうすればよいですか?

29
mtmurdock

知る限りでは、アドビは開発者が使用することを望んでいるパブリックIntentsを文書化していません。

ACTION_VIEWIntentを試すことができます。Uriは、ファイル(SDカードまたはアプリローカルファイルストアのMODE_WORLD_READABLE)を指し、MIMEタイプは"application/pdf"

16
CommonsWare

例外をキャッチすることなく、ユーザーのデバイスに適切なアプリケーションが存在するかどうかをプログラムで判断できます。

Intent intent = new Intent(Intent.ACTION_VIEW,
        Uri.parse("path-to-document"));
intent.setType("application/pdf");
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
if (activities.size() > 0) {
    startActivity(intent);
} else {
    // Do something else here. Maybe pop up a Dialog or Toast
}
40
Karakuri
private void loadDocInReader(String doc)
     throws ActivityNotFoundException, Exception {

    try {
                Intent intent = new Intent();

                intent.setPackage("com.Adobe.reader");
                intent.setDataAndType(Uri.parse(doc), "application/pdf");

                startActivity(intent);

    } catch (ActivityNotFoundException activityNotFoundException) {
                activityNotFoundException.printStackTrace();

                throw activityNotFoundException;
    } catch (Exception otherException) {
                otherException.printStackTrace();

                throw otherException;
    }
}
5
SALMAN
            FileFinalpath = SdCardpath + "/" + Filepath + Filename;
            File file = new File(FileFinalpath);
            if (file.exists()) {
                Uri filepath = Uri.fromFile(file);
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(filepath, "application/pdf");
                intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                try {
                    startActivity(intent);
                } catch (Exception e) {
                    alert.showAlertDialog(PDF_Activity.this, "File Not Started...","File Not Started From SdCard ", false);             
                    Log.e("error", "" + e);
                }

            } else {
                alert.showAlertDialog(PDF_Activity.this, "File Not Found...","File Not Found From SdCard ", false);             

            }
3
Karan Mavadhiya

これはかなり古いトピックですが、ここでは外部のPDFリーダーアプリでasset /フォルダーにあるPDFを開くためのソリューションです。カスタムコンテンツプロバイダー: https://github.com/commonsguy/cwac-provider

これを使用して、assets /またはres/raw /フォルダーから提供されるファイルを定義できます。

それを試してみてください!これまでに見つけた最良かつ最も簡単なソリューション。

2
david.schreiber

AndroidにはAndroid 5.0/Lollipopの組み込みフレームワークがあり、 PDFRenderer と呼ばれます。ユーザーがAndroid 5.0を持っていると仮定できる場合、それがおそらく最良のソリューションです。

Googleの開発者向けサイトには公式の例があります。

http://developer.Android.com/samples/PdfRendererBasic/index.html

アノテーションやその他の高度な機能はサポートしていません。 Intentを使用して完全なアプリを開くか、 mupdf のようなSDKを埋め込むことに本当に戻ってください。

(免責事項:mupdfで作業することは非常にまれです。)

1
JosephH

PDF on Androidデバイスと最終的にソリューション(サードパーティPDFライブラリ統合)

https://github.com/JoanZapata/Android-pdfview

以下にリストされている複数のライブラリもテストしましたが、これらも機能しますが、

https://github.com/jblough/Android-Pdf-Viewer-Library

&ndkフレーバーに付属するmupdf( https://code.google.com/p/mupdf/downloads/detail?name=mupdf-1.2-source.Zip&can=2&q= )および必要NDKで抽出し、アプリケーションでjarまたはJavaなどとして使用します。このライブラリの使用方法を説明する素晴らしい記事@ http://dixitpatel.com/integrating-pdf -in-Android-application /

1
paxbat

FLAG_GRANT_READ_URI_PERMISSIONを追加

Intent intent = new Intent(Intent.ACTION_VIEW)
Uri outputFileUri = FileProvider.getUriForFile(getActivity(), BuildConfig.APPLICATION_ID + ".provider", file); 
intent.setDataAndType(outputFileUri, "application/pdf"); 
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
Intent in = Intent.createChooser(intent, "Open File");
startActivity(in);

res-> xmlフォルダーでprovider_paths.xmlを追加し、マニフェストで以下のコードを追加する必要があります

<application>
   <provider
            Android:name="Android.support.v4.content.FileProvider"
            Android:authorities="${applicationId}.provider"
            Android:exported="false"
            Android:grantUriPermissions="true"
            tools:replace="Android:authorities">
            <meta-data
                tools:replace="Android:resource"
                Android:name="Android.support.FILE_PROVIDER_PATHS"
                Android:resource="@xml/provider_paths" />
        </provider>
 </application>
0
Rezaul Karim