下载后自动打开PDF [英] Open PDF Automatically After Downloaded

查看:52
本文介绍了下载后自动打开PDF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 webview 应用程序,它具有 pdf 下载功能,可以从一些不同的网站下载 pdf 文件.我想知道如何在下载后立即打开pdf.我的应用程序中还没有 pdf 阅读器,因为我不知道如何应用它.

I have a webview app that have pdf download feature for downloading pdf file from some different websites. I would like to know how to open the pdf immediately after downloaded. I haven't got a pdf reader in my app yet as I don't know how to applied it.

我已阅读我提出的类似问题的所有答案,但所有答案均不适用.问题是pdf的名称是基于上传者设置的,因此每个访问的网站pdf文件的名称都会不同.

I have read all the answers for the similar questions I ask but all the answers are not applicable. The problem is the name of pdf is based on what the uploader set, so the name of the pdf file will be different per websites visited.

在下面的代码中,下载的pdf文件的生成名称是根据网站上的pdf名称,不是我自己确定的.

In the code below, the generated name of the pdf file downloaded is based on the pdf name on the site, not determined by me.

是否可以根据代码打开pdf文件或者我应该更改代码?

Is it possible to open the pdf file based on the code or should I alter the code?

package com.example.app;

public class WebViewActivity extends AppCompatActivity {

    String url = "";
    NetworkChangeListener networkChangeListener = new NetworkChangeListener();

    private boolean multiple_files = true;

    private static String file_type     = "*/*";
    private ValueCallback<Uri> file_data;
    private ValueCallback<Uri[]> file_path;
    private final static int file_req_code = 1;

    private static final String TAG = WebViewActivity.class.getSimpleName();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.webview);

        webView = findViewById(R.id.webView);
        WebSettings appwebsettings = webView.getSettings();

        appwebsettings.setLoadsImagesAutomatically(true);
        appwebsettings.setJavaScriptEnabled(true);
        appwebsettings.setAllowContentAccess(true);
        appwebsettings.setAllowFileAccess(true);

        url = getIntent().getStringExtra("URL_NAME");
        webView.loadUrl(url);
        webView.requestFocus();

        webView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                swipeRefreshLayout.setEnabled(false);
                super.onPageFinished(view, url);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        webView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
            }

            @Override
            public void onReceivedIcon(WebView view, Bitmap icon) {
                super.onReceivedIcon(view, icon);
            }
        });

        if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){
            if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_DENIED){
                Log.d("permission", "permission denied to WRITE_EXTERNAL_STORAGE - requesting it");
                String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
                requestPermissions(permissions,1);
            }
        }

        webView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition,
                                        String mimeType, long contentLength) {
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                request.setMimeType(mimeType);
                String cookies = CookieManager.getInstance().getCookie(url);
                request.addRequestHeader("cookie",cookies);
                request.addRequestHeader("User-Agent",userAgent);
                request.setDescription("Downloading File");
                request.setTitle(URLUtil.guessFileName(url,contentDisposition,mimeType));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,
                        URLUtil.guessFileName(url, contentDisposition, mimeType));
                DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                downloadManager.enqueue(request);
                Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_SHORT).show();
            }
        });

    @Override
    protected void onStart() {
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(networkChangeListener, filter);
        super.onStart();
    }

    @Override
    protected void onStop() {
        unregisterReceiver(networkChangeListener);
        super.onStop();
    }

    @Override
    public void onBackPressed() {
        if(webView.canGoBack()){
            webView.goBack();
        }else {
            finish();
            super.onBackPressed();
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
    }
}

这是我的 Web 视图布局

This is my Webview Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".WebViewActivity">
    
    <WebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</LinearLayout>

提前致谢.

推荐答案

感谢@blackapps 的建议.

Thanks to @blackapps for the suggestion.

我发现我这个愚蠢问题的答案很简单.

I found out that the answer of my silly question is quite simple.

我坚持使用 URLUtil.guessFileName(url,contentDisposition,mimeType)) 因为当我下载 pdf 文件时,下载的文件名将与我客户网站上上传的文件名相同.

I insist in using URLUtil.guessFileName(url,contentDisposition,mimeType)) because when I download the pdf file, the downloaded filename will be the same with the uploaded filename in my client's website.

所以我刚刚做的是添加这个等式 fileName = URLUtil.guessFileName(url,contentDisposition,mimeType)) 并在下载管理器中注册接收器,然后在 pdf 下载完成后创建反应.>

So what I just did is adding this equation fileName = URLUtil.guessFileName(url,contentDisposition,mimeType)) and register receiver in Download Manager then create the reaction after pdf download is completed.

public class WebViewActivity extends AppCompatActivity {

...

    private String fileName;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        ...
        
        webView.setDownloadListener(new DownloadListener() {
        @Override
        public void onDownloadStart(String url, String userAgent, String contentDisposition,
                                    String mimeType, long contentLength) {
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
            //setup the fileName
            fileName = URLUtil.guessFileName(url,contentDisposition,mimeType);
            
            request.setMimeType(mimeType);
            String cookies = CookieManager.getInstance().getCookie(url);
            request.addRequestHeader("cookie",cookies);
            request.addRequestHeader("User-Agent",userAgent);
            request.setDescription("Downloading File");
            request.setTitle(fileName));
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,
                    fileName);
            DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            //Registering receiver in Download Manager
            registerReceiver(onCompleted, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));    
            downloadManager.enqueue(request);
            Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_SHORT).show();
        }
        
    });
    
    ...
    
    BroadcastReceiver onCompleted = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context.getApplicationContext(), "Download Finish", Toast.LENGTH_SHORT).show();
            File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + fileName);
            Uri uri = FileProvider.getUriForFile(WebViewActivity.this, "com.example.app"+".provider",file);
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setDataAndType(uri, "application/pdf");
            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_GRANT_READ_URI_PERMISSION);
            startActivity(i);
        }
    };
}

这篇关于下载后自动打开PDF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