2015-08-23 7 views
6

Ich bin neu bei Android und habe mit Android Studio und der LoginActivity-Vorlage eine App von Grund auf neu erstellt. Ich bin Targeting SDK 23 und die min-Version ist 15. Android Studio generiert die folgende Manifest:Permission Denial: Eröffnungs-Provider 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> 

Wenn ich versuche, die leere Druckvorlage zu laufen, bekomme ich diese 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) 

Was verursacht diese Ausnahme?

+0

In welcher Version von Android testen Sie Ihren Code? – CommonsWare

+2

Wenn Sie auf einem Gerät testen, auf dem M ausgeführt wird, sollten Sie eine neue Art der Berechtigungserhebung verwenden. Wenn dies der Fall ist, lesen Sie die entsprechende Antwort. Ändern Sie einfach die Berechtigungen. http://stackoverflow.com/questions/32151603/scan-results-available-action-return-empty-list-in-android-6-0/32151901#32151901 –

+0

Ich benutze das virtuelle Gerät Nexus 5. Es sagt, dass es API 23 benutzt. – travis1097

Antwort

-8

Api 23 haben einige Sicherheitsverbesserungen (und es bedeutet einige Fehler für die Entwicklung). Ich bin sicher, dass Sie targetSdkVersion="23" definiert haben. Wenn Sie es auf 22 ändern, wird es funktioniert, überprüfen Sie es

+1

Dies ist keine Lösung! –

+0

Sie müssen mit dem Marshmallow-Berechtigungsmodell https://www.google.com/design/spec/patterns/permissions.html umgehen. – DritanX

+0

true! Ich habe das nicht überprüft, vielen Dank –

7

Wenn Sie auf Android M testen müssen Sie den Benutzer um Erlaubnis fragen Kontakte zur Laufzeit wie folgt zu lesen:

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

Sie fragen für eine Genehmigung wie folgt aus:

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

Dann außer Kraft setzen 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. 
     } 
    } 
} 

Fügen Sie diese auf Ihre Importe:

 import static android.Manifest.permission.READ_CONTACTS; 

und eine ganze Zahl definieren als eine Id Identität Berechtigungsanfrage READ_CONTACTS.

hoffe das half.

+0

Was sind 'mEmailView' und' R.string.permission_rationale'? –

Verwandte Themen