Android: java.lang.SecurityException: Заборона дозволу: запускати наміри


112

Я створив додаток, що містить активність GWVectraNotifier, яка викликається з інших програм для відображення сповіщень.

У діалоговому вікні Повідомлення буде кнопка "Показати" та "Закрити".

Після натискання кнопки "показати" відповідна діяльність буде запущена.

Щоб перевірити функціональність вищевказаної програми,

Я запустив активність GWVectraNotifier з програми K9Mail на тригері події checkmail.

Я можу успішно запустити активність GWVectraNotifier, але при натисканні кнопки "показати" мені доведеться запустити "MessageList" активність K9mail. Для цього я написав код нижче:

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); 

що кидає:

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)

Насправді я не в змозі зрозуміти, які дозволи включити до файлу маніфесту мого додатка Notifier для доступу до MessageList з k9Mail. Я вставляю нижче дозволів, включених у файл маніфесту програми 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"/>           

Чи може хтось мені сказати, який дозвіл включити у свій додаток? У наведених вище дозволах деякі є лише для k9mail, оскільки це класи дозволів, написані для k9. Отже, я зможу включати лише вбудовані дозволи для android у вищезазначені дозволи. Я також намагався зробити це, але це не вирішило мого питання :(


Я вирішив це, додавши наступний фільтр намірів у файл маніфесту під тегом MessageList Activity в AndroidManifest.xml: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ intent-filter >
Swathi EP

я додав і <intent-filter> <action android: name = "android.intent.action.MAIN" /> </intent-filter> і android: експортований = "справжній", але все одно я отримую java.lang.security виняток? Ви можете допомогти мені вирішити це питання ...
Чаран Пай

Відповіді:


155

Ви повинні додати android:exported="true"до файлу маніфесту активність, яку ви намагаєтеся почати.

З андроїда: експортована документація :

android: експортується
Незалежно від того, чи можна активувати запуск компонентів інших програм - "true", якщо це можливо, і "false", якщо ні. Якщо "false", діяльність може бути запущена лише компонентами тієї ж програми або програмами з тим самим ідентифікатором користувача.

Значення за замовчуванням залежить від того, чи містить активність фільтри намірів. Відсутність будь-яких фільтрів означає, що активність може бути запущена, лише вказавши її точну назву класу. Це означає, що діяльність призначена лише для внутрішнього використання додатків (оскільки інші не знають назву класу). Тож у цьому випадку значення за замовчуванням "false". З іншого боку, наявність щонайменше одного фільтра означає, що діяльність призначена для зовнішнього використання, тому значення за замовчуванням - "вірно".

Цей атрибут не є єдиним способом обмеження впливу дії інших програм. Ви також можете використовувати дозвіл, щоб обмежити зовнішні об'єкти, які можуть викликати активність (див. Атрибут дозволу).


2
Виправте половину проблеми для мене, якщо спершу спробувати встановити додаток із експортованою службою, а потім встановити основну програму, вам ніколи не вдасться дістатись до видалення сервісу ... інший спосіб все-таки добре працює ... Це тому, що потрібного дозволу немає під час встановлення основного додатка, але я не знаю, як його вирішити, не видаляючи дозволів ...
Bibu

102

java.lang.SecurityExceptionВи бачите, тому що ви можете ввести два записи , що вказує на ту ж діяльність. Видаліть другу, і вам слід добре піти.

Більше пояснення

Ви можете оголосити активність 2 рази в маніфесті з різними властивостями, наприклад:

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

і

 <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>

Вам слід видалити небажане з маніфесту


2
ви можете оголосити активність 2 рази в маніфесті з різними властивостями, наприклад: <активність android: name = ". myclass"> </activity> і <активність android: name = ". myclass" android: label = "@ string / app_name "> <intent-filter> <action android: name =" android.intent.action.MAIN "/> <категорія android: name =" android.intent.category.LAUNCHER "/> </intent-filter> < / діяльність>. ви повинні видалити небажане з маніфесту
Джомія

1
Чудова відповідь jomia. Але одне запитання, одночасно у мене є лише одна активність запуску. І той самий код запускається з eumlaotr, але в пристрої він показує виняток із безпеки. Ви можете розробити будь-ласка.
Tofeeq Ahmad

Я думаю, що вам доведеться видалити додаток у пристрої та встановити його знову. Тоді це спрацює
Джомія

16

У свій файл Manifest напишіть це раніше </application >

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

і скажіть, чи вирішує це ваше питання :)


