首页 > 解决方案 > 意图不打开pdf文件

问题描述

我找到了这个答案https://stackoverflow.com/a/10689094/11520105,我尝试了这段代码,它弹出对话框选择pdfviewer,当我点击Adobe reader时,它只是启动adobe reader但不启动pdf文件

代码片段

pdflistView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

               UploadPDF uploadPDF = list.get(position);
               String url = uploadPDF.getUrl();
               Log.i("url",url);
                Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
                intent.setType("application/pdf");
                PackageManager pm = getPackageManager();
                List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
                if (activities.size() > 0) {
                    startActivity(intent);
                } else {
                    // Do something else here. Maybe pop up a Dialog or Toast
                    Toast.makeText(ShowPdfActivity.this, "Can't open pdf", Toast.LENGTH_SHORT).show();
                }

日志猫

2020-01-01 18:05:56.259 15148-15148/com.tarandeepsingh.inventory V/FA: onActivityCreated
2020-01-01 18:05:56.306 15148-15186/com.tarandeepsingh.inventory V/FA: Activity resumed, time: 2896415632
2020-01-01 18:05:56.320 15148-15186/com.tarandeepsingh.inventory D/FA: Logging event (FE): screen_view(_vs), Bundle[{ga_event_origin(_o)=auto, ga_previous_class(_pc)=MainActivity, ga_previous_id(_pi)=3485492302754114157, ga_screen_class(_sc)=ShowPdfActivity, ga_screen_id(_si)=3485492302754114159}]
2020-01-01 18:05:57.157 15148-15148/com.tarandeepsingh.inventory I/url: https://firebasestorage.googleapis.com/v0/b/inventory-b98d3.appspot.com/o/uploads%2F1577868311721.pdf?alt=media&token=e543f039-38bd-4881-bcff-48b533ff22bf
2020-01-01 18:05:57.165 15148-15148/com.tarandeepsingh.inventory I/Timeline: Timeline: Activity_launch_request time:644743239 intent:Intent { act=android.intent.action.VIEW typ=application/pdf }
2020-01-01 18:05:57.200 15148-15186/com.tarandeepsingh.inventory V/FA: Screen exposed for less than 1000 ms. Event not sent. time: 889
2020-01-01 18:05:57.207 15148-15186/com.tarandeepsingh.inventory V/FA: Activity paused, time: 2896416520
2020-01-01 18:05:59.218 15148-15186/com.tarandeepsingh.inventory D/FA: Application going to the background
2020-01-01 18:05:59.235 15148-15186/com.tarandeepsingh.inventory D/FA: Logging event (FE): app_background(_ab), Bundle[{ga_event_origin(_o)

正如您在 logcat 中看到的,我正在获取 url 但无法启动默认/已安装的 pdf 查看器

谢谢

标签: androidfirebasepdffirebase-storage

解决方案


为了满足您的需求,您需要下载PDF并将其存储到设备存储中,以便您可以使用它们的路径随意使用它。

以下是如何下载PDF文件并在下载完成后打开它的完整示例:

String PDF_URL = "https://perso.univ-rennes1.fr/pierre.nerzic/Android/poly.pdf";



@SuppressLint("StaticFieldLeak")
private class DownloadFile extends AsyncTask<String, Integer, String> {

    String savedFilePath = null;
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        //To ignore the file URI exposure.
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());

        progressDialog = new ProgressDialog(PickLocationActivity.this);
        progressDialog.setTitle("Downloading PDF");
        progressDialog.setMessage("Please wait (0%)");
        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... urlParams) {
        int count;
        String fileName = urlParams[1] + ".pdf";
        File storageDir = new File(
                Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                        + "/PDF_FOLDER/");
        boolean success = true;
        if (!storageDir.exists()) {
            success = storageDir.mkdirs();
        }
        if (success) {
            File file = new File(storageDir, fileName);
            savedFilePath = file.getAbsolutePath();
            if (!file.exists()) {
                try {
                    URL url = new URL(urlParams[0]);
                    URLConnection conexion = url.openConnection();
                    conexion.connect();
                    int lenghtOfFile = conexion.getContentLength();
                    InputStream input = new BufferedInputStream(url.openStream());
                    OutputStream output = new FileOutputStream(file);
                    byte data[] = new byte[1024];
                    long total = 0;
                    while ((count = input.read(data)) != -1) {
                        total += count;
                        publishProgress((int) (total * 100 / lenghtOfFile));
                        output.write(data, 0, count);
                    }
                    output.flush();
                    output.close();
                    input.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }
        return savedFilePath;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        progressDialog.setMessage("Please wait (" + values[0] + "%)");
    }

    @Override
    protected void onPostExecute(String pdfPath) {
        super.onPostExecute(pdfPath);
        if (pdfPath != null && !pdfPath.isEmpty()) {
            File pdfFile = new File(pdfPath);
            if (pdfFile.exists()) {
                progressDialog.dismiss();
                Uri path = Uri.fromFile(pdfFile);
                Intent Go = new Intent(Intent.ACTION_VIEW);
                Go.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                Go.setDataAndType(path, "application/pdf");
                Go.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(Go);
            }
        }
    }
}

像这样称呼它: new DownloadFile().execute(PDF_URL, "PDF_NAME"); 不要忘记在您的AndroidManifest.xml上添加INTERNET和权限READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE


否则,您可以使用此库PdfViewPager并从 URL 转到远程 PDF,它正在做同样的事情(首先将 PDF 文件下载到您的设备存储中)


推荐阅读