【问题标题】:Open PDF Automatically After Downloaded下载后自动打开 PDF
【发布时间】:2021-10-30 06:23:05
【问题描述】:

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

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

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

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

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);
    }
}

这是我的 Webview 布局

<?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>

提前谢谢你。

【问题讨论】:

  • 请在您最喜欢的搜索引擎上进行快速搜索。已经有很多可用的解决方案。最常见和最简单的是使用意图。 intent.setDataAndType(Uri.fromFile(file),"application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  • @ImranAli 我真的尝试了几天应用其他问题给出的答案。但这些答案不能适用。或者也许我在应用答案时是错误的。如果您知道如何应用它,请帮助我。我将不胜感激。
  • 问题是因为我使用“request.setTitle(URLUtil.guessFileName(url,contentDisposition,mimeType));”。如果标题原样,我不知道如何正确设置pdf名称。
  • 您可以自己提供文件名。或者记住文件名。它的 URLUtil.guessFileName(url,contentDisposition,mimeType)。我真的不理解大惊小怪。当然,您可以使用 ACTION_VIEW 让用户为您的文件选择 pdf 查看器。请张贴代码。您至少有两种可能性来获取文件所需的 uri 以放入意图中。
  • 我试试这个代码: File file = new File(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url,contentDisposition,mimeType)); Uri 路径 = Uri.fromFile(file);意图 pdfOpenintent = new Intent(Intent.ACTION_VIEW); pdfOpenintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); pdfOpenintent.setDataAndType(path, "application/pdf");尝试 { startActivity(pdfOpenintent); } catch (ActivityNotFoundException e) { } 但它不起作用。

标签: java android android-studio pdf openpdf


【解决方案1】:

感谢@blackapps 的建议。

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

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

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

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);
        }
    };
}

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 2014-06-06
    • 2015-04-20
    • 2014-06-22
    • 2014-05-13
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多