Android: java.lang.SecurityException: Permission Denial: start Intent

人盡茶涼 提交于 2019-11-26 05:48:37

问题


I have created an application containing GWVectraNotifier activity which is called from other applications to display Notification.

In the Notification dialog, there will be \'show\' button and \'close\' button.

Onclick of \'show\' button, the corresponding activity will be started.

To check the functionality of the above application,

I started the GWVectraNotifier activity from K9Mail application on checkmail event trigger.

I am able to start the GWVectraNotifier activity successfully, but onclick of \'show\' button i will have to start \'MessageList\' activity of K9mail.To do so, i wrote the below code:

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

which throws :

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)

Actually i am not able to understand what permissions to include in my Notifier application\'s manifest file to access MessageList of k9Mail. I am pasting below the permissions included in k9mail application\'s manifest file:

<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\"/>           

Can some one tell me which permission to include in my app? In the above permissions some are only for k9mail , because those are the permission classes written for k9. So, i will only be able to include the built-in permissions of android in the above given permissions. I tried by doing so as well, but it didn\'t solve my issue :(


回答1:


You have to add android:exported="true" in the manifest file in the activity you are trying to start.

From the android:exported documentation:

android:exported
Whether or not the activity can be launched by components of other applications — "true" if it can be, and "false" if not. If "false", the activity can be launched only by components of the same application or applications with the same user ID.

The default value depends on whether the activity contains intent filters. The absence of any filters means that the activity can be invoked only by specifying its exact class name. This implies that the activity is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the activity is intended for external use, so the default value is "true".

This attribute is not the only way to limit an activity's exposure to other applications. You can also use a permission to limit the external entities that can invoke the activity (see the permission attribute).




回答2:


The java.lang.SecurityException you are seeing is because you may enter two entries pointing to the same activity. Remove the second one and you should be good to go.

More Explanation

You may be declared the activity 2 times in the manifest with different properties, like :

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

and

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

You should remove the unwanted one from the manifest




回答3:


In your Manifest file write this before </application >

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

and tell me if it solves your issue :)




回答4:


I had this problem with this exact activity.

You can't start com.fsck.k9.activity.MessageList from an external activity.

I solved it with:

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

Using http://developer.android.com/reference/android/content/pm/PackageManager.html




回答5:


I was running into the same issue and wanted to avoid adding the intent filter as you described. After some digging, I found an xml attribute android:exported that you should add to the activity you would like to be called.

It is by default set to false if no intent filter added to your activity, but if you do have an intent filter it gets set to true.

here is the documentation http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl;dr: addandroid:exported="true" to your activity in your AndroidManifest.xml file and avoid adding the intent-filter :)




回答6:


Make sure that the component has the "exported" flag set to true. Also the component defining the permission should be installed before the component that uses it.




回答7:


It's easy maybe you have error in the configuration.

For Example: Manifest.xml

But in my configuration have for default Activity .Splash

you need check this configuration and the file Manifest.xml

Good Luck




回答8:


I solved this exception by changing the target sdk version from 19 onwards kitkat version AndroidManifest.xml.

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



回答9:


My problem was that I had this: Instead of this:



来源:https://stackoverflow.com/questions/4162447/android-java-lang-securityexception-permission-denial-start-intent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!