[android|kotlin] '가게 재고 관리 앱' - 전화번호 저장

이아름·2022년 10월 13일
0

프로젝트

목록 보기
4/4
post-thumbnail

요구사항

  • '연락처에 저장 ' 버튼을 누르면 가게 이름과 전화번호가 디바이스에 저장된다.

  • 전화번호 저장을 위해서는 권한 관리가 필요하다
    -> tedpermission 라이브러리를 사용해서 권한 관리를 해주었다.

TedPermission 라이브러리 사용방법

  • gradle에 아래 코드를 추가한다.
    //permission
    implementation 'io.github.ParkSangGwon:tedpermission-normal:3.3.0'
  • 권한 확인을 하고 싶은 위치에 아래 코드를 구현한다.

    var permissionlistener: PermissionListener = object : PermissionListener {
        override fun onPermissionGranted() {
        	//permission 수락시
        }

        override fun onPermissionDenied(deniedPermissions: MutableList<String>?) {
        	//permission 거부시
        }
    }
    
TedPermission.create()
       .setPermissionListener(permissionlistener)
       .setDeniedMessage({permission 거부시 나오는 message string})
       .setPermissions(Manifest.permission.{확인하고 싶은 permission})
       .check()

연락처 추가하는 방법

  • android 연락처 데이터의 구조가 조금 복잡하다

  • raw contact 밑에 data들이 있기 때문에 raw contact를 먼저 생성해 주고 내부에 들어갈 data들을 하나씩 넣어줘야 한다.

  • 코드는 아래와 같다.

private fun addContacts(storeName: String, storeTel: String){
        var text = ""
        try{
            var list = ArrayList<ContentProviderOperation>()
            list.add( //rawContact 추가
                ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE,null)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME,null)
                    .build())
            list.add( //data 추가
                ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,0)
                    .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,storeName)//이름
                    .build())
            list.add( //data 추가
                ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID,0)
                    .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,storeTel)//전화번호
                    .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)//번호타입(Type_Mobile:모바일)
                    .build())
            requireContext().contentResolver.applyBatch(ContactsContract.AUTHORITY, list)
            text = "저장되었습니다."
        }catch(e : java.lang.Exception){
            text = "저장에 실패했습니다."
        }finally {
            Toast.makeText(context,text,Toast.LENGTH_SHORT).show()
        }

해당 코드는 버튼을 누르면 자동으로 연락처를 저장하는 코드이다.

만약 내용만 입력해두고 저장버튼은 사용자가 누르도록 하고 싶다면 아래와 같은 코드를 사용하면 된다.

private fun addContactByIntent(storeName: String, storeTel: String){
        val intent = Intent().apply{
            setAction(Intent.ACTION_INSERT)
            setData(Uri.parse("content://contacts/people"))

            putExtra(ContactsContract.Intents.Insert.NAME, storeName)
            putExtra(ContactsContract.Intents.Insert.PHONE,storeTel)
            putExtra(
                ContactsContract.Intents.Insert.PHONE_TYPE,
                ContactsContract.CommonDataKinds.Phone.TYPE_WORK
            )
        }
        startActivity(intent)
    }
profile
반갑습니다

0개의 댓글