Android: java.lang.SecurityException: Berechtigungsverweigerung: Start Intent


112

Ich habe eine Anwendung erstellt, die die GWVectraNotifier-Aktivität enthält, die von anderen Anwendungen aufgerufen wird, um die Benachrichtigung anzuzeigen.

Im Dialogfeld "Benachrichtigung" werden die Schaltflächen "Anzeigen" und "Schließen" angezeigt.

Durch Klicken auf die Schaltfläche "Anzeigen" wird die entsprechende Aktivität gestartet.

Um die Funktionalität der oben genannten Anwendung zu überprüfen,

Ich habe die GWVectraNotifier-Aktivität über die K9Mail-Anwendung beim Auslösen eines Checkmail-Ereignisses gestartet.

Ich kann die GWVectraNotifier-Aktivität erfolgreich starten, aber wenn ich auf die Schaltfläche "Anzeigen" klicke, muss ich die Aktivität "MessageList" von K9mail starten. Dazu habe ich den folgenden Code geschrieben:

Intent i = new Intent();
i.setComponent(new ComponentName("com.fsck.k9", "com.fsck.k9.activity.MessageList"));
i.putExtra("account", accUuid);
i.putExtra("folder", accFolder);
startActivity(i); 

was wirft:

WARN/ActivityManager(59): Permission denied: checkComponentPermission() reqUid=10050
WARN/ActivityManager(59): Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675): java.lang.SecurityException: Permission Denial: starting Intent { cmp=com.fsck.k9/.activity.MessageList (has extras) } from ProcessRecord{43f6d7c8 675:com.i10n.notifier/10052} (pid=675, uid=10052) requires null
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1247)
WARN/System.err(675):     at android.os.Parcel.readException(Parcel.java:1235)
WARN/System.err(675):     at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1298)
WARN/System.err(675):     at android.app.Instrumentation.execStartActivity(Instrumentation.java:1373)
WARN/System.err(675):     at android.app.Activity.startActivityForResult(Activity.java:2817)
WARN/System.err(675):     at android.app.Activity.startActivity(Activity.java:2923)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2$1.run(GWVectraNotifier.java:63)
WARN/System.err(675):     at android.app.Activity.runOnUiThread(Activity.java:3707)
WARN/System.err(675):     at com.i10n.notifier.GWVectraNotifier$2.onClick(GWVectraNotifier.java:53)
WARN/System.err(675):     at android.view.View.performClick(View.java:2408)
WARN/System.err(675):     at android.view.View$PerformClick.run(View.java:8816)
WARN/System.err(675):     at android.os.Handler.handleCallback(Handler.java:587)
WARN/System.err(675):     at android.os.Handler.dispatchMessage(Handler.java:92)
WARN/System.err(675):     at android.os.Looper.loop(Looper.java:123)
WARN/System.err(675):     at android.app.ActivityThread.main(ActivityThread.java:4627)
WARN/System.err(675):     at java.lang.reflect.Method.invokeNative(Native Method)
WARN/System.err(675):     at java.lang.reflect.Method.invoke(Method.java:521)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
WARN/System.err(675):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
WARN/System.err(675):     at dalvik.system.NativeStart.main(Native Method)

Eigentlich kann ich nicht verstehen, welche Berechtigungen in die Manifestdatei meiner Notifier-Anwendung aufgenommen werden sollen, um auf die MessageList von k9Mail zuzugreifen. Ich füge unten die Berechtigungen ein, die in der Manifestdatei der k9mail-Anwendung enthalten sind:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
<uses-permission android:name="android.permission.READ_OWNER_DATA"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"/>
<permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="dangerous"
            android:label="@string/read_attachment_label"
            android:description="@string/read_attachment_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_ATTACHMENT"/>
<permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"
             android:permissionGroup="android.permission-group.MESSAGES"
             android:protectionLevel="dangerous"
             android:label="@string/remote_control_label"
             android:description="@string/remote_control_desc"/>
<uses-permission android:name="com.fsck.k9.permission.REMOTE_CONTROL"/>
<permission android:name="com.fsck.k9.permission.READ_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/read_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.READ_MESSAGES"/>
<permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"
            android:permissionGroup="android.permission-group.MESSAGES"
            android:protectionLevel="normal"
            android:label="@string/delete_messages_label"
            android:description="@string/read_messages_desc"/>
