android: откройте pdf из моего приложения, используя встроенный просмотрщик pdf
Это был мой исходный вопрос:
Я хочу иметь возможность открыть файл pdf в моем приложении с помощью встроенного android pdf viewer приложение, но я не знаю, как запуск других приложений. Я уверена, что должна. позвони, начни действовать, я просто не знаю. как определить приложение im Открытие и как передать файл в этот конкретный приложение.
У кого-нибудь есть ключ?
Я только что узнал, что просмотрщик pdf у меня на телефоне на самом деле сделан HTC и Adobe едва выпустили свой Android pdf viewer (что здорово). Итак, новый вопрос: Как проверить, что пользователь установил Adobe viewer, а затем как открыть файл в этом приложении из моего приложения?
9 ответов
AFAIK, Adobe не документировала никаких публичных Intents
Он хочет, чтобы разработчики использовали.
вы можете попробовать ACTION_VIEW
Intent
С Uri
указывая на файл (либо на SD-карте, либо MODE_WORLD_READABLE
в вашем приложении-локальном хранилище файлов) и тип MIME "application/pdf"
.
вы можете программно определить, существует ли подходящее приложение на устройстве пользователя, без перехвата исключений.
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
}
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;
}
}
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);
}
хотя это довольно старая тема, вот решение для открытия PDF-файла,который находится в активе / папке с внешним приложением для чтения PDF. Он использует пользовательский контент-провайдер:https://github.com/commonsguy/cwac-provider
используя это, вы можете определить любой файл, который будет предоставлен из папки assets/или res/ raw/.
попробуйте! Лучшее и простое решение, которое я нашел до сих пор.
Я также столкнулся с той же проблемой, когда пытался отобразить PDF на устройстве android и, наконец, в конечном итоге с решением (интеграция библиотеки PDF 3rd party)
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, а затем использовать его в приложении в качестве банки или java и т. д. хорошая статья, чтобы объяснить использование этой библиотеки @ http://dixitpatel.com/integrating-pdf-in-android-application/
Android имеет встроенный фреймворк от Android 5.0 / Lollipop, он называется PDFRenderer. Если вы можете предположить, что ваши пользователи имеют Android 5.0, это, вероятно, лучшее решение.
на сайте разработчика Google есть официальный пример:
http://developer.android.com/samples/PdfRendererBasic/index.html
Он не поддерживает аннотации или другие более продвинутые функции; для тех, кто действительно вернулся к использование намерения открыть полное приложение или встраивание SDK, например mupdf.
(отказ от ответственности: я очень иногда работаю над mupdf.)
добавить 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>
в дополнение к тем, которые отмечены как ответ, вам понадобятся эти разрешения в манифесте.в 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" />
**