无法在外部应用程序中打开PDF文件

我想打开一个PDF文件,当用户点击一个button。 目前,我正在使用此代码来实现这一点:

Uri path = Uri.fromFile(new File("file:///android_asset/regola11_1.pdf")); Intent pdfIntent = new Intent(Intent.ACTION_VIEW); pdfIntent.setDataAndType(path, "application/pdf"); pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(pdfIntent); 

但它不起作用。

当我select使用Adobe Acrobat时,我收到一条消息,显示为吐司,说

 "This file could not be accessed Check the location or the network and try again." 

当我尝试与驱动器PDF查看器,我得到

 "Cannot display PDF ( regola11_1.pdf cannot be opened)" 

PDF文件存储在

 app > build > intermediates > assets 

哪里有问题?

编辑

现在我使用下面的代码:

 File file = new File("\"file:///android_asset/regola11_1.pdf"); Uri path = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(context, "No application available to view PDF", Toast.LENGTH_LONG).show(); } 

但是,当我尝试通过单击button打开PDF,应用程序崩溃。

这是我得到的日志:

 05-31 10:05:25.132 24474-24474/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.andrey.andreyvedis.iamaref, PID: 24474 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.Context.startActivity(android.content.Intent)' on a null object reference at com.andrey.andreyvedis.iamaref.FragmentR11.onClick(FragmentR11.java:147) at android.view.View.performClick(View.java:4781) at android.view.View$PerformClick.run(View.java:19873) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5293) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

这是我的class级:

 public class FragmentR11 extends Fragment implements View.OnClickListener{ // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, eg ARG_ITEM_NUMBER private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; Context context; // TODO: Rename and change types of parameters private String mParam1; private String mParam2; /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment FragmentR11. */ // TODO: Rename and change types and number of parameters public static FragmentR11 newInstance(String param1, String param2) { FragmentR11 fragment = new FragmentR11(); Bundle args = new Bundle(); args.putString(ARG_PARAM1, param1); args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } public FragmentR11() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { mParam1 = getArguments().getString(ARG_PARAM1); mParam2 = getArguments().getString(ARG_PARAM2); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_r11, container, false); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); getActivity().findViewById(R.id.bD1).setOnClickListener(this); getActivity().findViewById(R.id.bD2).setOnClickListener(this); getActivity().findViewById(R.id.bD3).setOnClickListener(this); getActivity().findViewById(R.id.bD4).setOnClickListener(this); getActivity().findViewById(R.id.bD5).setOnClickListener(this); getActivity().findViewById(R.id.bD6).setOnClickListener(this); getActivity().findViewById(R.id.bD7).setOnClickListener(this); getActivity().findViewById(R.id.bD8).setOnClickListener(this); getActivity().findViewById(R.id.bD9).setOnClickListener(this); getActivity().findViewById(R.id.bD10).setOnClickListener(this); getActivity().findViewById(R.id.bD11).setOnClickListener(this); getActivity().findViewById(R.id.bD12).setOnClickListener(this); getActivity().findViewById(R.id.bD13).setOnClickListener(this); getActivity().findViewById(R.id.bD14).setOnClickListener(this); getActivity().findViewById(R.id.bD15).setOnClickListener(this); getActivity().findViewById(R.id.bD16).setOnClickListener(this); getActivity().findViewById(R.id.bD17).setOnClickListener(this); } /**private void openPDF(final String pathToPDF) { File file = new File(pathToPDF); Uri path = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.setDataAndType(path, "application/pdf"); try { startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(getActivity(), "Devi installare un'app per aprire PDF, come Adobe Acrobat Reader ", Toast.LENGTH_SHORT).show(); } }*/ @Override public void onClick(View v) { switch(v.getId()){ case R.id.bD1: { /**Uri path = Uri.fromFile(new File("regola11_1.pdf")); Intent pdfIntent = new Intent(Intent.ACTION_VIEW); pdfIntent.setDataAndType(path, "application/pdf"); pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(pdfIntent); Toast.makeText(getActivity(), "Hai cliccato Regola 1 in Reg11 ", Toast.LENGTH_SHORT).show();*/ File file = new File("\"file:///android_asset/regola11_1.pdf"); Uri path = Uri.fromFile(file); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(path, "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); try { context.startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(context, "No application available to view PDF", Toast.LENGTH_LONG).show(); } break; } case R.id.bD2: { Toast.makeText(getActivity(), "Hai cliccato Regola 2 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD3: { Toast.makeText(getActivity(), "Hai cliccato Regola 3 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD4: { Toast.makeText(getActivity(), "Hai cliccato Regola 4 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD5: { Toast.makeText(getActivity(), "Hai cliccato Regola 5 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD6: { Toast.makeText(getActivity(), "Hai cliccato Regola 6 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD7: { Toast.makeText(getActivity(), "Hai cliccato Regola 7 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD8: { Toast.makeText(getActivity(), "Hai cliccato Regola 8 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD9: { Toast.makeText(getActivity(), "Hai cliccato Regola 9 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD10: { Toast.makeText(getActivity(), "Hai cliccato Regola 10 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD11: { Toast.makeText(getActivity(), "Hai cliccato Regola 11 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD12: { Toast.makeText(getActivity(), "Hai cliccato Regola 12 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD13: { Toast.makeText(getActivity(), "Hai cliccato Regola 13 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD14: { Toast.makeText(getActivity(), "Hai cliccato Regola 14 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD15: { Toast.makeText(getActivity(), "Hai cliccato Regola 15 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD16: { Toast.makeText(getActivity(), "Hai cliccato Regola 16 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } case R.id.bD17: { Toast.makeText(getActivity(), "Hai cliccato Regola 17 in Reg11 ", Toast.LENGTH_SHORT).show(); break; } } } 

}