<uses-permission android:name="com.fsck.k9.permission.DELETE_MESSAGES"/>           

Kann mir jemand sagen, welche Berechtigung ich in meine App aufnehmen soll? In den obigen Berechtigungen gelten einige nur für k9mail, da dies die für k9 geschriebenen Berechtigungsklassen sind. Daher kann ich nur die integrierten Berechtigungen von Android in die oben angegebenen Berechtigungen aufnehmen. Ich habe es auch versucht, aber es hat mein Problem nicht gelöst :(


Ich habe dieses Problem behoben, indem ich den folgenden Absichtsfilter in die Manifestdatei unter dem Tag MessageList Activity in AndroidManifest.xml eingefügt habe: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP

Ich habe sowohl <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter> als auch android: exported = "true" hinzugefügt, aber ich erhalte immer noch java.lang.security Ausnahme?
Charan Pai

Antworten:


155

Sie müssen android:exported="true"die Manifestdatei in der Aktivität hinzufügen, die Sie starten möchten.

Vom Android: Exportierte Dokumentation :

android: exportiert Gibt an,
ob die Aktivität von Komponenten anderer Anwendungen gestartet werden kann - "true", wenn dies möglich ist, und "false", wenn nicht. Bei "false" kann die Aktivität nur von Komponenten derselben Anwendung oder von Anwendungen mit derselben Benutzer-ID gestartet werden.

Der Standardwert hängt davon ab, ob die Aktivität Absichtsfilter enthält. Das Fehlen von Filtern bedeutet, dass die Aktivität nur durch Angabe des genauen Klassennamens aufgerufen werden kann. Dies bedeutet, dass die Aktivität nur für die anwendungsinterne Verwendung vorgesehen ist (da andere den Klassennamen nicht kennen würden). In diesem Fall ist der Standardwert "false". Andererseits bedeutet das Vorhandensein mindestens eines Filters, dass die Aktivität für die externe Verwendung vorgesehen ist, sodass der Standardwert "true" ist.

Dieses Attribut ist nicht die einzige Möglichkeit, die Exposition einer Aktivität gegenüber anderen Anwendungen zu begrenzen. Sie können auch eine Berechtigung verwenden, um die externen Entitäten einzuschränken, die die Aktivität aufrufen können (siehe Berechtigungsattribut).


2
Beheben Sie die Hälfte des Problems für mich. Wenn Sie versuchen, die Anwendung zuerst mit dem exportierten Dienst zu installieren und dann die Hauptanwendung zu installieren, wird es Ihnen nie gelingen, den Dienst zu entfernen. Der andere Weg funktioniert trotzdem einwandfrei. Dies liegt daran Die erforderliche Berechtigung ist bei der Installation der Haupt-App nicht vorhanden, aber ich weiß nicht, wie ich sie lösen kann, ohne die Berechtigungen zu entfernen ...
Bibu

102

Das, was java.lang.SecurityExceptionSie sehen, ist, weil Sie zwei Einträge eingeben können, die auf dieselbe Aktivität verweisen. Entfernen Sie den zweiten und Sie sollten bereit sein zu gehen.

Weitere Erklärung

Sie können die Aktivität zweimal im Manifest mit verschiedenen Eigenschaften deklariert werden, wie z.

 <activity android:name=".myclass"> </activity>

und

 <activity android:name=".myclass" android:label="@string/app_name"> 
     <intent-filter> 
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

Sie sollten das unerwünschte aus dem Manifest entfernen


2
Sie können die Aktivität im Manifest zweimal mit verschiedenen Eigenschaften deklariert werden, z. B.: <activity android: name = ". myclass"> </ activity> und <activity android: name = ". myclass" android: label = "@ string / app_name "> <intent-filter> <action android: name =" android.intent.action.MAIN "/> <category android: name =" android.intent.category.LAUNCHER "/> </ intent-filter> < / Aktivität>. Sie sollten die unerwünschte aus dem Manifest entfernen
Jomia

1
Tolle Antwort jomia. Aber eine Frage, zu einer Zeit habe ich nur eine Launcher-Aktivität. Und der gleiche Code läuft mit eumlaotr, aber im Gerät zeigt es Sicherheitsausnahme. Können Sie bitte näher darauf eingehen.
Tofeeq Ahmad

Ich denke, Sie müssen die App auf dem Gerät deinstallieren und erneut installieren. Dann wird es funktionieren
Jomia

16

Schreiben Sie dies zuvor in Ihre Manifest-Datei </application >

<activity android:name="com.fsck.k9.activity.MessageList">
   <intent-filter>
      <action android:name="android.intent.action.MAIN">
      </action>
   </intent-filter>
</activity>

und sag mir, ob es dein Problem löst :)


