Google docs kullanarak bir pdf açmak, kullanıcı deneyimi açısından kötü bir fikirdir. Gerçekten yavaş ve tepkisiz.
API 21'den sonraki çözüm
API 21'den beri, bir pdf'i Bitmap'e dönüştürmeye yardımcı olan PdfRenderer'a sahibiz . Hiç kullanmadım ama yeterince kolay görünüyor.
Herhangi bir API seviyesi için çözüm
Diğer bir çözüm, PDF'yi indirmek ve onu görüntüleyen bir banger işi yapacak olan özel bir PDF uygulamasına Intent aracılığıyla iletmektir. Hızlı ve güzel bir kullanıcı deneyimi, özellikle bu özellik uygulamanızın merkezinde değilse.
PDF'yi indirmek ve açmak için bu kodu kullanın
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);
}
}
});
}
}
Niyetin çalışması için, alıcı uygulamaya dosyayı açma izni vermek üzere bir FileProvider oluşturmanız gerekir .
İşte bunu nasıl uygulayacağınız: Manifest'inizde:
<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>
Son olarak kaynaklar dosyasında bir file_paths.xml dosyası oluşturun
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
Umarım bu yardımcı olur =)