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 в указанные выше разрешения. Я тоже попробовал, но это не решило мою проблему :(

Swathi EP
источник
Я решил эту проблему, добавив следующий фильтр намерений в файл манифеста под тегом 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
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

user1305537
источник
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. Также компонент, определяющий разрешение, должен быть установлен перед компонентом, который его использует.

Naren
источник
Также вы должны убедиться, что у вас есть приложение в разделе 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
Есть ужасное решение. Никогда не целитесь вниз.
Джаред Берроуз
Это сработает, но есть большая вероятность, что это вызовет больше проблем, чем решит. Это мое мнение
Эврен Озтюрк
0

Моя проблема заключалась в том, что у меня было это: неправильно Вместо этого: верный

Уриэль Франкель
источник