¿Puede alguien confirmar que Adobe Reader funciona con un proveedor de contenido personalizado?

He implementado un proveedor de contenido personalizado que sirve documentos pdf como ParcelFileDescriptor. Los archivos se almacenan en el almacenamiento local marcado como PRIVADO. Basándose en un URI, los documentos se entregan a la aplicación pdf seleccionada.

Esto funciona para todas las aplicaciones de PDF Viewer, excepto adobe reader. ¿Puede alguien confirmar que el lector de adobe no funciona con los proveedores de contenido? Código abajo:

Cuando se ha descargado el documento:

private void loadDocInReader(String doc) throws ActivityNotFoundException, Exception { Uri uri = Uri.parse(doc); logger.debug("PDF Application ID is: " + pdfAppID); if (this.pdfAppID != null && this.pdfAppID.length() > 0) { boolean pdfApplicationIsInstalled = checkPDFApplicationIsInstalled(this.pdfAppID); if(pdfApplicationIsInstalled) { Intent intent = new Intent(); intent.setPackage(pdfAppID); intent.setData(uri); intent.setType("application/pdf"); startActivity(intent); } else { logger.error("Please install Adobe Reader first!"); } } else { Intent intent = new Intent(); intent.setData(uri); intent.setType("application/pdf"); startActivity(intent); } } 

Todas las demás aplicaciones de visor de pdf llaman a este método, excepto lector de adobe:

 public class DocumentProvider extends ContentProvider { @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { File file = null; try { file = new File(uri.getPath()); logger.debug("Delivering ParcelFileDescriptor for path: " + file.getPath()); return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); } catch (FileNotFoundException e) { logger.error("Error loading Document: ",e); } finally { if(file.exists()) { file.delete(); } } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } } 

Adobe Reader siempre indica: "Ruta de archivo no válida"

¡¡¡Gracias por adelantado!!! Kay.

Por lo que puedo determinar, Adobe Reader tiene soporte escamoso para leer archivos de ContentProviders. En mi caso, el método openFile se llama y devuelve un ParcelFileDescriptor válido, pero Adobe Reader informa "No se pudo abrir el documento". Mi proveedor de contenido funciona bien con "Drive PDF Viewer", "PDF Reader" y "qPDF Reader", que son algunos de los mejores visores de PDF de la Play Store.

Adobe Reader es capaz de abrir archivos adjuntos de archivos PDF en Gmail utilizando el proveedor de contenido de Gmail, pero no puedo determinar cómo o por qué funciona.

También tengo problemas con Adobe Acrobat Reader que no funciona con mi proveedor personalizado y finalmente lo tengo funcionando. Mi problema era que los archivos en el espacio de archivos local de la aplicación estaban encriptados y sus nombres eran hash. Así que el Uri era algo como:

 content://my.app.provider/08deae8d9ea9bc0b84f94475d868351830e9f7e7 

Funciona con cualquier aplicación de visor de PDF que he probado excepto Adobe Reader. Hoy hice un último intento para agregar una extensión .pdf al Uri de contenido (que definitivamente no es necesario) y cuando Adobe llama a una función openFile() la extensión. ¡VOILA, funciona !!!

Actualizar

Asegúrese de que también la columna _display_name que su ContentProvider devuelve como resultado de query(Uri, String[], String, String[], String) también contiene la extensión .pdf !!!

Nota

Probado con Adobe Acrobat Reader versión 16.3

  • CursorLoader - ¿Dos tablas unen consulta?
  • ¿Cómo comprobar si la palabra ya está disponible en el diccionario de usuario?
  • Proveedor de contenido android
  • Buena manera de almacenar datos en caché durante el ciclo de vida de las aplicaciones de Android?
  • INSTALL_FAILED_CONFLICTING_PROVIDER en Android
  • Android cuando usar ContentResolver applyBatch o BulkInsert
  • ¿Qué pasa si devuelve false en OnCreate de ContentProvider?
  • ¿Es posible acceder a recursos en otro APK sin utilizar proveedores de contenido?
  • Android múltiples proveedores de contenido, (DLC)
  • Proveedores de contenido multiproceso sincronizados a uno predeterminado
  • ¿Qué es un reemplazo de MODE_WORLD_READABLE SharedPreferences obsoleto en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.