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.
- Abrir archivo PDF de Android
- Cómo convertir una página PDF en una imagen en Android?
- Android SDK y Guía del desarrollador sin conexión o PDF
- Android: desarrolla una aplicación para revistas
- ¿Cuál biblioteca es mejor para leer PDF, EPUB & html en Android?
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.
- Generar miniatura de PDF en Android
- Resaltar texto en un PDF
- ¿Cómo abrir un archivo pdf usando jquery y phonegap en android?
- Cómo agregar encabezado y pie de página en pdf dinámico utilizando iTextLibrary?
- Descargar pdf a través de un navegador web y una vista web
- Cómo crear archivos pdf en android
- Procesamiento de archivos PDF para reducir el tamaño / o la complejidad del archivo
- Mostrar PDF en Android
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 unContentProvider
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 desdeUri.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;)