2012-11-27 38 views
5

Tôi đang cố gắng ngăn các ứng dụng liên kết với Dịch vụ nếu chúng không được ký bằng cùng một chứng chỉ như ứng dụng có chứa. Đối với điều này tôi đã tuyên bố một sự cho phép mới trong tệp kê khai (của ứng dụng có chứa Dịch vụ) bằng cách sử dụng một phần tử và thiết lập protectionLevel của quyền mới đối với Chữ ký như được hiển thị.Sự cố khi sử dụng android: protectionLevel = "signature"

<permission android:name="jp.co.abc.android.OMRSSettings.permission.Access" 
android:protectionLevel="signature"></permission> 

<uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/> 

Sau đó, trong khai báo kê khai cho Dịch vụ, tôi sử dụng thuộc tính android: permission để yêu cầu quyền mới này liên kết với Dịch vụ.

<service android:name="jp.co.xyz.bluetooth.profile.TIPServer" 
android:permission="jp.co.abc.android.OMRSSettings.permission.Access" > 
<intent-filter> 
<action android:name="jp.co.xyz.bluetooth.api.ICommonResultCallback" /> 
<action android:name="jp.co.xyz.bluetooth.api.ITimeServer" /> 
</intent-filter> 

Tôi cố truy cập dịch vụ này từ ứng dụng khác. Trong tệp kê khai của ứng dụng thứ hai này, tôi thêm <uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/> và cố gắng liên kết với dịch vụ của ứng dụng đầu tiên.

Nhưng tôi nhận được ngoại lệ sau.

01-02 00:06:54.531: INFO/PowerManagerService(425): Start Light.setBrightness(), [20], [3] 
01-02 00:06:56.473: INFO/PowerManagerService(425): Start Light.setBrightness(), [130], [3] 
01-02 00:06:58.055: WARN/dalvikvm(4956): threadid=1: thread exiting with uncaught exception (group=0x40b70390) 
01-02 00:06:58.055: WARN/ActivityManager(425): Permission Denial: Accessing service ComponentInfo{jp.co.abc.android.omrsettings/jp.co.xyz.bluetooth.profile.TIPServer} from pid=4956, uid=10158 requires jp.co.abc.android.OMRSSettings.permission.Access 
01-02 00:06:58.065: ERROR/AndroidRuntime(4956): FATAL EXCEPTION: main 
java.lang.SecurityException: Not allowed to bind to service Intent {  act=jp.co.xyz.bluetooth.api.ITimeServer } 
at android.app.ContextImpl.bindService(ContextImpl.java:1187) 
at android.content.ContextWrapper.bindService(ContextWrapper.java:370) 
at jp.co.abc.middleware.tip.LeTimeServerProfile.startTimeServer(LeTimeServerProfile.java:45) 
at jp.co.abc.tip.TimeActivity.onClick(TimeActivity.java:49) 
at android.view.View.performClick(View.java:3511) 
at android.view.View$PerformClick.run(View.java:14133) 
at android.os.Handler.handleCallback(Handler.java:605) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4507) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
at dalvik.system.NativeStart.main(Native Method) 
01-02 00:06:58.095: WARN/ActivityManager(425): Force finishing activity  jp.co.abc.tip/.TimeActivity 

Ai đó có thể xin vui lòng cho tôi biết tại sao tôi có vấn đề cho phép mặc dù tôi một cách chính xác tuyên bố <uses-permission android:name="jp.co.abc.android.OMRSSettings.permission.Access"/> trong biểu hiện của ứng dụng thứ hai của tôi.

Bất kỳ giúp đỡ được nhiều đánh giá cao.

EDIT

Modified để bao gồm các lenik chỉnh gợi ý trong câu trả lời của mình.

+0

bạn có thể liên kết với dịch vụ nếu bạn xóa 'android: protectionLevel =" signature "' khỏi tệp kê khai không? – lenik

+0

Nếu tôi xóa android: protectionLevel = "signature" từ tệp kê khai của ứng dụng đầu tiên, tôi có thể liên kết với dịch vụ từ ứng dụng thứ hai – user1400538

Trả lời

3

phép yêu cầu của bạn là:

<permission android:name="jp.co.abc.android.OMRSSettings.permission.Access" 

và đăng nhập của bạn nói:

requires jp.co.abc.android.OMRSettings.permission.Access 

bạn nên quyết định sử dụng "OMRS" hoặc "OMR" trong cả hai trường hợp, một "S" là thêm .

+1

bạn có thể downvote nếu cần. Tôi đã sửa đổi tên gói vì lý do bảo mật và ở đó tôi bỏ lỡ – user1400538

+0

@ user1400538 tôi không quan tâm đến việc bỏ phiếu, bạn có thể chỉnh sửa câu hỏi của mình để sửa lỗi chính tả không? – lenik

5

Ngoài giải pháp của lenik không làm rối tung tên quyền của bạn, với việc triển khai thực hiện, các vấn đề đặt hàng hiện tại của bạn. Trước tiên bạn phải cài đặt dịch vụ (trong đó <permission> được xác định), trước khi bạn cài đặt máy khách. Nếu không, khách hàng sẽ không nhận được sự cho phép, vì Android sẽ bỏ qua một <uses-permission> cho một sự cho phép mà nó không nhận ra. Nếu bạn đặt phần tử <permission> trong cả hai ứng dụng (có cùng giá trị), thứ tự cài đặt sẽ không còn quan trọng nữa.

+0

Trong kịch bản được giải thích trong câu hỏi của tôi, nếu dịch vụ (trong đó được xác định) là một phần của ứng dụng được xây dựng như một phần của ROM tùy chỉnh mà tôi có quyền truy cập và ứng dụng mà tôi cài đặt trong điện thoại như một ứng dụng Android bình thường, điều này sẽ cho phép vấn đề được đề cập ở trên? – user1400538

Các vấn đề liên quan