20

Viene visualizzato questo errore quando sto cercando di leggere i contatti dal telefono e ho incluso l'autorizzazione READ_CONTACTS nel file Manifest. E la cosa strana è che funzionava bene in Eclipse ma quando ho convertito il mio progetto in Gradle ed eseguito in Studio Android Mi sto facendo questo errore.Negazione permesso: provider di apertura com.android.providers.contacts.ContactsProvider2 da ProcessRecord in Android Studio

logcat dice:

Permesso Denial: fornitore di apertura com.android.providers.contacts.ContactsProvider2 da ProcessRecord {302f069 29282: com.GP/u0a322} (pid = 29282, uid = 10322) richiede Android .permission.READ_CONTACTS o android.permission.WRITE_CONTACTS

ecco il codice manifesto:

<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" /> 

risposta

5

il mio problema era che ero USI ng un emulatore Marshmallow e questo ha apportato alcune modifiche al modo in cui richiediamo le autorizzazioni all'utente. Quindi ha continuato a chiedere i permessi anche dopo averli aggiunti. http://developer.android.com/training/permissions/requesting.html

+0

Ho lo stesso problema, ho già specificato ma anche in quel momento continua a chiedere –

37

A causa dell'aggiornamento Marshmallow Richiesta di autorizzazioni in fase di esecuzione, l'autorizzazione di lettura non funziona. Il codice di esempio è

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; 
    } 
} 

Le schermate di esempio: enter image description here enter image description here

ho ottenuto il seguente codice sorgente da here

+0

Ho provato a farlo anche se la mia eccezione rimane la stessa. Funziona sul dispositivo 4.4.2 ho la lista dei contatti ma quando eseguo l'app su 6.0 si blocca con la stessa eccezione. @krishnan – Sid

1

Basta aggiungere questo al vostro AndroidManifest.xml all'interno <manifest>:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 
Problemi correlati