Ouvrir un pdf à l'aide de google docs est une mauvaise idée en termes d'expérience utilisateur. C'est vraiment lent et insensible.
Solution après API 21
Depuis l'API 21, nous avons PdfRenderer qui aide à convertir un pdf en Bitmap. Je ne l'ai jamais utilisé mais cela semble assez facile.
Solution pour tous les niveaux d'API
Une autre solution consiste à télécharger le PDF et à le transmettre via Intent à une application PDF dédiée qui fera un travail de banger pour l'afficher. Expérience utilisateur rapide et agréable, surtout si cette fonctionnalité n'est pas centrale dans votre application.
Utilisez ce code pour télécharger et ouvrir le 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);
}
}
});
}
}
Pour que l'intention fonctionne, vous devez créer un FileProvider pour accorder l'autorisation à l'application réceptrice d'ouvrir le fichier.
Voici comment vous l'implémentez: Dans votre manifeste:
<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>
Enfin, créez un fichier file_paths.xml dans le foler de ressources
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
J'espère que cela aide =)