Android 연락처 전화번호 가 져 오기 기능 구현

이 문 서 는 주로 연락처 의 전화 번 호 를 얻 는 방식 을 기록한다.
1.연락처 선택

............
//       Intent,       
final Intent pickIntent = new Intent(Intent.ACTION_PICK,
  ContactsContract.Contacts.CONTENT_URI);

mSuspectButton = (Button)v.findViewById(R.id.crime_suspect);
mSuspectButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  startActivityForResult(pickIntent, REQUEST_CONTACT);
 }
});
...........
2.선택 결과 처리

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
 ...........
 } else if (requestCode == REQUEST_CONTACT && data != null) {
  //           ,            Uri
  Uri contactUri = data.getData();

  String[] queryFields = new String[] {
    ContactsContract.Contacts.DISPLAY_NAME,
    //        contactId
    ContactsContract.Contacts._ID
  };

  Cursor c = getActivity().getContentResolver()
    .query(contactUri, queryFields, null, null, null);

  if (c == null) {
   return;
  }

  try {
   if (c.getCount() == 0) {
    return;
   }

   c.moveToFirst();

   //      
   String suspect = c.getString(0);
   mCrime.setSuspect(suspect);
   mSuspectButton.setText(suspect);

   //      contactId
   mCrime.setContactId(c.getString(1));
   mDialButton.setEnabled(true);
  } finally {
   c.close();
  }
 }
}

3.실행 신청 시 권한
안 드 로 이 드 6.0 이후,READCONTACTS 가 실행 권한 으로 변 경 됩 니 다.
따라서 AndroidManifest.xml 에서 권한 을 설명 하 는 것 외 에(낮은 버 전 호 환)코드 에서 자발적으로 신청 해 야 합 니 다.

...............
mDialButton = (Button) v.findViewById(R.id.crime_dial);
mDialButton.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  //SDK >= 23 ,   Activity.checkSelfPermission  
  //     SDK     ,     ,             
  //      android.support.v4.app.Fragment  checkSelfPermission
  //  Activity,    ActivityCompat    
  int hasReadContactsPermission = checkSelfPermission(getContext(),
    android.Manifest.permission.READ_CONTACTS);

  //          
  //          ,           ,          
  if (hasReadContactsPermission != PackageManager.PERMISSION_GRANTED) {
   //    ,       

   //     “      ,     ” ,        
   //         ,           
   //     shouldShowRequestPermissionRationale  
   if (!shouldShowRequestPermissionRationale(android.Manifest.permission.READ_CONTACTS)) {
    showMessageOKCancel("You need to allow access to Contacts",
     new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
       //          ,    
       requestPermissions(
        new String[] {Manifest.permission.READ_CONTACTS},
        ASK_READ_CONTACTS_PERMISSION);
       }
      });
    return;
   }

   requestPermissions(new String[] {Manifest.permission.READ_CONTACTS},
     ASK_READ_CONTACTS_PERMISSION);

   return;
  }

  //            ,   
  getPhoneNumberAndDial();
 }
});
................

private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
 new AlertDialog.Builder(getContext())
  .setMessage(message)
  .setPositiveButton("OK", okListener)
  .setNegativeButton("Cancel", null)
  .create()
  .show();
}

4.처리 권한 신청 결과

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 switch (requestCode) {
  case ASK_READ_CONTACTS_PERMISSION:
   //          ,  grantResults[0]           
   if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
     //      ,            
     getPhoneNumberAndDial();
   } else {
    Toast.makeText(getContext(),
      "READ_CONTACTS Denied",
      Toast.LENGTH_SHORT)
      .show();
   }
   return;
  default:
   super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 }
}
이곳 에서 주의해 야 할 것 은:
1)호 환 라 이브 러 리 에 있 는 Fragment 를 사용 하지 않 으 면 onRequestPermissions Result 는 이 Fragment 를 포함 하 는 Activity 에 정의 해 야 호출 을 보장 할 수 있 습 니 다.
2),사용자 가'권한 신청 을 거부 하고 알림 을 하지 않 습 니 다'와 유사 한 버튼 을 눌 렀 다 면 다시 권한 을 신청 한 결 과 는 계속 DENIED 가 될 것 입 니 다.
이 때 설정 에 있 는 응용 관리 에 들 어가 실행 권한 을 켜 야 합 니 다.
5.전화번호 조회 및 전화 걸 기

private void getPhoneNumberAndDial() {
 //        contactId,  CommonDataKinds.Phone     
 Cursor c = getActivity().getContentResolver().query(
   ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
   null,
   ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
   new String[] {mCrime.getContactId()},
   null);

 if (c == null) {
  return;
 }

 try {
  if (c.getCount() != 0) {
   c.moveToFirst();

   //  Phone Number   indexId
   int index = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

   //  phone Number
   String number = c.getString(index);

   Uri realNumber = Uri.parse("tel: " + number);
   //ACTION_DIAL       ,   ACTION_CALL    
   Intent i = new Intent(Intent.ACTION_DIAL);
   i.setData(realNumber);
   startActivity(i);
  } else {
   Toast.makeText(getContext(), "choose contact again", Toast.LENGTH_LONG).show();
  }
 } finally {
  c.close();
 }
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기