Не удается открыть файл PDF во внешнем приложении.

Я хотел бы открыть PDF-файл, когда пользователь нажимает кнопку. В настоящее время я использую этот код для достижения этого:

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); 

Но это не сработает.

Когда я выбираю использовать Adobe Acrobat, я получаю сообщение, отображаемое как Toast, которое говорит

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

Когда я пытаюсь использовать средство просмотра PDF в формате 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(); } 

Но когда я пытаюсь открыть 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) 

Это мой класс:

 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; } } } 

}

Кто-нибудь может мне помочь?

EDIT 2

Я нашел решение, проверьте мой ответ ниже для кода.

Спасибо всем за ваши ответы.

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(); } 

Сторонние приложения не могут получить доступ к вашим ресурсам через URL- file:///android_asset .

Ты можешь:

  • Попробуйте использовать мой StreamProvider , чтобы иметь ContentProvider в вашем приложении, которое может служить PDF прямо из активов или

  • Используйте FileProvider из пакета поддержки Android, после копирования файла из активов во внутреннее хранилище, как показано в этом примере приложения , или

  • Скопируйте файл во внешнее хранилище и используйте Uri созданный из Uri.fromFile() чтобы указать на эту копию

Установка данных как "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

И взгляните на это:

Выберите файл с ExternalStorageDirectory :

 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/4945820

У меня была та же проблема, после нескольких часов работы с проблемой я понял, что я пропустил добавить «/» между файловым путем и именем файла.

Таким образом, файл не был найден, и у меня есть «Доступ к этому файлу невозможно. Проверьте местоположение или сеть и повторите попытку». сообщение.

Надеюсь, это поможет кому-то;)