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


112

Tôi đã tạo một ứng dụng chứa hoạt động GWVectraNotifier được gọi từ các ứng dụng khác để hiển thị Thông báo.

Trong hộp thoại Thông báo, sẽ có nút "hiển thị" và nút "đóng".

Nhấp vào nút 'hiển thị', hoạt động tương ứng sẽ được bắt đầu.

Để kiểm tra chức năng của ứng dụng trên,

Tôi đã bắt đầu hoạt động GWVectraNotifier từ ứng dụng K9Mail trên trình kích hoạt sự kiện checkmail.

Tôi có thể bắt đầu hoạt động GWVectraNotifier thành công, nhưng khi nhấp vào nút 'hiển thị', tôi sẽ phải bắt đầu hoạt động 'MessageList' của K9mail. Để làm như vậy, tôi đã viết đoạn mã dưới đây:

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

mà ném:

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)

Trên thực tế, tôi không thể hiểu những quyền nào để bao gồm trong tệp kê khai của ứng dụng Trình thông báo của tôi để truy cập MessageList của k9Mail. Tôi đang dán bên dưới các quyền có trong tệp kê khai của ứng dụng 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"/>           

Ai đó có thể cho tôi biết quyền nào để đưa vào ứng dụng của tôi không? Trong các quyền trên, một số quyền chỉ dành cho k9mail, vì đó là các lớp quyền được viết cho k9. Vì vậy, tôi sẽ chỉ có thể bao gồm các quyền tích hợp của android trong các quyền đã cho ở trên. Tôi cũng đã thử làm như vậy, nhưng nó không giải quyết được vấn đề của tôi :(


Tôi đã giải quyết vấn đề này bằng cách thêm bộ lọc ý định sau vào tệp kê khai bên dưới thẻ Hoạt động MessageList trong AndroidManifest.xml: <intent-filter> <action android: name = "android.intent.action.MAIN" /> </ Ý-lọc >
Swathi EP

tôi đã thêm cả <intent-filter> <action android: name = "android.intent.action.MAIN" /> </intent-filter> và android: export = "true" nhưng tôi vẫn nhận được java.lang.security ngoại lệ ? bạn có thể xin vui lòng giúp đỡ tôi để giải quyết việc này ..
Charan Pai

Câu trả lời:


155

Bạn phải thêm android:exported="true"vào tệp kê khai trong hoạt động bạn đang cố gắng bắt đầu.

Từ tài liệu android: đã xuất :

android: đã xuất
Cho dù các thành phần của các ứng dụng khác có thể khởi chạy hoạt động hay không - "true" nếu có thể được và "false" nếu không. Nếu "false", hoạt động chỉ có thể được khởi chạy bởi các thành phần của cùng một ứng dụng hoặc các ứng dụng có cùng ID người dùng.

Giá trị mặc định phụ thuộc vào việc hoạt động có chứa bộ lọc ý định hay không. Sự vắng mặt của bất kỳ bộ lọc nào có nghĩa là hoạt động chỉ có thể được gọi bằng cách chỉ định tên lớp chính xác của nó. Điều này ngụ ý rằng hoạt động chỉ nhằm mục đích sử dụng nội bộ ứng dụng (vì những người khác sẽ không biết tên lớp). Vì vậy, trong trường hợp này, giá trị mặc định là "false". Mặt khác, sự hiện diện của ít nhất một bộ lọc ngụ ý rằng hoạt động được dành cho mục đích sử dụng bên ngoài, vì vậy giá trị mặc định là "true".

Thuộc tính này không phải là cách duy nhất để hạn chế hoạt động tiếp xúc với các ứng dụng khác. Bạn cũng có thể sử dụng một quyền để giới hạn các thực thể bên ngoài có thể gọi hoạt động (xem thuộc tính quyền).


2
Khắc phục một nửa vấn đề cho tôi, nếu bạn cố gắng cài đặt ứng dụng với dịch vụ đã xuất trước, sau đó mới cài đặt ứng dụng chính, bạn sẽ không bao giờ thành công để gỡ bỏ dịch vụ ... cách khác vẫn hoạt động tốt ... Điều này là do phép yêu cầu là không có mặt khi cài đặt ứng dụng chính, nhưng tôi không biết làm thế nào để giải quyết nó mà không cần loại bỏ quyền ...
Bibu

102

Các java.lang.SecurityExceptionbạn đang nhìn thấy là bởi vì bạn có thể nhập hai mục trỏ đến cùng một hoạt động. Loại bỏ cái thứ hai và bạn sẽ tốt để đi.

Giải thích thêm

Bạn có thể được khai báo hoạt động 2 lần trong tệp kê khai với các thuộc tính khác nhau, như:

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

Bạn nên xóa cái không mong muốn khỏi tệp kê khai


2
bạn có thể được khai báo hoạt động 2 lần trong tệp kê khai với các thuộc tính khác nhau, như: <activity android: name = ". myclass"> </activity> và <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> < / hoạt động>. bạn nên loại bỏ một trong những mong muốn từ manifest
Jomia

1
Câu trả lời tuyệt vời jomia Nhưng có một câu hỏi, tại thời điểm tôi chỉ có một hoạt động launcher, cùng một đoạn mã chạy với eumlaotr nhưng trên thiết bị nó hiển thị ngoại lệ bảo mật. Bạn có thể giải thích thêm.
Tofeeq Ahmad

Tôi nghĩ bạn phải gỡ cài đặt ứng dụng trong thiết bị và cài đặt lại. Sau đó, nó sẽ hoạt động
Jomia

16

Trong tệp kê khai của bạn, hãy viết điều này trước </application >

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

và cho tôi biết nếu nó giải quyết được vấn đề của bạn :)


