2011-03-08 13 views
9

Sto provando a leggere i nomi dei contatti, i numeri di telefono e le e-mail dall'ContactsContract URI e sto cercando di ottenere un SecurityException quando provo a eseguire il programma. Ho impostare l'autorizzazione nel file AndroidManifest.xml:java.lang.SecurityException che prova a leggere dai contatti Android URI

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="edu.smumn.cs394" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="8" /> 
    **<uses-permission android:name="android.pemission.READ_CONTACTS"/>** 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".ReadPhoneNumbers" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest>` 

seguito è riportato il codice dell'applicazione:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.contact_list);  
     ContentResolver resolver = getContentResolver(); 
     Cursor c = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
//[...] Work through data here` 

ottengo un'eccezione di sicurezza sull'ultima riga (resolver.query()):

`03-08 07:41:40.812: ERROR/AndroidRuntime(416): FATAL EXCEPTION: main 
03-08 07:41:40.812: ERROR/AndroidRuntime(416): java.lang.RuntimeException: Unable to start activity ComponentInfo{edu.smumn.cs394/edu.smumn.cs394.ReadPhoneNumbers}: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=416, uid=10037 requires android.permission.READ_CONTACTS 
[...] 
03-08 07:41:40.812: ERROR/AndroidRuntime(416): Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.contacts.ContactsProvider2 uri content://com.android.contacts/contacts from pid=416, uid=10037 requires android.permission.READ_CONTACTS 
[...] 
03-08 07:41:40.812: ERROR/AndroidRuntime(416):  at edu.smumn.cs394.ReadPhoneNumbers.onCreate(ReadPhoneNumbers.java:30) 

[...] `

Mi manca qualcosa, ma non posso gur fuori cosa.

+0

Si è verificato un errore di sintassi nel file AndroidManifest.xml. Nella riga ** ** android.permission è scritto erroneamente senza R e dovrebbe apparire come "permesso" invece di "pemission". – technik

risposta

9

Assicurati di aggiungere che al di fuori del tag dell'applicazione. Durante lo sviluppo per una piattaforma target di 2.3.3 che utilizza Eclipse su Ubuntu, ho avuto errori di autorizzazione nel file di log che indicavano che avevo bisogno di questa linea esatta mentre lavoravo su qualcosa di simile. Non è stato fino a quando ho spostato la * usa-autorizzazione ... READ_CONTACTS * linea al di fuori del tag dell'applicazione che le cose hanno funzionato.

+0

OMG .... Era quello ... Grazie! – cesards

+0

+1: questo è stato il mio caso anche per il sistema Windows 7 (con targeting da API v10 a v19). Ho aggiunto il permesso utilizzando la GUI e quello inserito nel tag . L'ho sostituito con il tag . – Dexter

6

Ciao Steven la traccia di registro di debug ti dice che hai bisogno di ... richiede android.permission.READ_CONTACTS

quindi basta provare qualcosa modificando il manifest.XML come l'aggiunta di un altro permesso, per non vedere se la sua non correttamente 'letti.

e verificare questa linea senza **

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

dan

5

con l'API 23, il permesso <uses-permission android:name="android.pemission.READ_CONTACTS"/> non lavoro, cambiare il livello di api nell'emulatore per api 22 (lecca-lecca) o inferiore

+3

Allora, qual è l'alternativa? – NicoJuicy

+5

Downgrade api non dovrebbe essere una soluzione !! – Shumin

+0

L'alternativa è di codificare un'autorizzazione di richiesta esplicita per API 23+ come mostrato nella documentazione, ho anche dovuto effettuare il downgrade della targetVersion del mio sdk a 22 per evitare di fare un lavoro tedioso – zozelfelfo

2

Se il dispositivo è in esecuzione Android 6.0 o superiore, e SDK bersaglio della tua app è 23 o superiore: l'app deve elencare le autorizzazioni nel manifest e deve richiedere ogni autorizzazione pericolosa di cui ha bisogno mentre l'app è in esecuzione. L'utente può concedere o negare ogni autorizzazione e l'app può continuare a funzionare con funzionalità limitate anche se l'utente rifiuta una richiesta di autorizzazione.

ESEMPIO:

//thisActivity is the running activity 


if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.READ_CONTACTS) 
       != PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
        Manifest.permission.READ_CONTACTS)) { 

       // Show an expanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 

      } else { 

       // No explanation needed, we can request the permission. 

       ActivityCompat.requestPermissions(thisActivity, 
         new String[]{Manifest.permission.READ_CONTACTS}, 
         MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

       // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
       // app-defined int constant. The callback method gets the 
       // result of the request. 
      } 
     } 

http://developer.android.com/training/permissions/requesting.html

15

Richiesta di autorizzazioni a tempo di esecuzione

A partire dal Android 6.0 (API di livello 23), gli utenti concedono autorizzazioni per le applicazioni, mentre l'applicazione è in esecuzione, non quando installano l'app.

Se l'autorizzazione che è necessario aggiungere non è elencata nelle normali autorizzazioni, è necessario occuparsi di "Autorizzazioni di runtime". Le autorizzazioni di runtime sono autorizzazioni richieste quando sono necessarie mentre l'app è in esecuzione.Tali autorizzazioni mostreranno una finestra di dialogo per l'utente, simile a quello seguente:

enter image description here

Il primo passo quando si aggiunge un "Permesso Runtime" è quello di aggiungerlo alla AndroidManifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.codepath.androidpermissionsdemo" > 

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

Successivamente, dovrai avviare la richiesta di autorizzazione e gestire il risultato. Il codice seguente mostra come eseguire questa operazione nel contesto di un'attività, ma ciò è possibile anche all'interno di un frammento.

// MainActivity.java 
public class MainActivity extends AppCompatActivity { 

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

     // In an actual app, you'd want to request a permission when the user performs an action 
     // that requires that permission. 
     getPermissionToReadUserContacts(); 
    } 

    // Identifier for the permission request 
    private static final int READ_CONTACTS_PERMISSIONS_REQUEST = 1; 

    // Called when the user is performing an action which requires the app to read the 
    // user's contacts 
    public void getPermissionToReadUserContacts() { 
     // 1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid 
     // checking the build version since Context.checkSelfPermission(...) is only available 
     // in Marshmallow 
     // 2) Always check for permission (even if permission has already been granted) 
     // since the user can revoke permissions at any time through Settings 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) 
       != PackageManager.PERMISSION_GRANTED) { 

      // The permission is NOT already granted. 
      // Check if the user has been asked about this permission already and denied 
      // it. If so, we want to give more explanation about why the permission is needed. 
      if (shouldShowRequestPermissionRationale(
        Manifest.permission.READ_CONTACTS)) { 
       // Show our own UI to explain to the user why we need to read the contacts 
       // before actually requesting the permission and showing the default UI 
      } 

      // Fire off an async request to actually get the permission 
      // This will show the standard permission request dialog UI 
      requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 
        READ_CONTACTS_PERMISSIONS_REQUEST); 
     } 
    } 

    // Callback with the request from calling requestPermissions(...) 
    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              @NonNull String permissions[], 
              @NonNull int[] grantResults) { 
     // Make sure it's our original READ_CONTACTS request 
     if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) { 
      if (grantResults.length == 1 && 
        grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Toast.makeText(this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Read Contacts permission denied", Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 
} 
Problemi correlati