Pdfコンテンツをwebviewに表示したい。ここに私のコードがあります:
WebView webview = new WebView(this);
setContentView(webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadUrl("http://www.Adobe.com/devnet/acrobat/pdfs/pdf_open_parameters.pdf");
空白の画面が表示されます。インターネットの許可も設定しました。
Googleドキュメントビューアーを使用して、pdfをオンラインで読むことができます。
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);
ビューのみのURLを使用する場合、ユーザーはGoogleアカウントへのログインを求められません。
https://docs.google.com/viewer?url=http://my.domain.com/yourPdfUrlHere.pdf
Googleドキュメントを使用してPDFを開くことは、ユーザーエクスペリエンスの観点から悪い考えです。本当に遅くて応答しません。
API 21以降、PDFをビットマップに変換するのに役立つ PdfRenderer があります。私はそれを使用したことがありませんが、十分簡単に思えます。
他の解決策は、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 を作成して、受信側アプリにファイルを開く許可を付与する必要があります。
実装方法は次のとおりです。マニフェスト内:
<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>
最後に、リソースfolerでfile_paths.xmlファイルを作成します
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
これがお役に立てば幸いです=)
ここで、progressDialogをロードします。それ以外の場合はブラウザで開くことを強制するWebClientを与える必要があります:
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);
このコードを使用してください:
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);
}
}
実際、すべてのソリューションはかなり複雑であり、本当に簡単なソリューションを見つけました(すべてのSDKバージョンで使用できるかどうかはわかりません)。ユーザーがドキュメントを表示および保存/共有できるプレビューウィンドウでPDFドキュメントを開きます。
webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
val i = Intent(Intent.ACTION_QUICK_VIEW)
i.data = Uri.parse(url)
startActivity(i)
})
(コトリン)
これは、実際の使用法です limit コメントで言及されたエラーを取得する前にGoogleが許可しますユーザーがアプリで開く生涯PDF Android 5.0/LollipopのAndroidの組み込みフレームワークを使用してネイティブアプローチに従うことをお勧めしますが、これは PDFRenderer と呼ばれます。