답변:
Google PDF 뷰어를 사용하여 온라인에서 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("https://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format....
. 따라서 신뢰할 수없는 것 같습니다.
Google 문서를 사용하여 PDF를 여는 것은 사용자 경험 측면에서 나쁜 생각입니다. 정말 느리고 반응이 없습니다.
api 21 이후 로 pdf를 Bitmap으로 변환하는 데 도움 이되는 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 를 만들어야 합니다.
이를 구현하는 방법은 다음과 같습니다. 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>
마지막으로 리소스 폴더에 file_paths.xml 파일을 만듭니다.
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="shared_pdf" path="shared_pdf"/>
</paths>
희망이 =)
이 코드를 사용하십시오.
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);
}
}
여기서 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);
실제로 모든 솔루션이 매우 복잡했고 정말 간단한 솔루션을 찾았습니다 (모든 SDK 버전에서 사용할 수 있는지 확실하지 않습니다). 사용자가 문서를보고 저장 / 공유 할 수있는 미리보기 창에서 pdf 문서가 열립니다.
webView.setDownloadListener(DownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
val i = Intent(Intent.ACTION_QUICK_VIEW)
i.data = Uri.parse(url)
if (i.resolveActivity(getPackageManager()) != null) {
startActivity(i)
} else {
val i2 = Intent(Intent.ACTION_VIEW)
i2.data = Uri.parse(url)
startActivity(i2)
}
})
(코 틀린)
여기에서 소스 코드를 다운로드하십시오 ( Webview Android에서 PDF 열기 ).
activity_main.xml
<RelativeLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<WebView
android:layout_width="match_parent"
android:background="#ffffff"
android:layout_height="match_parent"
android:id="@+id/webview"></WebView>
</RelativeLayout>
MainActivity.java
package com.pdfwebview;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
WebView webview;
ProgressDialog pDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
listener();
}
private void init() {
webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle("PDF");
pDialog.setMessage("Loading...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
webview.loadUrl("https://drive.google.com/file/d/0B534aayZ5j7Yc3RhcnRlcl9maWxl/view");
}
private void listener() {
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();
}
});
}
}
이것은 댓글에 언급 된 오류가 발생하기 전에 Google이 허용 하는 실제 사용 제한 입니다 . 사용자가 앱에서 열 수있는 평생 pdf 인 경우 완전히 안전하다고 느낍니다. Android 5.0 / Lollipop에서 Android에 내장 된 프레임 워크를 사용하는 기본 접근 방식을 따르는 것이 좋지만 PDFRenderer 라고 합니다 .