有人能帮我吗?

编辑2

我find了解决办法,查看下面的代码我的答案。

谢谢大家的答案。

Solutions Collecting From Web of "无法在外部应用程序中打开PDF文件"

好吧,问题解决了!

这是我用来打开PDF文件,存储在外部存储器上的代码:

 File pdfFile = new File(Environment.getExternalStorageDirectory(),"namePdfFile.pdf");//File path if (pdfFile.exists()) //Checking for the file is exist or not { Uri path = Uri.fromFile(pdfFile); Intent objIntent = new Intent(Intent.ACTION_VIEW); objIntent.setDataAndType(path, "application/pdf"); objIntent.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP); startActivity(objIntent);//Staring the pdf viewer } else { Toast.makeText(getActivity(), "The file not exists! ", Toast.LENGTH_SHORT).show(); } 

第三方应用无法通过file:///android_asseturl访问您的资源。

您可以:

  • 尝试使用我的StreamProvider ,在您的应用程序中有一个ContentProvider ,可以直接从资产或PDF提供PDF

  • 使用Android支持包中的FileProvider ,将文件从资产复制到内部存储器之后,如本示例应用程序中所示 ,或者

  • 将文件复制到外部存储并使用从Uri.fromFile()创build的Uri指向该副本

将数据设置为"file:///" + filePath为我工作。

 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(filePath)); intent.setDataAndType(Uri.parse("file:///" + filePath), "application/pdf"); context.startActivity(intent); 

添加此权限并再次检查:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

看来,访问该文件存在问题。

尝试打开另一个PDF文件,让我们知道什么是日志。

而且我认为你不能使用这个: file:///android_asset

并看看这个:

使用ExternalStorageDirectoryselect文件:

 File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/"+ filename); Intent target = new Intent(Intent.ACTION_VIEW); target.setDataAndType(Uri.fromFile(file),"application/pdf"); target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); Intent intent = Intent.createChooser(target, "Open File"); 

来自: https //stackoverflow.com/a/17453242/4945820

使用资产文件夹:

这里是代码,如果你使用这个Assets文件夹!

 File file = new File("file:///android_asset/example.pdf"); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/pdf"); intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); 

然后添加上面的权限,并再次使用资产代码进行检查。 另外,请查看: https://stackoverflow.com/q/28032029/4945820https://stackoverflow.com/q/28032029/4945820

我有同样的问题,几个小时后处理问题,我意识到,我错过了在文件path和文件名之间添加“/”。

所以文件没有find,我得到“这个文件无法访问检查位置或networking,然后再试一次。 信息。

希望这可以帮助别人;)