<uses-permission android:name="android.permission.READ_CONTACTS" />
퍼미션을 설정해야 한다.
val intent = Intent(ACTION_PICK, ContactsContract.CommonDataKinds.Phone.CONTENT_URI)
requestContactLauncher.launch(intent)
주소록의 목록 화면을 띄우는 코드이다.
주소록 목록 화면은 인텐트를 이용해 실행한다.
안드로이드에서 이미지는 Drawable이나 Bitmap 객체로 표현한다.
BitMapFactory를 이용하면 작은 이미지를 불러오는 데는 문제 없지만 큰 이미지를 불러올 때는 OOM(Out Of Memory)오류가 발생할 수 있다.
// 옵션을 지정하지 않고 비트맵 생성
val bitmap = BitmapFactory.decodeStream(inputStream)
// 옵션을 지정해 비트맵 생성
val option = BitmapFactory.Options()
option.inSampleSize = 4
val bitmap = BitmapFactory.decodeStream(inputStream, null, option)
// 사진 목록 출력
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
intent.type = "image/*"
requestGalleryLauncher.launch(intent)
카메라 앱을 연동하여 결과를 돌려받는 방법은 2가지가 있다.
사진 데이터를 가져오는 방법은 카메라 앱으로 사진을 촬영 후 파일로 저장하지 않고 데이터만 넘겨주는 방식이다. 이 방식은 데이터의 크기가 작다는 단점이 있다.
사진 파일을 공유하는 방법은 사진을 파일에 저장한 후 성공인지 실패인지만 넘겨주는 방식이다. 카메라 성능만큼 큰 크기의 사진을 촬영하고 앱에서 이용할 수 있지만, 준비 작업이 필요하다.
// 사진 촬영 액티비티 실행
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
requestCameraTumbnailLauncher.launch(intent)
액션 문자열을 MediaStore.ACTION_IMAGE_CAPTURE로 지정하여 시스템에 전달하면 카메라 앱이 실행된다.
앱에서 외장 메모리에 파일을 만들어 줘야 한다.
파일을 만들 때 getExternalStoragePublicDirectory() 또는 getExternalFilesDir() 함수를 이용할 수 있다.
getExternalStoragePublicDirectory() 함수를 이용하려면 다음의 퍼미션을 설정해 줘야 한다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
API 레벨 24버전 부터는 엄격 모드가 적용되었다.
앱끼리 파일을 공유하려면 content:// 프로토콜을 이용하고, URI에 접근할 수 있는 권한을 부여해야 한다.
이때 FileProvider클래스를 이용한다. FileProvider 클래스는 XML 설정을 기반으로 content:// 프로토콜로 구성된 URI를 생성해 준다.
res/xml 디렉터리에 파일 프로바이더용 XML 파일을 만들어 줘야 한다.
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="myfiles" path="Android/data/패키지명/files/Pictures" />
</paths>
<provider>
...
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"> </meta-data>
</provider>
메타 데이터의 resource속성에 res/xml에 만들어 놓은 XML 파일을 지정한다.
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37, 126"))
startActivity(intent)
지도 앱을 연동할 때는 인텐트 문자열을 Intent.ACTION_VIEW로 지정한다.
geo:의 숫자는 위도와 경도를 의미한다.
<uses-permission android:name="android.permission.CALL_PHONE" />
전화를 거는 기능은 위 처럼 퍼미션을 설정해야 한다.
val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:02-120"))
startActivity(intent)
인텐트를 시스템에 전달하여 전화를 걸 수 있다.