2013-02-10 9 views
5

Trong một ứng dụng, tôi đã cung cấp nội dung sau đây khai báo trong AndroidManifest tôi:Yêu cầu sự cho phép đọc từ ContentProvider của riêng tôi trong ứng dụng khác

<provider android:name="com.example.MyProvider" 
       android:label="@string/provider_name" 
       android:authorities="com.example" 
       android:readPermission="com.example.permission.READ" 
    /> 

Và một phép yêu cầu ứng dụng để sử dụng nó:

<uses-permission android:name="com.example.permission.READ" /> 

Nhưng khi chạy mã này:

ContentResolver resolver = this.context.getContentResolver(); 
    Cursor results = resolver.query(BaseballCardContract.CONTENT_URI, BaseballCardContract.PROJECTION, null, null, null); 

Tôi nhận được thông báo lỗi sau:

E/DatabaseUtils (1009): java.lang.SecurityException: Permission từ chối: đọc bbct.android.common.BaseballCardProvider nội dung uri: //bbct.android.baseballcard/baseball_cards từ pid = 996, uid = 10046 yêu cầu com.example.permission.READ hoặc cấpUriPermission()

Từ những gì tôi có thể nói, tôi yêu cầu sự cho phép cần thiết. Tôi đang thiếu gì ở đây? Tôi cần xem xét điều gì khác?

Trả lời

9

Trong ứng dụng xác định Trình cung cấp nội dung của bạn, bạn cũng đã xác định quyền bạn đang yêu cầu/yêu cầu (trong ứng dụng khác của bạn) chưa? Như vậy (trong thẻ gốc <manifest/>):

<permission android:name="com.example.permission.READ" /> 

Nói chung, bạn cần phải:

  1. xác định sự cho phép trong một file manifest của ứng dụng
  2. yêu cầu sự cho phép trong bất kỳ tệp kê khai của ứng dụng của bạn, cho các ứng dụng muốn nhận được sự cho phép
  3. yêu cầu sự cho phép này trong bất kỳ thành phần nào bạn muốn bảo vệ với quyền này, như Hoạt động, Dịch vụ hoặc Trình cung cấp nội dung (đọc, viết, cả hai, URI phụ cụ thể , v.v.)

Chỉnh sửa: do đó, chỉ để rõ ràng 100%, KHÔNG đủ để "ngầm định" xác định quyền bằng cách yêu cầu nó trong, ví dụ như ContentProvider của bạn. Bạn phải xác định rõ ràng trong tệp kê khai của ứng dụng (trong thẻ <manifest/>).

+1

Cảm ơn bạn đã đăng câu trả lời cho câu hỏi dài bị lãng quên của tôi. Đây là giải pháp mà tôi đã tìm thấy trước đây, vì vậy tôi rất vui khi bạn dành thời gian để thêm nó vào đây. Tôi hy vọng nó sẽ hữu ích cho người dùng trong tương lai. Ngoài ra, tôi cũng đã thêm thuộc tính 'android: protectionLevel =" signature "' vào thẻ '' để chỉ các ứng dụng của riêng tôi mới có thể được cấp quyền. –

+0

Tôi luôn nghĩ rằng mức "chữ ký" này là mặc định khi nó được cấp cho người dùng xác định quyền, nhưng tôi nhanh chóng đọc tài liệu và không thể tìm thấy bất kỳ thông tin rõ ràng nào về chủ đề đó. Dù sao, có vẻ như không có hại trong việc đưa nó vào định nghĩa của bạn, chỉ để chắc chắn. Cảm ơn vì bình luận đó! – baske

+1

FYI bài đăng trên blog này dẫn đến câu trả lời này: https://commonsware.com/blog/2018/02/06/vet-your-manifest.html –