Android: java.lang.SecurityException: отказ в разрешении: начало намерения - PullRequest
109 голосов
/ 12 ноября 2010

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

Ответы [ 9 ]

155 голосов
/ 09 января 2012

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

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

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

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

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

101 голосов
/ 16 мая 2011

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>

Вы должны удалить ненужный из манифеста

15 голосов
/ 12 ноября 2010

В своем файле манифеста напишите это до </application >

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

и скажите мне, если это решит вашу проблему:)

7 голосов
/ 08 мая 2012

У меня была эта проблема с этим конкретным действием.

Вы не можете запустить 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 голосов
/ 05 ноября 2011

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

По умолчанию установлено значение false, если фильтр намерений не добавленк вашей деятельности, но если у вас есть фильтр намерений, он устанавливается на true.

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

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

1 голос
/ 18 марта 2016

Легко, может быть, у вас ошибка в конфигурации.

Например: Manifest.xml

enter image description here

Но в моей конфигурации есть по умолчанию Activity. Splash

enter image description here

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

Удачи

1 голос
/ 21 октября 2014

Я решил это исключение, изменив версию target sdk с 19-й версии KitKat AndroidManifest.xml.

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
1 голос
/ 25 июля 2014

Убедитесь, что для компонента установлен флаг «экспорт» со значением true.Также компонент, определяющий разрешение, должен быть установлен перед компонентом, который его использует.

0 голосов
/ 12 апреля 2016

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

...