ну дивлячись на журнали, я був впевнений, що це допоможе. Зробіть одну річ, тут вставте повний файл маніфесту
Мухаммед Шахаб

<manifest xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <використання-дозволу android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> <використання-дозволу android: name = "android.permission.READ_CONTACTS" /> <використання-дозволу android: name = "android.permission.READ_SYNC_SETTINGS" /> <використання-дозволу android: name = "android.permission.READ_OWNER_DATA" /> <використання-дозволу android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP

<використання-дозволу android: name = "android.permission.INTERNET" /> <використання-дозволу android: name = "android.permission.VIBRATE" /> <використання-дозволу android: name = "android.permission.WAKE_LOCK" / > <використання-дозволу android: name = "android.permission.WRITE_EXTERNAL_STORAGE" /> <додаток android: icon = "@ dravable / icon" android: label = "@ string / app_name" android: topic = "@ android: style / Theme.NoTitleBar "> <активність android: name =". GWVectraNotifier "android: label =" @ string / app_name "android: topic =" @ android: style / Theme.Dialog ">
Swathi EP

<intent-filter> <action android: name = "android.intent.action.MAIN" /> <категорія android: name = "android.intent.category.LAUNCHER" /> </intent-filter> </activity> < / application> </manifest>
Swathi EP

У вищевказаних 3 коментарях я вставив файл маніфесту програми Notifier. Спасибі за Вашу відповідь.
Сваті ЕП

7

У мене була проблема з цією точною діяльністю.

Ви не можете запустити com.fsck.k9.activity.MessageList із зовнішньої діяльності.

Я вирішив це за допомогою:

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

Використання http://developer.android.com/reference/android/content/pm/PackageManager.html


6

Я зіткнувся з тією ж проблемою і хотів уникнути додавання фільтра намірів, як ви описали. Після деякого копання я знайшов атрибут xml android: експортується, що ви повинні додати до діяльності, яку ви хотіли б викликати.

За замовчуванням встановлено значення false, якщо до вашої активності не доданий фільтр намірів, але якщо у вас є фільтр намірів, він встановлюється в значення true.

ось документація http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: додайте android:exported="true"до своєї діяльності у вашому файлі AndroidManifest.xml і уникайте додавання фільтра намірів :)


1

Переконайтеся, що для компонента "експортований" прапор встановлено значення true. Також компонент, що визначає дозвіл, повинен бути встановлений перед компонентом, який його використовує.


Крім того, ви повинні переконатися, що у вас є додаток у розділі system / priv-app, щоб насолоджуватися розкішшю на рівні системи. Це потрібно в пристроях для подальшого встановлення KitKat
Нарен

1

Це легко, можливо, у вас є помилка в конфігурації.

Наприклад: Manifest.xml

введіть тут опис зображення

Але в моїй конфігурації є за замовчуванням Activity .Splash

введіть тут опис зображення

вам потрібно перевірити цю конфігурацію та файл Manifest.xml

Щасти


1

Я вирішив цей виняток, змінивши target sdkверсію з 19 версії kitkatAndroidManifest.xml.

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

BTW, на даний момент Gradle опікується цим, а розробники Android не вказують версію sdk у файлі маніфесту
kiedysktos

1
Є жахливе рішення. Ніколи не націлюйте вниз.
Джаред Берроуз

Це спрацює, але є велика ймовірність, що це спричинить більше проблем, ніж вирішено. Така моя думка
Еврен Озтурк

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.