【问题标题】:Intent not opening pdf file意图不打开pdf文件
【发布时间】:2020-01-01 12:40:58
【问题描述】:

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

代码sn-p

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 查看器

谢谢

【问题讨论】:

  • 您的 pdf 文件必须是我存储在设备存储中的

标签: android firebase pdf firebase-storage


【解决方案1】:

为了满足您的需求,您需要下载 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

中添加INTERNETREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE 权限

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

【讨论】:

    【解决方案2】:

    我需要下载文件才能打开它,我无法使用 uri 在内置/默认 pdfviewer 中打开它

    String url = "given";
     DownloadManager downloadmanager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
                        request.setTitle(name);
                        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |
                                DownloadManager.Request.NETWORK_MOBILE);
                       request.setAllowedOverRoaming(false);
                        request.setDescription("Downloading");
                        request.allowScanningByMediaScanner();
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,name);
                        request.setMimeType(".pdf");
    
                        id = downloadmanager.enqueue(request);
    

    使用 downloadManager 是更好的方法,所以我使用了它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      • 2018-04-19
      • 2014-01-03
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      相关资源
      最近更新 更多