Android联系人权限被拒绝,即使它是在Android清单上声明的

时间:2016-02-19 09:49:31

标签: android

也许你可以帮我找出导致问题的原因...... 我有一个简单的应用程序,用户点击按钮后添加新的联系人。

但我有一个错误:

Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{49af1fb 14363:com.example.gszczepanski.eduandroid/u0a59} (pid=14363, uid=10059) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
                                                                                         at android.os.Parcel.readException(Parcel.java:1599)
                                                                                         at android.os.Parcel.readException(Parcel.java:1552)
                                                                                         at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:3550)
                                                                                         at android.app.ActivityThread.acquireProvider(ActivityThread.java:4778)
                                                                                         at android.app.ContextImpl$ApplicationContentResolver.acquireProvider(ContextImpl.java:1999)
                                                                                         at android.content.ContentResolver.acquireProvider(ContentResolver.java:1421)
                                                                                         at android.content.ContentResolver.insert(ContentResolver.java:1225)
                                                                                         at com.example.gszczepanski.eduandroid.ContactDetailsActivity.addNewContact(ContactDetailsActivity.java:54)
                                                                                         at com.example.gszczepanski.eduandroid.ContactDetailsActivity.addContact(ContactDetailsActivity.java:24)
                                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                                         at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
                                                                                         at android.view.View.performClick(View.java:5198) 
                                                                                         at android.view.View$PerformClick.run(View.java:21147) 
                                                                                         at android.os.Handler.handleCallback(Handler.java:739) 
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                                         at android.os.Looper.loop(Looper.java:148) 
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

即使我在Android Manifest文件中声明了读写联系人权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gszczepanski.eduandroid">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ContactDetailsActivity"
            android:label="@string/title_activity_contact_details"
            android:theme="@style/AppTheme.NoActionBar"></activity>
    </application>

</manifest>

我想也许我在方法代码中声明了一些错误?这是:

private void addNewContact(UserContactData contactData){
        String name = contactData.getFirstName() + " " + contactData.getLastName();

        ContentValues values = new ContentValues();
        values.put(ContactsContract.Data.RAW_CONTACT_ID, 001);
        values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contactData.getPhoneNumber());
        values.put(ContactsContract.CommonDataKinds.Phone.LABEL, name);
        values.put(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, name);
        values.put(ContactsContract.CommonDataKinds.Phone.DATA1, contactData.getEmailAddress());

        getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
    }

我会感激任何帮助。

3 个答案:

答案 0 :(得分:2)

在MarshMallow之上,您必须执行如下运行时权限..

    String[] mPermission = {Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS};
    private static final int REQUEST_CONTACTS = 1;

    if (ActivityCompat.checkSelfPermission(this, mPermission[0])
                        != MockPackageManager.PERMISSION_GRANTED ||
                        ActivityCompat.checkSelfPermission(this, mPermission[1])
                                != MockPackageManager.PERMISSION_GRANTED ||
                     ) 
                    // Request missing contact permission.
// It will show a dialogue
     ActivityCompat.requestPermissions(this,
                            mPermission, REQUEST_CODE_LOCATION);


Handle the success code in onRequestPermissionResult:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        }

答案 1 :(得分:1)

对于Android 6.0或更高版本,您必须在运行时向用户询问某些权限(可以访问用户的私人数据)。

See this: Requesting Permissions at Run Time

答案 2 :(得分:0)

如果您正在针对api 23编译项目 - 您必须在运行时为Android 6.0设备请求该权限。请参阅docs