Je souhaite afficher le contenu pdf sur WebView. Voici mon code:
WebView webview = new WebView(this);
setContentView(webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://www.Adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf");
Je reçois un écran vide. J'ai mis la permission d'Internet aussi.
Vous pouvez utiliser Google Docs Viewer pour lire votre pdf en ligne:
WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
String pdf = "http://www.Adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf";
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
Si vous utilisez la vue uniquement, l'utilisateur n'est pas susceptible de se connecter à son compte Google.
https://docs.google.com/viewer?url=http://my.domain.com/yourPdfUrlHere.pdf
L'ouverture d'un fichier PDF à l'aide de Google Documents est une mauvaise idée en termes d'expérience utilisateur. C'est vraiment lent et insensible.
Depuis api 21, nous avons PdfRenderer , qui aide à convertir un fichier PDF en Bitmap. Je ne l'ai jamais utilisé mais cela semble assez facile.
Une autre solution consiste à télécharger le PDF et le transmettre via Intent à une application PDF dédiée qui effectuera un travail de banger en l'affichant. Expérience utilisateur simple et rapide, 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 afin d’autoriser l’application réceptrice à ouvrir le fichier.
Voici comment vous le mettez en œuvre: 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 chemin_fichier.xml dans le répertoire des ressources.
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
J'espère que cela aide =)
Ici charger avec progressDialog. Besoin de donner WebClient sinon il oblige à ouvrir dans le navigateur:
final ProgressDialog pDialog = new ProgressDialog(context);
pDialog.setTitle(context.getString(R.string.app_name));
pDialog.setMessage("Loading...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
WebView webView = (WebView) rootView.findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pDialog.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pDialog.dismiss();
}
});
String pdf = "http://www.Adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf";
webView.loadUrl("https://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
Utilisez ce code:
private void pdfOpen(String fileUrl){
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
//---you need this to prevent the webview from
// launching another browser when a url
// redirection occurs---
webView.setWebViewClient(new Callback());
webView.loadUrl(
"http://docs.google.com/gview?embedded=true&url=" + fileUrl);
}
private class Callback extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(
WebView view, String url) {
return (false);
}
}
En fait, toutes les solutions étaient assez complexes et j'ai trouvé une solution très simple (je ne sais pas si elle est disponible pour toutes les versions de SDK). Il ouvrira le document pdf dans une fenêtre d’aperçu dans laquelle l’utilisateur pourra visualiser et sauvegarder/partager le document:
webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
val i = Intent(Intent.ACTION_QUICK_VIEW)
i.data = Uri.parse(url)
startActivity(i)
})
(Kotlin)
C’est la utilisation réelle limite que Google autorise avant d’obtenir l’erreur mentionnée dans les commentaires , si c’est une fois dans un durée de vie pdf que l'utilisateur va ouvrir dans l'application, alors je me sens tout à fait en sécurité. Bien qu'il soit conseillé de suivre l'approche native en utilisant le framework intégré dans Android à partir de Android 5.0/Lollipop, il s'appelle PDFRenderer .