การเปิด pdf โดยใช้ Google เอกสารเป็นความคิดที่ไม่ดีในแง่ของประสบการณ์ของผู้ใช้ มันช้าและไม่ตอบสนองจริงๆ
วิธีแก้ไขหลังจาก API 21
ตั้งแต่ api 21 เรามีPdfRendererซึ่งช่วยแปลง pdf เป็น Bitmap ฉันไม่เคยใช้ แต่ดูเหมือนง่ายพอ
โซลูชันสำหรับระดับ API ใด ๆ
วิธีแก้ปัญหาอื่น ๆ คือการดาวน์โหลด PDF และส่งผ่าน Intent ไปยังแอพ PDF เฉพาะซึ่งจะทำให้งานแสดงผลเสีย ประสบการณ์การใช้งานที่รวดเร็วและดีโดยเฉพาะอย่างยิ่งหากคุณลักษณะนี้ไม่ได้เป็นศูนย์กลางในแอปของคุณ
ใช้รหัสนี้เพื่อดาวน์โหลดและเปิด 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 ทำงานคุณต้องสร้างFileProviderเพื่อให้สิทธิ์แก่แอปที่รับเพื่อเปิดไฟล์
นี่คือวิธีที่คุณนำไปใช้: ในไฟล์ Manifest ของคุณ:
<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>
สุดท้ายสร้างไฟล์ file_paths.xml ในทรัพยากร foler
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
หวังว่านี่จะช่วยได้ =)