web-dev-qa-db-fra.com

Refus de permission: ouvrir le fournisseur com.Android.providers.contacts.ContactsProvider2 à partir de ProcessRecord dans Android Studio

Je reçois cette erreur lorsque j'essaie de lire les contacts du téléphone et que j'ai inclus READ_CONTACTS permission dans le fichier manifeste. Et ce qui est étrange, c’est que cela fonctionnait bien dans Eclipse mais lorsque j’ai converti mon projet en Gradle et que je l’a exécuté dans Android Studio je suis obtenir cette erreur.

logcat dit:

Refus de permission: ouvrir le fournisseur com.Android.providers.contacts.ContactsProvider2 à partir de ProcessRecord {302f069 29282: com.GP/u0a322} (pid = 29282, uid = 10322) nécessite Android.permission.READ_CONTACTS ou Android.permission.WARTE_ACACAC

voici le code du manifeste:

<uses-sdk
        Android:minSdkVersion="14"
        Android:targetSdkVersion="19" />

    <!-- Read Contacts from phone -->
    <uses-permission Android:name="Android.permission.read_contacts" />
    <uses-permission Android:name="Android.permission.read_phone_state" />
    <uses-permission Android:name="Android.permission.GET_TASKS" />
    <uses-permission Android:name="Android.permission.READ_CALL_LOG" />
34
Navakanth

En raison de la mise à jour de Marshmallow, lors de la demande d'autorisations au moment de l'exécution, l'autorisation de contact en lecture ne fonctionne pas. Le code exemple est

import Android.Manifest;
import Android.content.ContentResolver;
import Android.content.pm.PackageManager;
import Android.database.Cursor;
import Android.os.Build;
import Android.provider.ContactsContract;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.util.Log;
import Android.widget.ArrayAdapter;
import Android.widget.ListView;
import Android.widget.Toast;

import Java.util.ArrayList;
import Java.util.List;

public class MainActivity extends AppCompatActivity {
    // The ListView
    private ListView lstNames;

    // Request code for READ_CONTACTS. It can be any number > 0.
    private static final int PERMISSIONS_REQUEST_READ_CONTACTS = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Find the list view
        this.lstNames = (ListView) findViewById(R.id.lstNames);

        // Read and show the contacts
        showContacts();
    }

    /**
     * Show the contacts in the ListView.
     */
    private void showContacts() {
        // Check the SDK version and whether the permission is already granted or not.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
            //After this point you wait for callback in onRequestPermissionsResult(int, String[], int[]) overriden method
        } else {
            // Android version is lesser than 6.0 or the permission is already granted.
            List<String> contacts = getContactNames();
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, Android.R.layout.simple_list_item_1, contacts);
            lstNames.setAdapter(adapter);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission is granted
                showContacts();
            } else {
                Toast.makeText(this, "Until you grant the permission, we canot display the names", Toast.LENGTH_SHORT).show();
            }
        }
    }

    /**
     * Read the name of all the contacts.
     *
     * @return a list of names.
     */
    private List<String> getContactNames() {
        List<String> contacts = new ArrayList<>();
        // Get the ContentResolver
        ContentResolver cr = getContentResolver();
        // Get the Cursor of all the contacts
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

        // Move the cursor to first. Also check whether the cursor is empty or not.
        if (cursor.moveToFirst()) {
            // Iterate through the cursor
            do {
                // Get the contacts name
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                contacts.add(name);
            } while (cursor.moveToNext());
        }
        // Close the curosor
        cursor.close();

        return contacts;
    }
}

Les exemples de captures d'écran: enter image description hereenter image description here

J'ai le code source suivant de ici

48
krishnan

Mon problème était que j'utilisais un émulateur Marshmallow et que des modifications ont été apportées à la manière dont nous demandons des autorisations à l'utilisateur. Par conséquent, il a continué à demander les autorisations même après les avoir ajoutées. http://developer.Android.com/training/permissions/requesting.html

5
strider

Le nouveau schéma d'autorisation au moment de l'exécution est utilisé uniquement si l'application targetSdkVersion (spécifiée dans le manifeste) est égale ou supérieure à 23. Donc, une façon d'éviter le problème est de rendre le targetSdkVersion inférieur à 23. Voir la description ici:

https://developer.Android.com/guide/topics/security/permissions.html#normal-dangerous

5
dazed

Google Play limite l'utilisation des autorisations à haut risque ou sensibles, y compris les groupes d'autorisations SMS ou Journal des appels). En bref, même si vous demandez une autorisation au moment de l'exécution, il y a de grandes chances que votre application ne pas être autorisé dans Google Play.

Vous pouvez cependant demander une exception. Google Play examinera la demande et accordera des exceptions au cas par cas. Les critères permettant une exception sont mentionnés ici .

0
Dieter27