tốt bằng cách xem các nhật ký, tôi khá chắc chắn rằng nó sẽ hữu ích. Thực hiện một việc dán tệp kê khai hoàn chỉnh của bạn tại đây
Muhammad Shahab

<kê khai xmlns: android = " schemas.android.com/apk/res/android " package = "com.i10n.notifier" android: versionCode = "1" android: versionName = "1.0"> <use-allow android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> <quyền sử dụng android: name = "android.permission.READ_CONTACTS" /> <quyền sử dụng android: name = "android.permission.READ_SYNC_SETTINGS" /> <quyền sử dụng android: name = "android.permission.READ_OWNER_DATA" /> <use-allow android: name = "android.permission.ACCESS_NETWORK_STATE" />
Swathi EP vào

<use-allow android: name = "android.permission.INTERNET" /> <use-allow android: name = "android.permission.VIBRATE" /> <use-allow android: name = "android.permission.WAKE_LOCK" / > <use-allow 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

Trong 3 nhận xét ở trên, tôi đã dán tệp kê khai ứng dụng Trình thông báo của mình. Cảm ơn vì đã trả lời.
Swathi EP


6

Tôi đã gặp phải vấn đề tương tự và muốn tránh thêm bộ lọc ý định như bạn đã mô tả. Sau khi tìm hiểu kỹ, tôi đã tìm thấy một thuộc tính xml android: đã xuất mà bạn nên thêm vào hoạt động mà bạn muốn được gọi.

Theo mặc định, nó được đặt thành false nếu không có bộ lọc ý định nào được thêm vào hoạt động của bạn, nhưng nếu bạn có bộ lọc ý định, nó sẽ được đặt thành true.

đây là tài liệu http://developer.android.com/guide/topics/manifest/activity-element.html#exported

tl; dr: thêm android:exported="true"vào hoạt động của bạn trong tệp AndroidManifest.xml và tránh thêm bộ lọc ý định :)


1

Đảm bảo rằng thành phần có cờ "xuất" được đặt thành true. Ngoài ra, thành phần xác định quyền nên được cài đặt trước thành phần sử dụng nó.


Ngoài ra, bạn phải đảm bảo rằng bạn có ứng dụng của mình trong phân vùng hệ thống / ứng dụng riêng để tận hưởng sự sang trọng ở cấp độ Hệ thống. Đây là yêu cầu trong KitKat trở đi các thiết bị
Naren

1

Thật dễ dàng có thể bạn có lỗi trong cấu hình.

Ví dụ: Manifest.xml

nhập mô tả hình ảnh ở đây

Nhưng trong cấu hình của tôi có Activity mặc định .Splash

nhập mô tả hình ảnh ở đây

bạn cần kiểm tra cấu hình này và tệp Manifest.xml

Chúc may mắn


1

Tôi đã giải quyết ngoại lệ này bằng cách thay đổi target sdkphiên bản từ 19 trở đi phiên bản kitkatAndroidManifest.xml.

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

BTW, hiện tại Gradle lo việc này và các nhà phát triển Android không chỉ định phiên bản sdk trong tệp kê khai
kiedysktos

1
Có một giải pháp khủng khiếp. Không bao giờ nhắm mục tiêu xuống dưới.
Jared Burrows

Điều này sẽ hiệu quả nhưng có khả năng cao nó sẽ gây ra nhiều vấn đề hơn là nó đã giải quyết. Đó là ý kiến ​​của tôi
Evren Ozturk

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.