Android: java.lang.SecurityException: отказ в разрешении: начало намерения


112

Я создал приложение, содержащее действие GWVectraNotifier, которое вызывается из других приложений для отображения уведомлений.

В диалоговом окне уведомлений будут кнопки «показать» и «закрыть».

При нажатии кнопки «показать» будет запущено соответствующее действие.

Чтобы проверить функциональность вышеуказанного приложения,

Я запустил действие GWVectraNotifier из приложения K9Mail при запуске события checkmail.

Я могу успешно запустить действие GWVectraNotifier, но при нажатии кнопки «показать» мне нужно будет запустить действие «Список сообщений» 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)

На самом деле я не могу понять, какие разрешения включить в файл манифеста моего приложения-уведомителя для доступа к списку сообщений 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: exported = "true", но все равно получаю java.lang.security исключение? не могли бы вы помочь мне решить эту проблему ..
Чаран Пай

Ответы:


155

Вы должны добавить android:exported="true"файл манифеста в действие, которое вы пытаетесь запустить.

Из android: экспортированная документация :

android: exported
Может ли активность запускаться компонентами других приложений - «true», если это возможно, и «false», если нет. Если «false», активность может быть запущена только компонентами одного и того же приложения или приложений с одним и тем же идентификатором пользователя.

Значение по умолчанию зависит от того, содержит ли действие фильтры намерений. Отсутствие каких-либо фильтров означает, что действие можно вызвать, только указав его точное имя класса. Это означает, что действие предназначено только для внутреннего использования в приложении (поскольку другие не знают имя класса). Таким образом, в этом случае значение по умолчанию - «ложь». С другой стороны, наличие хотя бы одного фильтра означает, что действие предназначено для внешнего использования, поэтому значение по умолчанию - «истина».

Этот атрибут - не единственный способ ограничить доступ действия к другим приложениям. Вы также можете использовать разрешение, чтобы ограничить внешние объекты, которые могут вызывать действие (см. Атрибут разрешения).


2
Устраните половину проблемы для меня, если вы сначала попытаетесь установить приложение с экспортированной службой, а затем установить основное приложение, вам никогда не удастся удалить службу ... другой способ работает нормально ... Это потому, что требуемое разрешение отсутствует при установке основного приложения, но я не знаю, как решить эту проблему без удаления разрешений ...
Бибу 09

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 раза в манифесте с разными свойствами, например: <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> < / активность>. вы должны удалить
ненужный

1
Отличный ответ, Джомия. Но один вопрос, за один раз у меня есть только одна пусковая установка. И тот же код работает с eumlaotr, но на устройстве он показывает исключение безопасности. Не могли бы вы уточнить, пожалуйста.
Tofeeq Ahmad

Я думаю, вам нужно удалить приложение на устройстве и снова установить его. Тогда это сработает
Джомия

16

В вашем файле манифеста напишите это перед </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"> <uses-permission android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android: name = "android.permission.READ_CONTACTS" /> <uses-permission android: name = "android.permission.READ_SYNC_SETTINGS" /> <использует-разрешение android: name = "android.permission.READ_OWNER_DATA" /> <uses-permission android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP

<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" /> <application android: icon = "@ drawable / icon" android: label = "@ string / app_name" android: theme = "@ android: style / Theme.NoTitleBar "> <activity 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

В приведенных выше 3 комментариях я вставил свой файл манифеста приложения Notifier. Спасибо за ваш ответ.
Swathi EP


6

Я столкнулся с той же проблемой и не хотел добавлять фильтр намерений, как вы описали. После некоторого покопания я обнаружил xml-атрибут android: exported, который вы должны добавить в действие, которое вы хотите вызвать.

По умолчанию для него установлено значение 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 и более поздних версий kitkat.AndroidManifest.xml.

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

Кстати, на данный момент Gradle заботится об этом, а разработчики Android не указывают версию sdk в файле манифеста
kiedysktos

1
Есть ужасное решение. Никогда не целитесь вниз.
Джаред Берроуз

Это сработает, но есть большая вероятность, что это вызовет больше проблем, чем решит. Это мое мнение
Эврен Озтюрк

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.