2013-07-12 9 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

私はある程度同意するものとします。しかし、「手でContaktデータを入力する」というのは、「番号をダイヤラに送る」という悪い例です。私は実際の番号を送ることができ、ユーザーはそれ自体を入力する必要はありません。オートコンプリートのEditTextのように「バックグラウンドで連絡先を照会」したい場合、パーミッションは完全に意味があります。ユーザーは、連絡先がアクセスされていることを認識していない可能性があります。しかし、ユーザーに彼のコンタクトAPPを表示して、それを選択しなければならない場合、彼の "連絡先"がアクセスされたことに気付かないのはどうですか?連絡先 –

+2

からデータを入力するのではなく、「startActivityForResult」でほとんどのパーミッションが失敗するように、データを入力するのではなく、彼にはちょっと納得です。 ContactPickerでは、ユーザーは自分の連絡先を選ぶことができ、許可を必要とせずにデータの意図を返すことができます。不幸にも、データには検索URIのみが含まれています。 –

+0

私はあなたが1つの連絡先を選ぶことを望んでいるが、そのために連絡先のすべてを読んでから連絡先リストを作成するか、user-contact-appが連絡先データを選択したものから意図。 2番目の方法は、ユーザーの連絡先のアプリケーションに応じて不可能である可能性があり、最初の1つは許可が必要です:) – DaKirsche

関連する問題