Mở một bản pdf bằng google docs là một ý tưởng tồi về mặt trải nghiệm người dùng. Nó thực sự chậm và không phản hồi.
Giải pháp sau API 21
Kể từ api 21, chúng tôi có PdfRenderer giúp chuyển đổi pdf sang Bitmap. Tôi chưa bao giờ sử dụng nó nhưng nó có vẻ đủ dễ dàng.
Giải pháp cho mọi cấp độ api
Giải pháp khác là tải xuống PDF và chuyển nó qua Intent đến một ứng dụng PDF chuyên dụng sẽ thực hiện công việc hiệu quả hơn khi hiển thị nó. Trải nghiệm người dùng nhanh và tốt, đặc biệt nếu tính năng này không phải là trọng tâm trong ứng dụng của bạn.
Sử dụng mã này để tải xuống và mở 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);
}
}
});
}
}
Để Intent hoạt động, bạn cần tạo FileProvider để cấp quyền cho ứng dụng nhận mở tệp.
Đây là cách bạn triển khai nó: Trong Manifest của bạn:
<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>
Cuối cùng tạo tệp file_paths.xml trong tài nguyên foler
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
Hy vọng điều này sẽ giúp =)