Membuka pdf menggunakan google docs adalah ide yang buruk dalam hal pengalaman pengguna. Ini sangat lambat dan tidak responsif.
Solusi setelah API 21
Sejak api 21, kami memiliki PdfRenderer yang membantu mengonversi pdf ke Bitmap. Saya belum pernah menggunakannya tetapi tampaknya cukup mudah.
Solusi untuk level api apa pun
Solusi lainnya adalah mengunduh PDF dan menyebarkannya melalui Intent ke aplikasi PDF khusus yang akan menampilkannya secara banger. Pengalaman pengguna yang cepat dan menyenangkan, terutama jika fitur ini tidak menjadi pusat aplikasi Anda.
Gunakan kode ini untuk mengunduh dan membuka 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);
}
}
});
}
}
Agar Intent berfungsi, Anda perlu membuat FileProvider untuk memberikan izin kepada aplikasi penerima untuk membuka file.
Berikut adalah cara Anda menerapkannya: Dalam Manifes Anda:
<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>
Terakhir buat file file_paths.xml di foler sumber daya
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
Semoga ini membantu =)