Das Öffnen eines PDFs mit Google Docs ist im Hinblick auf die Benutzererfahrung eine schlechte Idee. Es ist sehr langsam und reagiert nicht.
Lösung nach API 21
Seit API 21 haben wir PdfRenderer, mit dessen Hilfe ein PDF in Bitmap konvertiert werden kann. Ich habe es nie benutzt, aber es scheint einfach genug zu sein.
Lösung für jedes API-Level
Eine andere Lösung besteht darin, das PDF herunterzuladen und über Intent an eine dedizierte PDF-App zu übergeben, die einen Banger-Job ausführt, bei dem es angezeigt wird. Schnelle und nette Benutzererfahrung, insbesondere wenn diese Funktion in Ihrer App nicht zentral ist.
Verwenden Sie diesen Code, um das PDF herunterzuladen und zu öffnen
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);
}
}
});
}
}}
Damit die Absicht funktioniert, müssen Sie einen FileProvider erstellen , um der empfangenden App die Berechtigung zum Öffnen der Datei zu erteilen.
So implementieren Sie es: In Ihrem 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>
Erstellen Sie abschließend eine Datei file_paths.xml im Ressourcenordner
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
Hoffe das hilft =)