Nun, als ich mir die Protokolle ansah, war ich mir ziemlich sicher, dass es helfen würde. Fügen Sie hier Ihre vollständige Manifestdatei ein
Muhammad Shahab,

<manifest xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <Verwendungsberechtigung android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> <Verwendungsberechtigung android: name = "android.permission.READ_CONTACTS" /> <Verwendungsberechtigung android: name = "android.permission.READ_SYNC_SETTINGS" /> <Verwendungsberechtigung android: name = "android.permission.READ_OWNER_DATA" /> <Verwendungsberechtigung android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP

<Verwendungsberechtigung android: name = "android.permission.INTERNET" /> <Verwendungsberechtigung android: name = "android.permission.VIBRATE" /> <Verwendungsberechtigung android: name = "android.permission.WAKE_LOCK" / > <Verwendungsberechtigung android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <application android: icon = "@ drawable / icon" android: label = "@ string / app_name" android: theme = "@ android: style / Theme.NoTitleBar "> <Aktivität android: name =". GWVectraNotifier "android: label =" @ string / app_name "android: theme =" @ android: style / Theme.Dialog ">
Swathi EP

<intent-filter> <action android: name = "android.intent.action.MAIN" /> <category android: name = "android.intent.category.LAUNCHER" /> </ intent-filter> </ activity> < / application> </ manifest>
Swathi EP

In den obigen 3 Kommentaren habe ich meine Notifier-Anwendungsmanifestdatei eingefügt. Danke für deine Antwort.
Swathi EP


6

Ich hatte das gleiche Problem und wollte vermeiden, den von Ihnen beschriebenen Absichtsfilter hinzuzufügen. Nach einigem Graben fand ich ein XML-Attribut android: exportiert , das Sie zu der Aktivität hinzufügen sollten, die Sie aufrufen möchten.

Es ist standardmäßig auf false gesetzt, wenn Ihrer Aktivität kein Absichtsfilter hinzugefügt wurde. Wenn Sie jedoch einen Absichtsfilter haben, wird dieser auf true gesetzt.

Hier ist die Dokumentation http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: android:exported="true"Füge deiner Aktivität in deiner AndroidManifest.xml-Datei hinzu und vermeide das Hinzufügen des Intent-Filters :)


1

Stellen Sie sicher, dass für die Komponente das Flag "exportiert" auf "true" gesetzt ist. Außerdem sollte die Komponente, die die Berechtigung definiert, vor der Komponente installiert werden, die sie verwendet.


Außerdem müssen Sie sicherstellen, dass sich Ihre App in der System- / Priv-App-Partition befindet, um Luxus auf Systemebene zu genießen. Dies ist in KitKat-Weiterleitungsgeräten erforderlich
Naren

1

Es ist einfach, vielleicht haben Sie Fehler in der Konfiguration.

Zum Beispiel: Manifest.xml

Geben Sie hier die Bildbeschreibung ein

Aber in meiner Konfiguration haben für Standardaktivität .Splash

Geben Sie hier die Bildbeschreibung ein

Sie müssen diese Konfiguration und die Datei Manifest.xml überprüfen

Viel Glück


1

Ich habe diese Ausnahme gelöst, indem ich die target sdkVersion ab 19 Kitkat-Version geändert habeAndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

Übrigens, im Moment kümmert sich Gradle darum, und Android-Entwickler geben keine SDK-Version in der Manifest-Datei an
kiedysktos

1
Es gibt eine schreckliche Lösung. Zielen Sie niemals nach unten.
Jared Burrows

Dies wird funktionieren, aber es besteht eine hohe Wahrscheinlichkeit, dass mehr Probleme verursacht als gelöst werden. Das ist meine Meinung
Evren Ozturk

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.