2013-07-12 98 views
7

我想通過Contacts Picker這樣讀取聯繫人:未經許可請閱讀聯繫人?

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

如果我得到的結果是,intent.getData()包含uri來查找聯繫人,但我需要許可READ_CONTACTS來閱讀。

我認爲有可能在沒有此權限的情況下接收聯繫人,類似於CALL權限:如果我想直接撥打電話,我需要它,但是如果沒有它,我可以向電話應用發送號碼,用戶必須點擊通話按鈕。
READ_CONTACTS有沒有類似的功能我不知道?

回答

8

可以檢索沒有權限的聯繫方式,是像你的問題告訴我們。

在簡歷中,您創建了一個選擇聯繫人的意圖,這會爲您提供一個URI(並且暫時也授予您讀取權限),然後使用URI進行查詢以使用Contact Provider API來檢索數據。

你可以在Intents guide瞭解更多關於它的信息。

例如(從引導):

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

我希望沒有這樣的功能。 您將比較「沒有權限的呼叫」和「沒有權限的閱讀聯繫人」的方式是我認爲用戶必須每手輸入聯繫人數據。

權限必須由應用程序請求以保護用戶的隱私並有助於防止數據收集應用程序。

如果您的應用程序需要聯繫人列表,我認爲您可以添加權限,並且用戶會理解您爲什麼需要它。如果你不需要這些聯繫人,你不應該嘗試閱讀聯繫人。

應用程序總是應該只提供真正需要的功能,僅此而已。 如果一個桌面程序將收集你在計算機上做什麼的數據,你正在玩什麼遊戲,你正在郵寄什麼等,你會稱它爲木馬。

所以,只要讀取聯繫人,如果它真的需要,然後用戶會給你的權限。

的機器人大多是有意義的permission.system;)

+0

我同意到一定程度。但是「手動輸入接收數據」是「發送號碼到撥號程序」的一個壞例子。我可以發送實際的號碼,用戶不必自己輸入。如果我想「在後臺查詢聯繫人」就像在自動完成的EditText中一樣,權限是完全有意義的。用戶可能不知道聯繫人被訪問。但是,如果我向用戶顯示他的聯繫應用程序,並且他必須選擇一個,他怎麼會不知道他的「聯繫人」正在訪問?這對他來說只是一個方便,而不是輸入數據,從Contacts –

+2

PLUS中可以看出,大多數權限在'startActivityForResult'失敗。在ContactPicker中,用戶可以選擇他的聯繫人,並獲得數據意圖返回,而不需要權限。不幸的數據只包含一個查找uri,然後需要這個權限如果你想閱讀它。 –

+0

如果我的理解是正確的,你希望用戶選擇一個聯繫人,但因此您必須閱讀他的所有聯繫人,並創建一個列表來chhose或用戶接觸應用必須從選擇一個聯繫人數據發送到您的意圖。根據用戶接觸應用第二種方式是不可能的,第一個需要的權限:) – DaKirsche