Не удается открыть файл 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

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

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

Хорошо, ребята, проблема решена!

Это код, который я использую для открытия 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

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

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

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