Otwieranie pliku PDF za pomocą dokumentów Google to zły pomysł pod względem wrażeń użytkownika. Jest naprawdę powolny i nie odpowiada.
Rozwiązanie po API 21
Od api 21 mamy PdfRenderer który pomaga konwertować plik PDF do Bitmap. Nigdy go nie używałem, ale wydaje się dość łatwe.
Rozwiązanie dla dowolnego poziomu API
Innym rozwiązaniem jest pobranie pliku PDF i przekazanie go przez Intent do dedykowanej aplikacji PDF, która wykona niezłą robotę, wyświetlając go. Szybkie i przyjemne wrażenia użytkownika, zwłaszcza jeśli ta funkcja nie jest najważniejsza w Twojej aplikacji.
Użyj tego kodu, aby pobrać i otworzyć plik PDF
public class PdfOpenHelper {
public static void openPdfFromUrl(final String pdfUrl, final Activity activity){
Observable.fromCallable(new Callable<File>() {
@Override
public File call() throws Exception {
try{
URL url = new URL(pdfUrl);
URLConnection connection = url.openConnection();
connection.connect();
// download the file
InputStream input = new BufferedInputStream(connection.getInputStream());
File dir = new File(activity.getFilesDir(), "/shared_pdf");
dir.mkdir();
File file = new File(dir, "temp.pdf");
OutputStream output = new FileOutputStream(file);
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
return file;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<File>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(File file) {
String authority = activity.getApplicationContext().getPackageName() + ".fileprovider";
Uri uriToFile = FileProvider.getUriForFile(activity, authority, file);
Intent shareIntent = new Intent(Intent.ACTION_VIEW);
shareIntent.setDataAndType(uriToFile, "application/pdf");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (shareIntent.resolveActivity(activity.getPackageManager()) != null) {
activity.startActivity(shareIntent);
}
}
});
}
}
Aby intencja działała, musisz utworzyć FileProvider, aby udzielić aplikacji odbierającej uprawnienia do otwarcia pliku.
Oto jak to wdrażasz: W swoim Manifeście:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
Na koniec utwórz plik file_paths.xml w filtrze zasobów
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
Mam nadzieję, że to pomoże =)