외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 32(안드로이드 기본앱과 연동하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 32(안드로이드 기본앱과 연동하기)

Nova_ 2023. 2. 27. 16:57

- 주소록 앱 연동하기

주소록은 가장 많이 이용하는 안드로이드의 기본앱입니다. 핸드폰의 주소록 앱을 연동하여 주소록 목록을 띄우고 전화번호를 가져와보도록 하겠습니다. 프로바이더를 사용할때는 query의 uri가 굉장히 중요합니다.

 

<주소록 앱 퍼미션 설정>

먼저, 매니페스트 파일에 퍼미션을 설정해줍니다.

<uses-permission android:name="android.permission.READ_CONTACTS" />

 

<코드 작성>

이제 사용자에게 퍼미션을 얻어내는 코드와 주소록의 프로바이더에게 쿼리를 보내고그 값에따라 데이터를 받아옵니다. 아래는 메인 액티비티.kt 파일입니다.

class MainActivity : AppCompatActivity() {

    lateinit var path: String
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val Binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(Binding.root)



        //get permission
        val status = ContextCompat.checkSelfPermission(this, "android.permission.READ_CONTACTS")
        if(status == PackageManager.PERMISSION_GRANTED){
            Log.d("log","permission granted")

        } else{
            ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.READ_CONTACTS"), 100)
        }
        val intent = Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI)


        //register callback entry function
        val getResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
            val projection = arrayOf<String>(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,   //연락처 이름
                ContactsContract.CommonDataKinds.Phone.NUMBER) //연락처 넘버
            if(it.resultCode == Activity.RESULT_OK){
                val cursor = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection,
                null,
                null,
                    null)
                if(cursor!!.moveToLast()){
            
                    path = it.data?.dataString.toString()       //고른사람의 path 담기
                    Log.d("data", "{$path}")

                }
                else{
                    Log.d("log", "fail to cursor")
                }
                cursor.close()
            }
            //
            val cursor = contentResolver.query(Uri.parse(path), projection, //고른사람의 path로 다시 요청
                null,
                null,
                null)
            if(cursor!!.moveToFirst()){
                val name = cursor.getString(0)
                val phone = cursor.getString(1)

                Binding.Name.text = name
                Binding.Number.text = phone

            }
            else{
                Log.d("log", "fail to cursor")
            }
            cursor.close()
        }



        Binding.selectNumber.setOnClickListener(){
            getResult.launch(intent)
        }
    }
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Log.d("log","permission granted")
        } else{
            Toast.makeText(applicationContext,"해당 권한을 허용해주셔야 앱 사용이 가능합니다.", Toast.LENGTH_SHORT).show()
            ActivityCompat.requestPermissions(this, arrayOf<String>("android.permission.CAMERA"), 100)
            Log.d("log","permission denied")
        }
    }
}

아래는 메인 액티비티.xml 파일입니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/selectNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="Button"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/selectNumber" />

    <TextView
        android:id="@+id/Number"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/Name"
        app:layout_constraintVertical_bias="0.003" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

- 실행

 

Comments