webentwicklung-frage-antwort-db.com.de

Android: Java.lang.SecurityException: Berechtigungsverweigerung: Intent starten

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

Im Benachrichtigungsdialog gibt es die Schaltflächen "Anzeigen" und "Schließen".

Mit einem Klick auf 'Anzeigen' wird die entsprechende Aktivität gestartet.

Um die Funktionalität der obigen 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 "Anzeigen" klicke, muss ich die "MessageList" -Aktivität 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)

Tatsächlich kann ich nicht verstehen, welche Berechtigungen in die Manifestdatei meiner Notifier-Anwendung aufgenommen werden müssen, um auf die Nachrichtenliste von k9Mail zuzugreifen. Ich füge die folgenden 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 darf? In den oben genannten Berechtigungen gelten einige nur für k9mail, da dies die Berechtigungsklassen sind, die für k9 geschrieben wurden. Daher kann ich nur die eingebauten Berechtigungen von Android in die oben angegebenen Berechtigungen aufnehmen. Ich habe es auch versucht, aber es hat mein Problem nicht gelöst :(

110
Swathi EP

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

Aus dem Android: exportierte Dokumentation :

Android: exportiert
Ob die Aktivität von Komponenten anderer Anwendungen gestartet werden kann oder nicht - "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 impliziert, dass die Aktivität nur für die interne Verwendung durch die Anwendung bestimmt ist (da andere den Klassennamen nicht kennen würden). In diesem Fall lautet 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).

155
Prateek Thakur

Das Java.lang.SecurityException Sie sehen, dass Sie zwei Einträge eingeben können, die auf dieselbe Aktivität verweisen. Entfernen Sie die zweite und Sie sollten bereit sein zu gehen.

Mehr Erklärung

Sie können die Aktivität zweimal im Manifest mit verschiedenen Eigenschaften deklarieren, 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 den unerwünschten aus dem Manifest entfernen

101
Jomia

Schreiben Sie dies in Ihre Manifest-Datei vor </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 :)

15
Muhammad Shahab

Ich hatte dieses Problem mit genau dieser Aktivität.

Sie können com.fsck.k9.activity.MessageList nicht über eine externe Aktivität starten.

Ich habe es gelöst mit:

Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9");this.startActivity(LaunchK9);

Verwenden Sie http://developer.Android.com/reference/Android/content/pm/PackageManager.html

7
user1305537

Ich bin auf dasselbe Problem gestoßen und wollte vermeiden, den von Ihnen beschriebenen Intent-Filter hinzuzufügen. Nach einigem Graben fand ich ein xml-Attribut für Android: exportiert , das Sie zu der Aktivität hinzufügen sollten, die Sie aufrufen möchten.

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

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

tl; dr: addAndroid:exported="true" zu Ihrer Aktivität in Ihrer AndroidManifest.xml-Datei und vermeiden Sie das Hinzufügen des Intent-Filters :)

6
Jason

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.

1
Naren

Ich habe diese Ausnahme durch Ändern des target sdk Version ab 19 KitKat Version AndroidManifest.xml.

<uses-sdk
        Android:minSdkVersion="8"
        Android:targetSdkVersion="19" />
1
Stephen

Möglicherweise liegt ein Fehler in der Konfiguration vor.

Zum Beispiel: Manifest.xml

enter image description here

Habe aber in meiner Konfiguration standardmäßig Activity .Splash

enter image description here

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

Viel Glück

1
David Hackro

Mein Problem war, dass ich folgendes hatte: wrong Stattdessen: correct

0
Uriel Frankel