In meiner App hat der Benutzer die Möglichkeit, ein Foto aufzunehmen oder der App ein Foto hinzuzufügen. Ich erhalte Absturzberichte von java.lang.SecurityException, wenn die App versucht, das gespeicherte Bild in einer ImageView anzuzeigen
Die Zeile, auf der es Fehler gibt, ist
holder.imageV.setImageURI(uriParsed);
Ich konnte den Fehler weder auf meinem Gerät noch auf Simulatoren selbst duplizieren. Alle zeigen das Bild einwandfrei an.
Der vollständige Code, den ich verwende, ist
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);
}
}
Die Ausgabe der auf meinem Gerät angezeigten Protokolle (3 Projekte, eines ohne Bild)
Projekt: Test - Analysiert: Datei: ///storage/emulated/0/Android/data/com.desbrina.diamondpaintinglogbook/files/Pictures/20191111_1408166491573472523237896.jpg
Projekt: Test 3 - Analysiert: Inhalt: //com.android.providers.media.documents/document/image%3A1891
Der Fehler
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)
Antworten:
Ich denke, Sie erhalten die Sicherheitsausnahme auf einem Android Pie oder einem späteren Betriebssystem. Dies liegt daran, dass Sie auf diesen Systemen den Pfad angeben müssen, den Ihre App verwenden möchte.
Bitte überprüfen Sie: https://developer.android.com/reference/android/support/v4/content/FileProvider
Darüber hinaus ist es möglich, dass Ihre App versucht, Inhalte von einer anderen App abzurufen, für die eine Berechtigung erforderlich ist, wie dies für Google Fotos erforderlich ist:
<uses-permission android:name="com.google.android.apps.photos.permission.GOOGLE_PHOTOS"/>
Überprüfen Sie Folgendes : java.lang.SecurityException: Berechtigungsverweigerung: Öffnen des Anbieters com.google.android.apps.photos.content.GooglePhotosImageProvider
quelle
Über die API
24
können Sie nicht direkt auf die Datei Uris zugreifen. Sie müssen die Dateiberechtigungen für den Ordner verwenden und dann verwendenIn AndroidManifes.xml
Fügen Sie dem
application
Tag Folgendes hinzu . Im folgenden Paketname istBuildConfig.APPLICATION_ID
provider_paths.xml
quelle
Diese Ausnahme wird normalerweise durch die Verwendung von imageuri aus einer Drittanbieter-App verursacht. Die Lösung besteht darin, den Dateianbieter zu implementieren. Sie können viele Lösungen zur Implementierung des Dateiproviders erhalten.
quelle
Ich vermute, dass dies an den Berechtigungen liegt, die Sie in Ihrer
AndroidManifest.xml
Datei implementiert haben . Wenn Sie auf einerAPI Level 23
oder einer höheren Android-Version debuggen , müssen Sie zur Laufzeit die Laufzeitberechtigung übernehmen,WRITE_EXTERNAL_STORAGE
da aufgrund der vom Gerät verweigerten Berechtigung eine Sicherheitsausnahme auftritt.quelle
Dies liegt daran, dass bei der neuen Version
Android 9
eine neueFOREGROUND_SERVICE
Berechtigung eingeführt wurde; Die Dokumente sagen:Fügen Sie einfach die Erlaubnis zum Manifest hinzu und sollten Sie den Trick "theoretisch" ausführen. Lass uns wissen!! Etwas wie:
Versuchen wir, dieses Kopfgeld zu nehmen: Haben Sie diese Erlaubnis?:
Auch ich denke, das ist nicht schlecht zu versuchen:
quelle
AndroidManifest.xml
in der Sie alle Berechtigungen platzieren wie:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </manifest>