외로운 Nova의 작업실
안드로이드 앱 프로그래밍 - 32(안드로이드 기본앱과 연동하기) 본문
- 주소록 앱 연동하기
주소록은 가장 많이 이용하는 안드로이드의 기본앱입니다. 핸드폰의 주소록 앱을 연동하여 주소록 목록을 띄우고 전화번호를 가져와보도록 하겠습니다. 프로바이더를 사용할때는 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>
- 실행
'Programming > Kotlin - Android' 카테고리의 다른 글
안드로이드 앱 프로그래밍 - 34(파일에 보관하기) (0) | 2023.03.01 |
---|---|
안드로이드 앱 프로그래밍 - 33(데이터베이스에 보관하기) (0) | 2023.02.28 |
안드로이드 앱 프로그래밍 - 31(콘텐츠 프로바이더 이해하기) (0) | 2023.02.24 |
안드로이드 앱 프로그래밍 - 30(잡 스케줄러) (0) | 2023.02.23 |
안드로이드 앱 프로그래밍 - 29(백그라운드 제약) (0) | 2023.02.22 |
Comments