Android: открыть PDF из моего приложения, используя встроенный просмотрщик PDF - PullRequest
29 голосов
/ 26 мая 2010

Это был мой оригинальный вопрос:

Я хочу иметь возможность открыть PDF-файл в моем приложении, используя встроенный Android приложение для просмотра PDF, но я не знаю, как запустить другие приложения. Я уверен, что должен позвонить начать деятельность, я просто не знаю как определить приложение, которое я открываю и как передать файл в этот конкретный приложение.

У кого-нибудь есть подсказка?

Я только что узнал, что просмотрщик PDF, который у меня есть на моем телефоне, на самом деле сделан HTC, и что Adobe только выпустила свой Android Viewer PDF (что здорово) Итак, новый вопрос заключается в следующем: как я могу убедиться, что пользователь установил Adobe Viewer, и как мне открыть файл в этом приложении из моего приложения?

Ответы [ 9 ]

40 голосов
/ 21 мая 2012

Вы можете программно определить, существует ли подходящее приложение на устройстве пользователя, без перехвата исключений.

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
}
16 голосов
/ 27 мая 2010

AFAIK, Adobe не задокументировала какую-либо общедоступную Intents, которую она хочет использовать разработчикам.

Вы можете попробовать ACTION_VIEW Intent с Uri, указывающим на файл (либо на SD-карте, либо MODE_WORLD_READABLE в вашем локальном хранилище приложений), и тип MIME * 1008.*.

5 голосов
/ 31 октября 2011
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;
    }
}
3 голосов
/ 04 апреля 2013
            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);             

            }
2 голосов
/ 03 марта 2014

Хотя это довольно старая тема, здесь есть решение для открытия PDF-файла, который находится в ресурсе / папке с помощью внешнего приложения для чтения PDF. Он использует пользовательский контент-провайдер: https://github.com/commonsguy/cwac-provider

Используя это, вы можете определить любой файл, который будет предоставлен из папки assets / или res / raw /.

Попробуй! Лучшее и простое решение, которое я нашел до сих пор.

1 голос
/ 11 апреля 2016

Android имеет встроенный фреймворк из Android 5.0 / Lollipop, он называется PDFRenderer . Если вы можете предположить, что у ваших пользователей Android 5.0, это, вероятно, лучшее решение.

На сайте разработчиков Google есть официальный пример:

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

Он не поддерживает аннотации или другие более продвинутые функции; для тех, кто действительно вернулся к использованию Intent для открытия полного приложения или к встраиванию SDK, например mupdf .

(Отказ от ответственности: я очень редко работаю над mupdf.)

1 голос
/ 17 августа 2015

Я также столкнулся с той же проблемой, когда пытался отобразить PDF на устройстве Android и, наконец, нашел решение (интеграция сторонней библиотеки PDF)

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

пока я тестировал несколько библиотек для перечисленных ниже, которые также работают,

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

& mupdf, который поставляется со вкусом ndk (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/

0 голосов
/ 07 июня 2018

Добавить 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);

также добавьте provider_paths.xml в папку res -> 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 голосов
/ 21 декабря 2016

В дополнение к тем, которые помечены как ответы, вам понадобятся эти разрешения в manifest.xml

**

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

**

...