android - 意图不打开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 查看器
谢谢
解决方案
为了满足您的需求,您需要下载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_STORAGE
WRITE_EXTERNAL_STORAGE
否则,您可以使用此库PdfViewPager并从 URL 转到远程 PDF,它正在做同样的事情(首先将 PDF 文件下载到您的设备存储中)
推荐阅读
- r - 有什么办法可以减少随机森林的执行时间?
- tensorflow - 我们可以在同一层使用多个损失函数吗?
- swift - 无法将类型“Void”的返回表达式转换为返回类型“(字符串,字符串,字符串)”
- parametric-polymorphism - “不支持多态关键字函数的推断”
- kubernetes - Kubernetes:从 pod 内部获取节点池名称
- angular - 未应用角度材质样式
- python - 使用python将多个xml文件转换为csv
- qt - 在 Class 中生成 QtLabel 并在 MainWindow 中调用它
- java - 无论我做什么,都无法启动 Elasticsearch
- r - R中的循环尝试逻辑回归拟合中的不同特征以找到最佳auc分数?