¿Por qué usar un FileProvider? No puedo abrir el archivo desde INTERNAL STORAGE con aplicaciones externas.
He creado una aplicación que puede importar el archivo en su almacenamiento interno. Para abrir un archivo con una aplicación externa (por ejemplo, PF viewer o Photos) he intentado seguir estas guías: la guía oficial , topic1 , topic2 , topic3 y topic4 pero sin éxito.
Aquí está mi código:
- Compartir fotos con Android con FileProvider
- PackageManager # installPackage no funciona para Android N
- Error al encontrar la raíz configurada que contiene
- Error de FileProvider en los dispositivos Huawei
- Cómo abrir un archivo APK para todas las versiones de Android
En mi manifiesto
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.myapp.chatcher" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
Mi valor del paquete: package="com.myapp.catcher"
My file_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="projection" path="." /> </paths>
mi código
String fileName = path.substring(path.lastIndexOf("/") + 1); String shelf = path.substring(path.lastIndexOf("PRIVATE") + 8, path.lastIndexOf("/")); File filePath = new File(mContext.getFilesDir(), "PRIVATE".concat("/").concat(shelf).concat("/")); File newFile = new File(filePath, fileName); Uri contentUri = FileProvider.getUriForFile(mContext, "com.myapp.chatcher", newFile); Intent myIntent = new Intent(); myIntent.setAction(Intent.ACTION_VIEW); myIntent.setData(contentUri); myIntent.setType(mimeType); myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); mContext.startActivity(myIntent);
He creado una jerarquía como esta:
PRIVATE -> shelf1 -> my files -> shelf2 -> my files -> shelfN -> my files
Por ejemplo: data/user/0/com.myapp.chatcher/files/PRIVATE/testshelf/Screenshot_2017-01-04-09-45-13.png
El resultado de imprimir el newFile.getAbsolutePath () es
/data/user/0/com.myapp.chatcher/files/PRIVATE/bogl/imagetest.jpg
Este código abre el selector en el que puedo hacer clic en "Fotos" y luego se abre la "aplicación Fotos" sin mostrarme el imagetest.jpg pero la carpeta en la que hay todas las imágenes. Si intento con un archivo pdf, no abre el pdf y aparece un brindis con el mensaje "no media".
¿Qué tiene de malo mi código?
- Proveedor de archivos de Android Illegal Argument Exception
- Android: FileProvider IllegalArgumentException Error al encontrar la raíz configurada que contiene /data/data/**/files/Videos/final.mp4
- Android FileProvider para ext sdcard
- Android - proveedor de archivos - permiso de denegación
- FileProvider no funciona con la cámara
- Compartir imágenes desde el almacenamiento interno mediante FileProvider
- FileProvider y almacenamiento externo secundario
- ¿Cómo puede hacer un FileProvider disponible para otras aplicaciones?
Gracias a @greenapps que es un experto en Android, me di cuenta de que el problema no estaba en el proveedor sino en la intención.
En lugar de esto:
Intent myIntent = new Intent(); myIntent.setAction(Intent.ACTION_VIEW); myIntent.setData(contentUri); myIntent.setType(mimeType); myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); mContext.startActivity(myIntent);
Necesito hacer esto:
Intent myIntent = new Intent(Intent.ACTION_VIEW); myIntent.setDataAndType(contentUri, mimeType); myIntent.setFlags(FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); mContext.startActivity(myIntent);
- Cómo atenuar el fondo cuando se utiliza la parte inferior de la biblioteca de soporte?
- ActiveAndroid: columnas de fecha no creadas