2013-07-12 37 views
7

Tôi muốn đọc Liên hệ qua Contacts Picker như thế này:Đọc Danh bạ mà không có quyền?

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

Nếu tôi nhận được kết quả, các intent.getData() chứa một uri để tra cứu các liên hệ, nhưng tôi cần sự cho phép READ_CONTACTS để đọc nó.

Tôi nghĩ có thể nhận được một Liên hệ mà không có sự cho phép này, tương tự như sự cho phép của CALL: Nếu tôi muốn thực hiện cuộc gọi trực tiếp, tôi cần nó, nhưng không có nó, tôi có thể gửi số điện thoại đến điện thoại, và người dùng phải nhấp vào nút gọi.
Có chức năng tương tự cho READ_CONTACTS Tôi không biết?

Trả lời

8

Bạn có thể lấy thông tin Liên hệ mà không cần sự cho phép và là một cái gì đó như bạn nói trong câu hỏi. Trong sơ yếu lý lịch, bạn tạo ý định chọn một liên hệ, điều này cung cấp cho bạn một URI (và tạm thời, cũng cấp cho bạn quyền đọc), sau đó bạn sử dụng URI để truy vấn để truy xuất dữ liệu bằng cách sử dụng Contact Provider API.

Bạn có thể đọc thêm về nó trong Intents guide.

Ví dụ (từ hướng dẫn):

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

Tôi hy vọng không có chức năng như vậy. Cách bạn so sánh "cuộc gọi không có quyền" với "đọc địa chỉ liên hệ không có quyền" sẽ là tôi nghĩ rằng người dùng phải nhập contactdata mỗi tay.

Quyền phải được ứng dụng yêu cầu để bảo vệ quyền riêng tư của người dùng và giúp ngăn chặn các ứng dụng thu thập dữ liệu.

Nếu ứng dụng của bạn cần danh sách liên hệ, tôi nghĩ bạn có thể thêm quyền và người dùng sẽ hiểu lý do bạn cần. Nếu bạn không cần địa chỉ liên lạc, bạn không nên thử đọc địa chỉ liên lạc.

Ứng dụng luôn chỉ nên cung cấp chức năng thực sự cần thiết và không có gì khác. Nếu một chương trình máy tính để bàn sẽ thu thập dữ liệu về những gì bạn đang làm trên máy tính, những trò chơi bạn đang chơi, whit mà bạn đang gửi thư, vv bạn sẽ gọi nó là trojan.

Vì vậy, chỉ cần đọc các địa chỉ liên hệ nếu nó thực sự cần thiết và sau đó người dùng sẽ cung cấp cho bạn các quyền do đó.

Các permission.system của android chủ yếu có ý nghĩa;)

+0

Tôi đồng ý với một mức độ nào. Nhưng "để nhập dữ liệu Contakt bằng tay" là một ví dụ xấu cho "gửi số để quay số". Tôi có thể gửi số thực tế và người dùng KHÔNG phải nhập chính nó. Nếu tôi muốn "truy vấn địa chỉ liên hệ trong nền" như trong một EditText tự động hoàn thành, Giấy phép có ý nghĩa hoàn chỉnh. Người dùng có thể không biết rằng các liên hệ được truy cập. NHƯNG Nếu tôi hiển thị người dùng ỨNG DỤNG LIÊN HỆ HIS, và anh ta phải chọn một, làm thế nào anh ta có thể không nhận thức được rằng "liên lạc" ong của mình truy cập? Nó chỉ là một convinience cho anh ta, thay vì Nhập dữ liệu, để lấy một từ Liên hệ –

+2

PLUS rằng hầu hết các quyền thất bại tại 'startActivityForResult'. trong ContactPicker người dùng có thể chọn liên hệ của mình, và tôi nhận được một dữ liệu Intent Back, KHÔNG cần giấy phép. Dữ liệu không may chỉ chứa một uri tra cứu, mà sau đó cần sự cho phép này Nếu bạn muốn đọc nó. –

+0

Nếu tôi hiểu rằng bạn muốn người dùng chọn một liên hệ nhưng do đó bạn phải đọc tất cả địa chỉ liên hệ của mình và tạo danh sách để liên hệ hoặc người dùng-ứng dụng liên hệ phải gửi dữ liệu liên hệ từ người đã chọn đến ý định. Cách thứ hai có thể là không thể tùy thuộc vào ứng dụng liên lạc của người dùng và người đầu tiên cần sự cho phép :) – DaKirsche

Các vấn đề liên quan