20

Otrzymuję ten błąd, gdy próbuję odczytać kontakty z telefonu i włączyłem uprawnienie READ_CONTACTS w pliku manifestu. I dziwne jest to, że działało dobrze w Eclipse, ale kiedy skonwertowałem swój projekt na Gradle i uruchomiłem go w Android Studio Otrzymuję ten błąd.Odmowa zezwolenia: otwarcie dostawcy com.android.providers.contacts.ContactsProvider2 z ProcessRecord w Androidzie Studio

logcat mówi:

Odmowa zgody: dostawca otwór com.android.providers.contacts.ContactsProvider2 z ProcessRecord {302f069 29282: com.GP/u0a322} (PID = 29282, UID = 10322) wymaga androida .permission.READ_CONTACTS lub android.permission.WRITE_CONTACTS

oto kod Oczywisty:

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

Odpowiedz

37

Z powodu aktualizacji Marshmallow Żądanie uprawnień w czasie wykonywania uprawnienia do odczytu kontaktu nie działa. Przykładowy kod jest

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

Przykładowe screeny: enter image description here enter image description here

Mam następujący kod źródłowy z here

+0

Próbowałem to zrobić, ale mój wyjątek pozostaje taki sam. Działa na urządzeniu 4.4.2. Mam listę kontaktów, ale kiedy uruchomię aplikację na 6.0, to zawiesza się z tym samym wyjątkiem. @krishnan – Sid

1

Wystarczy dodać do swojej AndroidManifest.xml wewnątrz <manifest>:

<uses-permission android:name="android.permission.READ_CONTACTS"/> 
Powiązane problemy