2011-11-12 6 views
14

Tôi đang làm việc trên một ứng dụng đơn giản duyệt qua các liên hệ của người dùng. Đáng tiếc là tôi tiếp tục nhận được lỗi sau:permission.READ_CONTACTS dường như không hoạt động

java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.HtcContactsProvider2 uri content://com.android.contacts/contacts from pid=27455, uid=10171 requires android.permission.READ_CONTACTS 

file manifest của tôi trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.helloMaps" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <application android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:debuggable="true"> 
     <uses-library android:name="com.google.android.maps" /> 
     <activity android:name=".MapsActivity" 
        android:label="@string/app_name" 
        android:theme="@android:style/Theme.NoTitleBar">    
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

     </activity> 
    </application> 
</manifest> 

Tôi đang cố gắng để nhìn vào địa chỉ liên lạc của tôi bằng cách:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 

Tôi đã đã cố gắng thêm <uses-permission android:name="android.permission.READ_CONTACTS" /> hoặc android:permission="android.permission.READ_CONTACTS" vào <application> hoặc <activity>, nhưng cả hai đều không hoạt động.

Tôi sắp hết các tùy chọn, có ai biết tôi đang thiếu gì ở đây không?

+1

kiểm tra nếu bạn cho phép sự cho phép trên thiết lập điện thoại Android của bạn !! – Steve

Trả lời

12

<uses-permission> phải được chứa trong phần tử <manifest>. Xem Structure of the Manifest File. Vì vậy, hãy thử đưa nó vào <application> hoặc <activity>, sẽ không hoạt động. Tuyệt vọng di chuyển: cố gắng để di chuyển <uses-sdk> trước <application>

<uses-sdk android:minSdkVersion="8" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 

Ngoài ra nếu bạn có thể kiểm tra mà không có sự cho phép khác, loại bỏ chúng.

EDIT: Bạn có thể xin vui lòng kiểm tra xem đây là dòng TOP của bạn trong file manifest của bạn:

<?xml version="1.0" encoding="utf-8"?> 
+0

cảm ơn bạn đã trả lời, trước tiên tôi đã chuyển '' lên tất cả, điều đó không giúp được gì. Tiếp theo, tôi đã xóa tất cả các quyền trừ READ_CONTACTS, rất tiếc là không hoạt động hoặc – Danielvd

+0

Xin chào, tôi đã chỉnh sửa câu trả lời của mình. Tôi không chắc liệu bạn đã đăng tất cả tệp kê khai hay chỉ một phần. Trong bất kỳ trường hợp nào, khai báo quyền đều đúng. Bạn có thể thử chạy "xác thực" trên tệp kê khai của mình không? – hovanessyan

+0

xấu của tôi, tôi cố ý để gửi toàn bộ biểu hiện của tôi, dường như tôi quên dòng đầu tiên. Tôi đã chỉnh sửa câu hỏi của mình và thêm dòng đầu tiên. – Danielvd

0

Tôi chạy vào vấn đề này ngày hôm nay và không ai trong số các bản sửa lỗi nói trên làm việc cho tôi.

Vấn đề cuối cùng phải làm gì với Eclipse của tôi. Những gì tôi đã viết trong manifest.xml và những gì đã ở trong tab Permissions không giống nhau. Tôi đã có sự cho phép READ_CONTACTS trong số manifest.xml của mình, nhưng READ_PROFILE nằm trong quyền của tôi dưới tab của sự cho phép của tôi.

Tôi biết đây là một chủ đề cũ, nhưng hy vọng nếu ai đó có cùng một vấn đề tôi đã làm họ sẽ vấp ngã trên này.

Cảm ơn!

3

Tôi đã gặp vấn đề tương tự và không có giải pháp nào tôi đọc đã giúp giải quyết nó cho đến khi tôi thêm quyền cho phép WRITE_EXTERNAL_STORAGE cùng với sự cho phép READ_CONTACTS.

<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

Bất kỳ ý tưởng nào tại sao bạn cần điều đó? – AdamMc331

6

tôi đã hoàn toàn bị mắc kẹt về vấn đề này cho đến khi tôi đọc this article về cách điều khoản được xử lý bắt đầu với SDK 23. Các gợi ý quan trọng:

If the application's targetSdkVersion is set to less than 23. It will be assumed that application is not tested with new permission system yet and will switch to the same old behavior: user has to accept every single permission at install time and they will be all granted once installed !

tôi mở ra tập tin gradle.build của tôi và thay đổi targetSdkVersion 23-targetSdkVersion 22, và bây giờ mọi thứ hoạt động tuyệt vời! Cuối cùng tôi sẽ tìm thời gian để xây dựng trong hệ thống quyền mới và chuyển về targetSdkVersion 23, đây có lẽ là câu trả lời đúng hơn. Đây là lối tắt tạm thời.

+1

Điều này là dành cho tôi, cảm ơn! (Thông báo lỗi trong trường hợp ngoại lệ được ném bởi Android không phải là rất hữu ích.) Chúng tôi đã chọn triển khai đúng các yêu cầu thời gian chạy và cho [tài liệu chính thức] (https://developer.android.com/training/permissions/requesting. html) cuối cùng là tài nguyên hữu ích nhất. – Jonik

3

Hãy thử điều này trong ngày của bạn tạo ra phương pháp

ActivityCompat.requestPermissions (this, new String [] {Manifest.permission.READ_CONTACTS}, 1);

1

Không có mục nào ở trên hữu ích. Giải pháp khá đơn giản. bạn sẽ cần một yêu cầu cấp phép thời gian chạy.

có hoặc không đặt sự cho phép trong tệp kê khai của bạn, Bạn sẽ cần phải yêu cầu sự cho phép đó từ Người dùng khi đang di chuyển. if(getApplicationContext().checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS}, resultValue);

chỉ sau đó sau khi có sự chấp thuận, bạn sẽ có thể truy vấn địa chỉ liên lạc số điện thoại/tên, vv