2013-07-12 9 views
7

Ich möchte Kontakte über Contacts Picker wie folgt lesen:Lesen von Kontakten ohne Erlaubnis?

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); 
startActivityForResult(contact, CONTACT_PICK_CODE); 

Wenn ich das Ergebnis bekommen, das intent.getData() ein uri enthält den Kontakt zum Nachschlagen, aber ich brauche die Erlaubnis READ_CONTACTS, um es zu lesen.

Ich dachte, es könnte möglich sein, einen Kontakt ohne diese Erlaubnis zu erhalten, ähnlich der CALL Erlaubnis: Wenn ich direkt anrufen möchte, brauche ich es, aber ohne es kann ich eine Nummer an die Telefon-App senden, und der Benutzer muss auf den Anrufknopf klicken.
Gibt es eine ähnliche Funktionalität für READ_CONTACTS Ich bin mir nicht bewusst?

Antwort

8

Sie Kontakt ohne Berechtigungen abrufen können und ist so etwas wie Sie in der Frage sagen.

In Lebenslauf, erstellen Sie eine Absicht, einen Kontakt auszuwählen, geben Sie einen URI (und zeitlich Ihnen auch Berechtigungen zum Lesen), dann verwenden Sie den URI, abzufragen, um die Daten unter Verwendung Contact Provider API abzurufen. Sie können mehr darüber in Intents guide lesen.

Zum Beispiel (aus der Führung):

static final int REQUEST_SELECT_PHONE_NUMBER = 1; 

public void selectContact() { 
    // Start an activity for the user to pick a phone number from contacts 
    Intent intent = new Intent(Intent.ACTION_PICK); 
    intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); 
    if (intent.resolveActivity(getPackageManager()) != null) { 
     startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { 
     // Get the URI and query the content provider for the phone number 
     Uri contactUri = data.getData(); 
     String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; 
     Cursor cursor = getContentResolver().query(contactUri, projection, 
       null, null, null); 
     // If the cursor returned is valid, get the phone number 
     if (cursor != null && cursor.moveToFirst()) { 
      int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); 
      String number = cursor.getString(numberIndex); 
      // Do something with the phone number 
      ... 
     } 
    } 
} 
2

Ich hoffe, es gibt keine solche Funktionalität. Die Art, wie Sie den "Anruf ohne Berechtigungen" mit dem "Lesen von Kontakten ohne Berechtigungen" vergleichen, denke ich, dass der Benutzer die Kontaktdaten pro Hand eingeben muss.

Die Berechtigungen müssen per App angefordert werden, um die Privatsphäre des Benutzers zu schützen und Daten sammeln-Apps zu verhindern.

Wenn Ihre App die Kontaktliste benötigt, denke ich, dass Sie die Berechtigung hinzufügen können und der Benutzer versteht, warum Sie sie benötigen. Wenn Sie die Kontakte nicht benötigen, sollten Sie nicht versuchen, die Kontakte zu lesen.

Eine App sollte immer nur Funktionalität bieten, die wirklich benötigt wird und nicht mehr. Wenn ein Desktop-Programm Daten von dem, was Sie auf dem Computer tun, sammeln wird, welche Spiele Sie spielen, mit wem Sie versenden, usw. nennen Sie es einen Trojaner.

Also lesen Sie einfach die Kontakte, wenn es wirklich benötigt wird, und der Benutzer wird Ihnen die Berechtigungen dafür geben.

Die permission.system von android meist Sinn machen;)

+0

ich bis zu einem gewissen Grad zustimmen. Aber "Daten per Hand eingeben" ist ein schlechtes Beispiel für "Nummer an Dialer senden". Ich kann die tatsächliche Nummer senden, und der Benutzer muss sie nicht selbst eingeben. Wenn ich "Kontakte im Hintergrund abfragen" möchte, wie in einem AutoComplete EditText, ist die Berechtigung sinnvoll. Der Benutzer ist möglicherweise nicht bewusst, dass auf Kontakte zugegriffen wird. ABER Wenn ich dem Benutzer SEINE KONTAKT APP zeige und er eine auswählen muss, wie kann er nicht wissen, dass auf seine "Kontakte" zugegriffen wird? Es ist nur ein Vorteil für ihn, anstatt die Daten einzugeben, um einen aus den Kontakten –

+2

PLUS zu nehmen, dass die meisten Berechtigungen bei 'startActivityForResult' fehlschlagen. In ContactPicker kann der Benutzer seinen Kontakt auswählen, und ich bekomme eine Datenabsicht zurück, ohne die Erlaubnis zu benötigen. Unglückliche Daten enthalten nur ein Nachschlage-URI, das dann diese Berechtigung benötigt, wenn Sie es lesen wollen. –

+0

Wenn ich das richtig verstehe, möchten Sie, dass der Benutzer einen Kontakt auswählt, aber Sie müssen entweder alle seine Kontakte lesen und eine Liste erstellen, von der aus die Benutzer-Kontakt-App die Kontaktdaten des ausgewählten Kontakts an Ihren senden muss Absicht. Der zweite Weg kann unmöglich sein, abhängig von der Benutzerkontakt-App und der erste benötigt die Erlaubnis :) – DaKirsche