Stworzyłem aplikację zawierającą aktywność GWVectraNotifier, która jest wywoływana z innych aplikacji w celu wyświetlenia powiadomienia.
W oknie dialogowym Powiadomienia będzie widoczny przycisk „pokaż” i „zamknij”.
Po kliknięciu przycisku „pokaż” zostanie uruchomiona odpowiednia czynność.
Aby sprawdzić funkcjonalność powyższej aplikacji,
Uruchomiłem aktywność GWVectraNotifier z aplikacji K9Mail na wyzwalaczu zdarzenia checkmail.
Mogę pomyślnie uruchomić aktywność GWVectraNotifier, ale po kliknięciu przycisku 'pokaż' będę musiał uruchomić aktywność 'MessageList' K9mail. Aby to zrobić, napisałem poniższy kod:
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);
który rzuca:
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)
Właściwie nie jestem w stanie zrozumieć, jakie uprawnienia należy uwzględnić w pliku manifestu mojej aplikacji Notifier, aby uzyskać dostęp do MessageList k9Mail. Wklejam poniżej uprawnienia zawarte w pliku manifestu aplikacji k9mail:
<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"/>
Czy ktoś może mi powiedzieć, jakie uprawnienia należy uwzględnić w mojej aplikacji? W powyższych uprawnieniach niektóre są tylko dla k9mail, ponieważ są to klasy uprawnień napisane dla k9. Tak więc będę mógł uwzględnić tylko wbudowane uprawnienia Androida w podanych powyżej uprawnieniach. Próbowałem też to zrobić, ale to nie rozwiązało mojego problemu :(
źródło
Odpowiedzi:
Musisz dodać
android:exported="true"
do pliku manifestu w działaniu, które próbujesz uruchomić.Z Androida: wyeksportowana dokumentacja :
źródło
To,
java.lang.SecurityException
co widzisz, jest spowodowane tym, że możesz wprowadzić dwa wpisy wskazujące na tę samą czynność. Usuń drugi i powinieneś być gotowy.Więcej wyjaśnień
Możesz zostać zadeklarowany jako czynność 2 razy w manifeście z różnymi właściwościami, takimi jak:
i
Powinieneś usunąć niechciany z manifestu
źródło
W swoim pliku manifestu zapisz to wcześniej
</application >
i powiedz mi, czy to rozwiązuje Twój problem :)
źródło
Miałem ten problem z tą dokładną czynnością.
Nie można uruchomić com.fsck.k9.activity.MessageList z działania zewnętrznego.
Rozwiązałem to za pomocą:
Intent LaunchK9 = getPackageManager().getLaunchIntentForPackage("com.fsck.k9");
this.startActivity(LaunchK9);
Korzystanie z http://developer.android.com/reference/android/content/pm/PackageManager.html
źródło
Miałem ten sam problem i chciałem uniknąć dodawania filtru intencji, jak opisałeś. Po pewnym czasie znalazłem atrybut xml android: wyeksportowany , który powinieneś dodać do działania, które chcesz nazwać.
Domyślnie jest ustawiony na false, jeśli żaden filtr intencji nie został dodany do twojej aktywności, ale jeśli masz filtr intencji, zostanie ustawiony na true.
tutaj jest dokumentacja http://developer.android.com/guide/topics/manifest/activity-element.html#exported
tl; dr: dodaj
android:exported="true"
do swojej aktywności w pliku AndroidManifest.xml i unikaj dodawania filtru intencji :)źródło
Upewnij się, że dla komponentu ustawiono flagę „exported” na wartość true. Również komponent definiujący uprawnienia powinien być zainstalowany przed komponentem, który z niego korzysta.
źródło
To proste, może masz błąd w konfiguracji.
Na przykład: Manifest.xml
Ale w mojej konfiguracji mają domyślne Activity .Splash
musisz sprawdzić tę konfigurację i plik Manifest.xml
Powodzenia
źródło
Rozwiązałem ten wyjątek, zmieniając
target sdk
wersję od 19 wersji KitKatAndroidManifest.xml.
źródło
Mój problem polegał na tym, że miałem to: zamiast tego:
źródło