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


112

ฉันได้สร้างแอปพลิเคชันที่มีกิจกรรม GWVectraNotifier ซึ่งเรียกจากแอปพลิเคชันอื่นเพื่อแสดงการแจ้งเตือน

ในกล่องโต้ตอบการแจ้งเตือนจะมีปุ่ม 'แสดง' และปุ่ม 'ปิด'

เมื่อคลิกปุ่ม 'แสดง' กิจกรรมที่เกี่ยวข้องจะเริ่มขึ้น

ในการตรวจสอบการทำงานของแอปพลิเคชันข้างต้น

ฉันเริ่มกิจกรรม GWVectraNotifier จากแอปพลิเคชัน K9Mail บนทริกเกอร์เหตุการณ์เช็คเมล

ฉันสามารถเริ่มกิจกรรม 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 ใน 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: export = "true" แต่ฉันก็ยังได้รับ java.lang.security ข้อยกเว้น? คุณช่วยฉันแก้ปัญหานี้ได้ไหม ..
จรัญปาย

คำตอบ:


155

คุณต้องเพิ่มandroid:exported="true"ไฟล์รายการในกิจกรรมที่คุณพยายามเริ่มต้น

จากAndroid: เอกสารที่ส่งออก :

android: ส่งออก
กิจกรรมสามารถเปิดใช้งานโดยส่วนประกอบของแอปพลิเคชันอื่นได้หรือไม่ - "จริง" หากทำได้และ "เท็จ" หากไม่เป็นเช่นนั้น หากเป็น "เท็จ" กิจกรรมจะเปิดได้โดยส่วนประกอบของแอปพลิเคชันเดียวกันหรือแอปพลิเคชันเดียวกันที่มี ID ผู้ใช้เดียวกันเท่านั้น

ค่าเริ่มต้นขึ้นอยู่กับว่ากิจกรรมนั้นมีตัวกรองความตั้งใจหรือไม่ การไม่มีตัวกรองใด ๆ หมายความว่าสามารถเรียกใช้กิจกรรมได้โดยการระบุชื่อคลาสที่แน่นอนเท่านั้น หมายความว่ากิจกรรมนี้มีไว้สำหรับการใช้งานภายในแอปพลิเคชันเท่านั้น (เนื่องจากผู้อื่นจะไม่ทราบชื่อคลาส) ดังนั้นในกรณีนี้ค่าเริ่มต้นคือ "เท็จ" ในทางกลับกันการมีตัวกรองอย่างน้อยหนึ่งตัวบ่งชี้ว่ากิจกรรมนั้นมีไว้สำหรับการใช้งานภายนอกดังนั้นค่าเริ่มต้นจึงเป็น "จริง"

แอตทริบิวต์นี้ไม่ได้เป็นเพียงวิธีเดียวในการ จำกัด การเปิดเผยกิจกรรมกับแอปพลิเคชันอื่น ๆ คุณยังสามารถใช้สิทธิ์เพื่อ จำกัด เอนทิตีภายนอกที่สามารถเรียกใช้กิจกรรมได้ (ดูแอตทริบิวต์การอนุญาต)


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>

คุณควรลบสิ่งที่ไม่ต้องการออกจากไฟล์ Manifest


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 "/> <หมวดหมู่ android: name =" android.intent.category.LAUNCHER "/> </intent-filter> < / activity>. คุณควรลบรายการที่ไม่ต้องการออกจากรายการ
Jomia

1
คำตอบที่ดี jomia แต่มีคำถามหนึ่งข้อในแต่ละครั้งฉันมีกิจกรรมตัวเรียกใช้งานเพียงรายการเดียวและรหัสเดียวกันทำงานกับ eumlaotr แต่ในอุปกรณ์แสดงข้อยกเว้นด้านความปลอดภัยคุณช่วยอธิบายให้ละเอียดได้ไหม
Tofeeq Ahmad

ฉันคิดว่าคุณต้องถอนการติดตั้งแอปในอุปกรณ์แล้วติดตั้งใหม่อีกครั้ง จากนั้นจะทำงาน
Jomia

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 = "@ 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" /> <หมวดหมู่ 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


6

ฉันประสบปัญหาเดียวกันและต้องการหลีกเลี่ยงการเพิ่มตัวกรองความตั้งใจตามที่คุณอธิบายไว้ หลังจากการขุดฉันพบแอตทริบิวต์ xml android: ส่งออกซึ่งคุณควรเพิ่มในกิจกรรมที่คุณต้องการให้เรียก

โดยค่าเริ่มต้นจะตั้งค่าเป็นเท็จหากไม่มีการเพิ่มตัวกรองความตั้งใจในกิจกรรมของคุณ แต่ถ้าคุณมีตัวกรองความตั้งใจระบบจะตั้งค่าเป็นจริง

นี่คือเอกสาร http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: เพิ่มandroid:exported="true"ในกิจกรรมของคุณในไฟล์ AndroidManifest.xml และหลีกเลี่ยงการเพิ่มตัวกรองความตั้งใจ :)


1

ตรวจสอบให้แน่ใจว่าคอมโพเนนต์มีการตั้งค่าสถานะ "ส่งออก" เป็นจริง นอกจากนี้ควรติดตั้งส่วนประกอบที่กำหนดสิทธิ์ก่อนส่วนประกอบที่ใช้


นอกจากนี้คุณต้องตรวจสอบให้แน่ใจว่าคุณมีแอพในพาร์ติชันระบบ / 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 ในไฟล์ manifest
kiedysktos

1
มีทางออกที่น่ากลัว อย่ากำหนดเป้าหมายลง
Jared Burrows

วิธีนี้จะได้ผล แต่มีโอกาสสูงที่จะทำให้เกิดปัญหามากกว่าที่จะแก้ไขได้ นั่นคือความคิดเห็นของฉัน
Evren Ozturk

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.