puedo - Limitaciones para abrir el archivo pdf en Android
pdf android apk (9)
Estoy tratando de abrir algunos pdf de mi aplicación Android. Estoy usando una intención para hacer eso:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);
Este código funciona bien para algunos archivos PDF pero falla cuando trato de abrir otros.
Este es el mensaje que Android me está mostrando:
Hay un problema con el archivo.
Debo mencionar que los pdf que se abren sin problemas se crean con una plantilla Crystal Report y los pdfs que fallan se crean con otra.
Por el contrario, si abro la url de los pdfs que están fallando en mi navegador (en mi computadora), no me da ningún error al abrirlos, así que supongo que tal vez haya alguna limitación en Android que difiera de algunos pdf a otro (en la plantilla Crystal Report) pero no puedo verlo.
¿Qué limitaciones existen para abrir un archivo pdf en Android? (Tamaño, algunos parámetros de Crystal Report que no están permitidos, etc.)
He descartado que podría ser una limitación de tamaño porque los archivos PDF que están dando problemas son más pequeños que los archivos que no dan ningún error.
Prueba que he hecho:
- Abrir archivos PDF incorrectos en el navegador ~~> Aceptar
- Descargar un PDF incorrecto en un teléfono móvil y abrirlo ~~> OK
- Abrir archivos PDF incorrectos en APP ~~> Error
- Abrir un buen PDF en la APLICACIÓN de la compañía que bloquea PDF ~~> OK
EDITAR
Me he dado cuenta de que estaba usando el protocolo http://
pero el PDF está en un protocolo https://
, así que lo he cambiado en el método Uri.parse
.
Cuando realicé este cambio, la aplicación se bloqueó y se mostró un error en el registro:
android.content.ActivityNotFoundException: no se encontró actividad para manejar el intento
Además, he notado que los PDF que no me dan ningún error están en una url con el protocolo http://
lugar de https://
así que supongo que el protocolo https://
puede ser el problema.
¿Solo puedo abrir http://
request en un Intent?
Encontré una solución para ver mi PDF en mi aplicación de Android (pero no me permite descargarlo después de mostrarlo en la aplicación). Si abro mi PDF usando Google Docs, puedo abrirlo con mi Intención.
Esto es lo que tuve que agregar antes de mi url:
https://docs.google.com/gview?embedded=true&url=
entonces la url final será como:
https://docs.google.com/gview?embedded=true&url=https://myUrl.pdf
Aquí está el código completo que estoy usando en este momento:
String url= "https://docs.google.com/gview?embedded=true&url=https://url.pdf";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
Pero aún no es suficiente , porque me gustaría abrirlo sin necesidad de utilizar una aplicación de terceros. Además, abrir PDF con Google Docs es lento y tengo que esperar demasiado hasta que finalmente se abre el PDF.
Si alguien sabe cómo abrirlo con Android nativo, por favor avíseme.
¿Qué sucede si no lo abro con Google Docs?
Con el mismo código, pero solo usando mi url, en lugar de la URL de Google Docs agregada, Android me permitió elegir entre dos aplicaciones: Adobe Acrobat Reader y Google Chrome.
Si lo abro con Google Chrome, descargo el PDF pero no se abre automáticamente.
Si lo abro con Adobe Acrobat Reader, me da el siguiente error:
El PDF no se puede mostrar (no se puede abrir)
Podría ser que el archivo no pudo ser interpretado por la aplicación de visor de PDF de Android. ¿Has intentado copiar / descargar exactamente el mismo archivo en tu teléfono Android y abrir desde allí?
Además, sugeriría usar IntentChooser para iniciar el visor de PDF, solo para jugar de manera segura sin la opción de instalar el visor de PDF / dar al usuario para elegir la aplicación:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
Intent chooserIntent = Intent.createChooser(intent, "Open Report");
startActivity(chooserIntent);
Puede usar Webview para abrir un PDF desde la URL de esta manera:
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + your url);
Puede usar la siguiente biblioteca para Android: - // en compilación de compilación de nivel de aplicación
compile ''com.github.barteksc: android-pdf-viewer: 2.6.1''
en tu xml:
<com.github.barteksc.pdfviewer.PDFView
android:id="@+id/pdfView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
en tu actividad / fragmento:
pdfView.fromUri(Uri)
or
pdfView.fromFile(File)
or
pdfView.fromBytes(byte[])
or
pdfView.fromStream(InputStream) // stream is written to bytearray - native code cannot use Java Streams
or
pdfView.fromSource(DocumentSource)
or
pdfView.fromAsset(String)
Para obtener más información, consulte este link
Puedes probar esto,
public void OpenPDFFile(String file_name) {
try {
File pdfFile = new File(getFile(), file_name);//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_NO_HISTORY);
try {
startActivity(objIntent);
Log.e("IR", "No exception");
}
catch (ActivityNotFoundException e) {
Log.e("IR", "error: " + e.getMessage());
Toast.makeText(DownloadedPdfActivity.this,
"No Application Available to View PDF",
Toast.LENGTH_SHORT).show();
}
}
}catch (Exception e){
e.printStackTrace();
}
}
o
mWebviewPdf.getSettings().setJavaScriptEnabled(true);
mWebviewPdf.getSettings().setLoadWithOverviewMode(true);
mWebviewPdf.getSettings().setUseWideViewPort(true);
pDialog = new ProgressDialog(PdfActivity.this, android.R.style.Theme_DeviceDefault_Dialog);
pDialog.setTitle("PDF");
pDialog.setMessage("Loading...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
mWebviewPdf.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
pDialog.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
pDialog.dismiss();
}
});
**mWebviewPdf.loadUrl("https://docs.google.com/gview?embedded=true&url=" + mUrl);**
String url= "https://docs.google.com/gview?embedded=true&url=" + mUrl;
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
Puede mostrar el pdf en la vista web.
Si API> = 21 puede usar PDFRenderer para crear un mapa de bits de cada página, pero solo es visible, no editable. Aquí hay un ejemplo que hice sobre la marcha, sin botones de navegación, pero no debería ser difícil de implementar.
PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(new File("/path/to/file.pdf"),
ParcelFileDescriptor.MODE_READ_ONLY));
PdfRenderer.Page page = renderer.openPage(0);
Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(),
Bitmap.Config.ARGB_8888);
page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
imageView.setImageBitmap(bitmap);
page.close();
renderer.close();
Editar
PdfRenderer requiere un archivo local para FileDescriptor. Entonces, a su vez, ver a través de la "nube", que yo sepa, no es posible con este enfoque.
Simple add following library para android: - // en compilación de compilación de nivel de aplicación ''com.joanzapata.pdfview: android-pdfview: 1.0.4@aar''
//inside your xml file
<com.joanzapata.pdfview.PDFView
android:id="@+id/pdfview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
//inside java code
pdfView.fromAsset(pdfName)
.pages(0, 2, 1, 3, 3, 3)
.defaultPage(1)
.showMinimap(false)
.enableSwipe(true)
.onDraw(onDrawListener)
.onLoad(onLoadCompleteListener)
.onPageChange(onPageChangeListener)
.load();
for more info:- use this github link
Su problema es que su PDF se está descargando dentro de la carpeta Datos / datos y cuando intenta abrir usando intención predeterminada, entonces la aplicación externa no tiene ningún permiso para abrir el archivo desde la carpeta de datos / datos, por lo que debe descargar el archivo fuera del directorio de la aplicación y luego intente volver a abrirlo, estará funcionando.
Usando el intento de abrir un archivo pdf con el protocolo https://
, https://
no es el problema.
Veo que está intentando este método para definir el tipo de datos:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);
pero causará:
ActivityNotFoundException: no se encontró actividad para manejar la intención
Si usa este otro método, probablemente no pueda ver los lectores de PDF en las opciones para abrir este tipo de archivos:
Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
Intent chooserIntent = Intent.createChooser(intent, "Open Report");
startActivity(chooserIntent);
Debe probar este método sin la definición de tipo y funcionará perfectamente:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
Otra causa de este problema al abrir el archivo pdf a través de la intención sería la aplicación predeterminada para abrir este tipo de archivos, por lo que probablemente tenga configurada una aplicación corrupta o no válida, así que restaure los valores predeterminados:
Ve a Settings
. Toca Applications
. Toca Default Applications
.
Seleccione la aplicación y Borrar valores predeterminados