En mi aplicación, el usuario tiene la capacidad de tomar una foto o agregar una foto a la aplicación. Recibo informes de fallos de java.lang.SecurityException cuando la aplicación intenta mostrar la imagen guardada en un ImageView
La línea en la que se equivoca es
holder.imageV.setImageURI(uriParsed);
No he podido duplicar el error en mi dispositivo o en los simuladores, todos muestran bien la imagen.
El código completo que estoy usando es
JoinProjectPicture projectPicture = mProjects.get(position);
Project current = projectPicture.getProject();
Picture picture = projectPicture.getPicture();
holder.projectName.setText(current.getProjectName() + "(" + current.getWidth() + "x" + current.getHeight() + ")");
holder.projectStatusTV.setText(current.getStatus());
if(picture != null) {
String pictureName = picture.getPictureName();
Uri uriParsed = Uri.parse(pictureName);
if(uriParsed != null) {
Log.d("URIParsed", "Project: " + current.getProjectName() + " - Parsed: " + uriParsed);
holder.imageV.setImageURI(uriParsed);
}
}
La salida de los registros que se muestran en mi dispositivo (3 proyectos, uno sin imagen)
Proyecto: Prueba - Analizado: archivo: ///storage/emulated/0/Android/data/com.desbrina.diamondpaintinglogbook/files/Pictures/20191111_1408166491573472523237896.jpg
Proyecto: Prueba 3 - Analizado: contenido: //com.android.providers.media.documents/document/image%3A1891
El error
java.lang.SecurityException:
at android.os.Parcel.createException (Parcel.java:1966)
at android.os.Parcel.readException (Parcel.java:1934)
at android.os.Parcel.readException (Parcel.java:1884)
at android.app.IActivityManager$Stub$Proxy.getContentProvider (IActivityManager.java:4039)
at android.app.ActivityThread.acquireProvider (ActivityThread.java:6365)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider (ContextImpl.java:2825)
at android.content.ContentResolver.acquireUnstableProvider (ContentResolver.java:1835)
at android.content.ContentResolver.openTypedAssetFileDescriptor (ContentResolver.java:1449)
at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1302)
at android.content.ContentResolver.openAssetFileDescriptor (ContentResolver.java:1225)
at android.graphics.ImageDecoder$ContentResolverSource.createImageDecoder (ImageDecoder.java:273)
at android.graphics.ImageDecoder.decodeDrawableImpl (ImageDecoder.java:1652)
at android.graphics.ImageDecoder.decodeDrawable (ImageDecoder.java:1645)
at android.widget.ImageView.getDrawableFromUri (ImageView.java:952)
at android.widget.ImageView.resolveUri (ImageView.java:921)
at android.widget.ImageView.setImageURI (ImageView.java:532)
at android.support.v7.widget.AppCompatImageView.setImageURI (AppCompatImageView.java:116)
at com.desbrina.diamondpaintinglogbook.ui.main.Adapters.ProjectListAdapter.onBindViewHolder (ProjectListAdapter.java:88)
at com.desbrina.diamondpaintinglogbook.ui.main.Adapters.ProjectListAdapter.onBindViewHolder (ProjectListAdapter.java:23)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder (RecyclerView.java:6781)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder (RecyclerView.java:6823)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:6019)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition (RecyclerView.java:5854)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next (LinearLayoutManager.java:2230)
at android.support.v7.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1557)
at android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1517)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:612)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3924)
at android.support.v7.widget.RecyclerView.dispatchLayout (RecyclerView.java:3641)
at android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:4194)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.support.constraint.ConstraintLayout.onLayout (ConstraintLayout.java:1915)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.support.v4.view.ViewPager.onLayout (ViewPager.java:1775)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1812)
at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1656)
at android.widget.LinearLayout.onLayout (LinearLayout.java:1565)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.widget.FrameLayout.layoutChildren (FrameLayout.java:323)
at android.widget.FrameLayout.onLayout (FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout (DecorView.java:1088)
at android.view.View.layout (View.java:22406)
at android.view.ViewGroup.layout (ViewGroup.java:6594)
at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:3417)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2884)
at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1932)
at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8589)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:949)
at android.view.Choreographer.doCallbacks (Choreographer.java:761)
at android.view.Choreographer.doFrame (Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:935)
at android.os.Handler.handleCallback (Handler.java:873)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:214)
at android.app.ActivityThread.main (ActivityThread.java:7094)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:975)
Caused by: android.os.RemoteException:
at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15677)
at com.android.server.am.ActivityManagerService.getContentProviderImpl (ActivityManagerService.java:15586)
at com.android.server.am.ActivityManagerService.getContentProvider (ActivityManagerService.java:16151)
at android.app.IActivityManager$Stub.onTransact$getContentProvider$ (IActivityManager.java:11035)
at android.app.IActivityManager$Stub.onTransact (IActivityManager.java:295)
Respuestas:
Creo que está recibiendo la excepción de seguridad en un sistema operativo Android Pie o posterior. Esto se debe a que en estos sistemas tienes que declarar la ruta que tu aplicación quiere usar.
Verifique: https://developer.android.com/reference/android/support/v4/content/FileProvider
Además, es posible que su aplicación esté tratando de obtener contenido de otra aplicación que requiere permiso, como Google Photos requiere:
<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
Compruebe esto: java.lang.SecurityException: denegación de permisos: proveedor de apertura com.google.android.apps.photos.content.GooglePhotosImageProvider
fuente
Desde Api
24
, no puede acceder al archivo Uris directamente. Debe usar Autoridades de archivo para la carpeta y luego usarEn AndroidManifes.xml
Agregue lo siguiente a la
application
etiqueta. En el siguiente nombre del paquete esBuildConfig.APPLICATION_ID
proveedor_rutass.xml
fuente
Esta excepción generalmente es causada por el uso de imageuri de aplicaciones de terceros. La solución es implementar el proveedor de archivos. Puede obtener muchas soluciones sobre cómo implementar el proveedor de archivos.
fuente
Sospecho que esto se debe a los permisos que ha implementado en su
AndroidManifest.xml
archivo. Si está depurando enAPI Level 23
una versión de Android o superior, entonces debe tomar el permiso deWRITE_EXTERNAL_STORAGE
tiempo de ejecución en tiempo de ejecución ya que se produce una excepción de seguridad debido a un permiso denegado por el dispositivo.fuente
Esto se debe a que en la nueva versión se
Android 9
introdujo un nuevoFOREGROUND_SERVICE
permiso; los documentos dicen:Simplemente agregue el permiso al manifiesto y debería hacer el truco, "en teoría". ¡¡Haznos saber!! Algo como:
Tratemos de tomar esa recompensa: ¿Tienes estos permisos ?:
También creo que esto no es tan malo para probar:
fuente
AndroidManifest.xml
donde coloca todos los permisos como:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </manifest>