在Android中显示PDF

在我的onCreate()我做这个检查:

// // check if we have a PDF viewer, else bad things happen // Intent intent = new Intent(Intent.ACTION_VIEW); intent.setType("application/pdf"); List<ResolveInfo> intents = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); if (intents == null || intents.size() == 0) { // display message then... finish(); } 

在我的HTC Desire上,即使我拥有Adobe的PDF阅读器,也不会返回匹配结果。 这个问题的答案android:从我的应用程序使用内置的pdf查看器打开PDF提到,Adobe可能没有任何公共意图,所以上面的检查显然不会返回任何内容。

任何人都可以validation你是否应该能够从意图启动Acrobat,或者是否有其他方法或PDF阅读器使用。

实际使用情况是下载发票副本并使用以下代码将其存储在本地存储中:

  URL url = new URL(data); InputStream myInput = url.openConnection().getInputStream(); FileOutputStream fos = openFileOutput(fname, Context.MODE_WORLD_READABLE); // transfer bytes from the input file to the output file byte[] buffer = new byte[8192]; int length; while ((length = myInput.read(buffer)) > 0) { fos.write(buffer, 0, length); progressDialog.setProgress(i++); } fos.close(); 

然后显示

 // read from disk, and call intent openFileInput(fname); // will throw FileNotFoundException File dir = getFilesDir(); // where files are stored File file = new File(dir, fname); // new file with our name Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file)); intent.setType("application/pdf"); startActivity(intent); 

Solutions Collecting From Web of "在Android中显示PDF"

将手机连接到PC,启动Eclipse并打开LogCat。 然后用浏览器下载PDF文件并打开它。 你应该看到一个像(我使用HTC的愿望):

09-14 17:45:58.152:INFO / ActivityManager(79):开始活动:Intent {act = android.intent.action.VIEW dat = file:///sdcard/download/FILENAME.pdf typ = application / pdf flg = 0x4000000 cmp = com.htc.pdfreader / .ActPDFReader}

用明确的意图去使用组件信息。 文档在这里说:

> component – 指定用于意图的组件类的显式名称。 通常这是通过查看意图中的其他信息(操作,数据/types和类别)并将其与可以处理它的组件匹配来确定的。 如果设置了该属性,则不执行评估,并且完全按照原样使用该组件。 通过指定这个属性,所有其他的意图属性变成可选的。

下面是你将被绑定到HTC阅读器。 但是你可以首先尝试一个隐含的意图,如果失败,则试图将显式的意图作为后备。

在您的活动中复制以下代码。 从onCreate()函数调用函数CopyReadAssets(“File_name.pdf”)。 将资源文件夹中的File_name.pdf文件。

 private void CopyReadAssets(String pdfname) { AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; File file = new File(getFilesDir(), pdfname); try { in = assetManager.open(pdfname); out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch (Exception e) { Toast.makeText(getApplicationContext(), "Pdf Viewer not installed", Toast.LENGTH_SHORT).show(); } try { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType( Uri.parse("file://" + getFilesDir() + "/"+pdfname), "application/pdf"); startActivity(intent); }catch (Exception e) { // TODO: handle exception Toast.makeText(getApplicationContext(), "Pdf Viewer not installed" ,Toast.LENGTH_SHORT).show(); } } private void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while ((read = in.read(buffer)) != -1) { out.write(buffer, 0, read); } }