2015-08-23 12 views
6

Sono nuovo di Android e ho creato un'applicazione da zero utilizzando Android Studio e il modello LoginActivity. Ho scelto come target SDK 23 e la versione minimo è 15. Android Studio generato il seguente manifesto:Denial autorizzazione: fornitore di apertura com.android.providers.contacts.ContactsProvider2

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

    <!-- To auto-complete the email text field in the login form with the user's emails --> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.READ_PROFILE" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".LoginActivity" 
      android:label="@string/app_name" 
      android:windowSoftInputMode="adjustResize|stateVisible" > 
     </activity> 
    </application> 

</manifest> 

Quando provo a fare funzionare il modello vuoto, ottengo questo stack trace:

E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
    Process: com.uprope.uprope, PID: 24790 
    java.lang.RuntimeException: An error occurred while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:309) 
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
      at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{85980a6 24790:com.uprope.uprope/u0a58} (pid=24790, uid=10058) 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.acquireUnstableProvider(ContextImpl.java:2018) 
      at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1468) 
      at android.content.ContentResolver.query(ContentResolver.java:475) 
      at android.content.CursorLoader.loadInBackground(CursorLoader.java:64) 
      at android.content.CursorLoader.loadInBackground(CursorLoader.java:56) 
      at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) 
      at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) 
      at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:66) 
      at android.os.AsyncTask$2.call(AsyncTask.java:295) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
            at java.lang.Thread.run(Thread.java:818) 

Cosa sta causando questa eccezione?

+0

Quale versione di Android stai testando il tuo codice? – CommonsWare

+2

Se stai eseguendo il test sul dispositivo che esegue M, dovresti adottare un nuovo modo di richiedere il permesso. In tal caso, vedere questa risposta correlata, basta modificare le autorizzazioni. http://stackoverflow.com/questions/32151603/scan-results-available-action-return-empty-list-in-android-6-0/32151901#32151901 –

+0

Sto usando il dispositivo virtuale Nexus 5. Dice che sta usando l'API 23. – travis1097

risposta

-8

Api 23 ha alcuni miglioramenti di sicurezza (e significa alcuni bug per lo sviluppo). Sono sicuro che hai definito targetSdkVersion="23". Se si modifica a 22, sarà funziona bene, controllare

+1

Questa non è una soluzione! –

+0

È necessario gestire il modello di autorizzazione Marshmallow https://www.google.com/design/spec/patterns/permissions.html – DritanX

+0

true! Non l'ho verificato, grazie mille –

7

Se si sta testando su M Android è necessario chiedere all'utente il permesso di leggere i contatti in fase di esecuzione in questo modo:

private void accessContacts(){ 
    if (!mayRequestContacts()) { 
     return; 
    } 
    // This Build is < 6 , you can Access contacts here. 
} 

Chiedete per un permesso del genere:

private boolean mayRequestContacts() { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
     return true; 
    } 
    if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { 
     return true; 
    } 
    if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { 
     Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) 
       .setAction(android.R.string.ok, new View.OnClickListener() { 
        @Override 
        @TargetApi(Build.VERSION_CODES.M) 
        public void onClick(View v) { 
         requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
        } 
       }); 
    } else { 
     requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); 
    } 
    return false; 
} 

poi sovrascrivere onRequestPermissionsResult

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
             @NonNull int[] grantResults) { 
    if (requestCode == REQUEST_READ_CONTACTS) { 
     if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      // Permission granted , Access contacts here or do whatever you need. 
     } 
    } 
} 

Aggiungere questo ai vostri importazioni:

 import static android.Manifest.permission.READ_CONTACTS; 

e definire un intero come un ID per l'identità READ_CONTACTS richiesta di autorizzazione.

 private static final int REQUEST_READ_CONTACTS = 0; 

spero che questo ha aiutato.

+0

Cosa sono 'mEmailView' e' R.string.permission_rationale'? –