Java Android Sicherheitsausnahme

8

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)
Ceri Turner
quelle
Haben Sie versucht, eine verschleierte Release-Version Ihrer App zu erstellen und zu testen? Funktioniert es?
Sagar
Können Sie das vollständige Fehlerprotokoll veröffentlichen? Verwenden Sie uri aus Ihrem Telefonspeicher?
Amit Tiwary
Die IT erfolgt entweder aus dem Telefonspeicher oder aus der App, je nachdem, ob sie aus der Galerie hinzugefügt oder von der Kamera in der App übernommen wurde. Voller Absturz hinzugefügt
Ceri Turner
1
Stellen Sie sicher, dass Folgendes erfüllt ist: Schreibberechtigungen und dass Sie einen Dateianbieter haben, wenn Sie in einem benutzerdefinierten internen Pfad speichern.
TheRealChx101
Sie sagen, dass Sie den Code auf Emulatoren ausprobiert haben. Ich würde empfehlen, solchen hardwarebezogenen Code auf fast jeder Android-Version zu testen. Haben Sie es auf Android Pie versucht, wie die folgenden Antworten vermuten lassen?
L3n95

Antworten:

4

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

Vatish Sharma
quelle
Ich bekomme es auf 9, aber ich laufe 10 und kann es nicht selbst reproduzieren. Ich habe versucht, es auf einer 9 ähnlich zu reproduzieren oder konnte es nicht
Ceri Turner
Ich erhalte diesen Fehler, wenn ich versuche, eine Absicht für eine Galerie-App eines Drittanbieters (in meinem Fall Google Fotos) auszulösen, damit ich ein Foto für meine App auswählen kann. Wahrscheinlich benötigen Sie auch eine App, die eine Erlaubnis benötigt, bevor Sie eine Absicht dazu geben können.
Vatish Sharma
Ich habe das hinzugefügt und es stürzt immer noch ab
Ceri Turner
4

Über die API 24können Sie nicht direkt auf die Datei Uris zugreifen. Sie müssen die Dateiberechtigungen für den Ordner verwenden und dann verwenden

val photoURI = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".provider", File(path));

In AndroidManifes.xml

Fügen Sie dem applicationTag Folgendes hinzu . Im folgenden Paketname istBuildConfig.APPLICATION_ID

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="packagename.provider"
            android:enabled="true"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external"
        path="." />
</paths>
Mustansar Saeed
quelle
3

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.

AkashToSky
quelle
Ich habe gesucht und bin mir nicht sicher, was ich ändern muss. Derzeit füge ich die Bilder mit pastebin.com/Xswi7puK hinzu und zeige sie mit pastebin.com/EQVvyRnG
Ceri Turner
Nein, es stürzt immer noch ab
Ceri Turner
Ich habe versucht, imageUri in einer Bildansicht einzustellen, aber es funktioniert gut für mich. Die alternative Lösung besteht darin, eine Bitmap aus dem Imageuri zu erstellen und auf Imageview zu setzen. Ich denke, es gibt ein Problem in imageuri. Woher bekommen Sie es?
AkashToSky
Ich erhalte den gleichen Fehler beim Versuch mit einer Bitmap. Die Bilder werden mit dem Code hier hinzugefügt. pastebin.com/Xswi7puK
Ceri Turner
Für den ersten Fall in onActivityResult ist photoUri nicht zugeordnet.
AkashToSky
2

Ich vermute, dass dies an den Berechtigungen liegt, die Sie in Ihrer AndroidManifest.xmlDatei implementiert haben . Wenn Sie auf einer API Level 23oder einer höheren Android-Version debuggen , müssen Sie zur Laufzeit die Laufzeitberechtigung übernehmen, WRITE_EXTERNAL_STORAGEda aufgrund der vom Gerät verweigerten Berechtigung eine Sicherheitsausnahme auftritt.

Omkar C.
quelle
Sowohl das externe Lesen als auch das externe Schreiben befinden sich bereits in der Manifestdatei.
Ceri Turner
Übrigens wird WRITE_EXTERNAL_STORAGE in der nächsten Android-Version veraltet sein.
user70
2

Dies liegt daran, dass bei der neuen Version Android 9eine neue FOREGROUND_SERVICEBerechtigung eingeführt wurde; Die Dokumente sagen:

Hinweis: Apps, die darauf abzielen Android 9 (API level 28) oder höher und Vordergrunddienste verwenden, müssen die anfordern FOREGROUND_SERVICE permission. Dies ist eine normale Berechtigung, daher erteilt das System sie automatisch der anfordernden App. Wenn eine App, die auf API level 28oder höher abzielt, versucht, einen Vordergrunddienst ohne Aufforderung zu erstellen, löst FOREGROUND_SERVICEdas System a aus SecurityException.

Fügen Sie einfach die Erlaubnis zum Manifest hinzu und sollten Sie den Trick "theoretisch" ausführen. Lass uns wissen!! Etwas wie:

<manifest ...>   
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> 
     <application ...>
</manifest>

Versuchen wir, dieses Kopfgeld zu nehmen: Haben Sie diese Erlaubnis?:

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Auch ich denke, das ist nicht schlecht zu versuchen:

public static final String KITKAT_VALUE = 1002;

  Intent intent;

    if (Build.VERSION.SDK_INT < 19){
                            intent = new Intent();
                            intent.setAction(Intent.ACTION_GET_CONTENT);
                            intent.setType("image/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                        } else {
                            intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
                            intent.addCategory(Intent.CATEGORY_OPENABLE);
                            intent.setType("image/*");
                            startActivityForResult(intent, KITKAT_VALUE);
                    }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (requestCode == KITKAT_VALUE ) {
     if (resultCode == Activity.RESULT_OK) {
       // do something here
     }
  }
}
Qiqke
quelle
1
Ich habe einen kurzen Blick auf die Informationen geworfen und bin mir nicht sicher, wie sie zutreffen
Ceri Turner
Haben Sie keine Datei namens, AndroidManifest.xmlin der Sie alle Berechtigungen platzieren wie:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> </manifest>
Qiqke
Ich habe das hinzugefügt und es stürzt immer noch ab
Ceri Turner
Verwenden Sie einen dritten App-Service? Vielleicht verwendet dieser 3. einige Berechtigungen, die nicht verwendet werden können?
Qiqke
Die Drittanbieter-App, auf die zugegriffen wird, ist die Foto-App des Telefons. Das einzige, woran ich denken kann, ist, dass ich vor einiger Zeit die Art und Weise geändert habe, wie darauf zugegriffen wurde, und ich frage mich, ob die Berechtigungen nie so eingestellt wurden, dass der Zugriff erhalten bleibt. Neu hinzugefügte Bilder von Fotos funktionieren, ältere jedoch nicht. So werden die Bilder hinzugefügt: pastebin.com/5CcqXQQu
Ceri Turner