No se puede abrir el archivo PDF en una aplicación externa

Me gustaría abrir un archivo PDF cuando el usuario hace clic en un botón. Actualmente, estoy usando este código para lograr esto:

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

Pero no funciona.

Cuando elijo usar Adobe Acrobat, recibo un mensaje, que aparece como un Toast, que dice

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

Cuando intento con Drive PDF Viewer, obtengo

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

El archivo PDF se almacena en

 app > build > intermediates > assets 

¿Dónde está el problema?

EDITAR

Ahora estoy usando el siguiente código:

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

Pero cuando intento abrir el PDF haciendo clic en el botón, la aplicación se bloquea.

Este es el registro que obtengo:

 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) 

Esta es mi clase:

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

}

¿Alguien me puede ayudar?

EDIT 2

He encontrado la solución, compruebe mi respuesta abajo para el código.

Gracias a todos por sus respuestas o comentarios.

Ok chicos, problema resuelto!

Este es el código que utilizo para abrir un archivo PDF, almacenado en la memoria externa:

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

Las aplicaciones de terceros no pueden acceder a sus activos a través de las URL de file:///android_asset .

Usted puede:

  • Intente usar mi StreamProvider , para tener un ContentProvider en su aplicación que pueda servir el PDF directamente desde los activos, o

  • Utilice FileProvider desde el paquete de soporte de Android, después de copiar el archivo de los recursos al almacenamiento interno, como se demuestra en esta aplicación de ejemplo , o

  • Copie el archivo en un almacenamiento externo y utilice un Uri creado desde Uri.fromFile() para apuntar a esa copia

Ajustar los datos como "file:///" + filePath funcionó para mí.

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

Agregue este permiso y compruebe nuevamente:

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

Al parecer, hay un problema con el acceso al archivo.

Intente abrir otro archivo pdf y háganos saber cuál es el registro.

Y también creo que no se puede usar esto: file:///android_asset

Y eche un vistazo a esto:

Elija el archivo con 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"); 

De: https://stackoverflow.com/a/17453242/4945820

Con carpeta de activos:

Y aquí está el código, si está usando esto con la carpeta de 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); 

A continuación, agregue el permiso anterior y vuelva a comprobarlo con el código de activos. También, compruebe esto: https://stackoverflow.com/q/28032029/4945820

Tuve el mismo problema, después de horas de tratar con el problema me di cuenta de que me faltó para agregar "/" entre la ruta del archivo y el nombre del archivo.

Así que el archivo no se encontró y tengo "No se pudo acceder a este archivo Compruebe la ubicación o la red y vuelva a intentarlo." mensaje.

Espero que esto ayude a alguien;)

  • Leer archivo PDF en línea usando MuPDF
  • Múltiples hipervínculos sobre una imagen en pdf android
  • cómo: descargar y abrir un archivo pdf mediante programación a través de conexión http
  • Compartir archivos pdf a través de mi aplicación en android
  • Android WebView: Eliminar opción de pop-out en Google Drive / Visor de documentos
  • Lector de PDF para Android desde cero
  • PDF para bitmap imagen converso usando mupdf n android
  • Android PdfDocument dañado cuando se guarda en un almacenamiento externo
  • Problema al convertir .docx al archivo pdf en android
  • Cómo puedo convertir un mapa de bits en formato PDF en android
  • Los teléfonos Android no abren el flujo de archivos PDF después de la publicación en ASP.Net
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.