Esta cuestión se puede solucionar de variadas formas, pero en este caso te mostramos la resolución más completa para nosotros.
Solución:
A partir de Lollipop, Google introdujo una nueva forma de otorgar explícitamente a las aplicaciones el permiso que desea que usen en su dispositivo y deshabilitar las que desea denegar la aplicación. Si nota, en su monitor de Android, el registro muestra
java.io.FileNotFoundException: /storage/emulated/0/advert.mp4: open failed: EACCES (Permission denied)
EACCESS permission denied
es la causa del infame java FileNotFoundException
.
Para resolver esto, simplemente vaya al permiso de su aplicación y habilite el almacenamiento para su aplicación.
Necesitas
en tu manifiesto.
Aparece setImageViewUri
ya no es seguro usarlo con file:// uris.
¿Por qué?
Jellybean introdujo el READ_EXTERNAL_STORAGE
permiso. Las aplicaciones que quieran leer desde un almacenamiento externo deben tener este permiso. Esto no se aplicó de forma predeterminada hasta KitKat.
El lanzador no tiene este permiso. De hecho, no se le garantiza que cualquier RemoteView al que adjunte tenga ese permiso. Esto hace que no sea seguro usar setImageViewUri, ya que no sabe si la vista de imagen remota podrá leer el uri dado.
¿Ahora que?
Opción 1: use setImageViewBitmap.
Es posible que se haya alejado de esta opción debido a transacciones vinculantes fallidas. El truco para eso es asegurarse de que su imagen tenga menos de 1 MB. Esto no es tan difícil como parece. Puede calcular exactamente qué tan grande será su imagen. Por ejemplo, si está utilizando una imagen ARGB_8888, eso significa que necesitará 4 bytes por píxel. Podemos calcular el tamaño máximo por:
1 Mb = 1048576 bytes = 262144 píxeles = 512 x 512 imagen
Por supuesto, puede exprimirlo más usando RGB_565 para obtener el doble de píxeles.
También tenga en cuenta que es posible que no necesite una imagen enorme si su widget es pequeño. Su appwidget puede preguntar acerca de sus opciones específicas de la siguiente manera:
Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetIds[i]);
int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
int maxWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int maxHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
Solo tenga en cuenta que los valores devueltos están en dip, no en píxeles, por lo que deberá convertirlos para escalar su mapa de bits.
Opción 2: usar un proveedor de contenido
Si por alguna razón aún no le gusta la restricción de IPC, siempre puede crear un proveedor de contenido personalizado. Pase ese uri a setImageViewUri, y debería estar listo para comenzar.
¿Qué pasa con el cambio de ruta?
El cambio de ruta no es el verdadero problema. Parece que es un problema, pero la emulación en realidad funciona bien. Intenta crear un archivo dentro //storage/emulated/0/sdcard/mydir/bgs
y el archivo se creará muy bien.
Notará que mientras la excepción es FileNotFoundException, el mensaje es Permiso denegado.
Aquí tienes las reseñas y valoraciones
Recuerda algo, que tienes la capacidad de valorar este enunciado si diste con el resultado.