MainActivity.kt
class MainActivity : AppCompatActivity() {
val binding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
lateinit var cameraPermission: ActivityResultLauncher<String>
lateinit var storagePermission: ActivityResultLauncher<String>
// Uri에 접속할 수 있게 권한을 주기 위해 변수 선언
lateinit var cameraLauncher: ActivityResultLauncher<Uri>
lateinit var galleryLauncer: ActivityResultLauncher<String>
// Uri 변수 선언 -> Uri 는 nullable 이면 안됨
lateinit var photoUri:Uri
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
// 앱 실행시 앱을 사용하는 동안 권한에 관한 팝업을 띄워줌
// it -> 결과 (boolean)
storagePermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if (it) {
setViews()
} else {
Toast.makeText(baseContext,
"외부 저장소 권한을 승인 해야 앱을 사용할 수 있습니다",
Toast.LENGTH_SHORT
).show()
finish()
}
}
// 앱 실행시 앱을 사용하는 동안 카메라 권한에 관한 팝업을 띄움
cameraPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
if(it) {
openCamera()
} else {
Toast.makeText(baseContext,
"카메라 권한을 승인 해야 카메라를 사용할 수 있습니다",
Toast.LENGTH_SHORT
).show()
finish()
}
}
// it 대신 다른 operator 를 사용 해도 됨 대신 operator -> 로 작성
cameraLauncher = registerForActivityResult(ActivityResultContracts.TakePicture()) { isSuccess ->
if (isSuccess) binding.imageView.setImageURI(photoUri)
}
// 갤러리를 실행 했을 때 작동 하는 코드
galleryLauncer = registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
}
storagePermission.launch(android.Manifest.permission.READ_MEDIA_IMAGES)
// storagePermission.launch(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
fun setViews() {
// 버튼을 눌렀을 때 permission 을 launch 해줌
binding.btnCamera.setOnClickListener {
cameraPermission.launch(android.Manifest.permission.CAMERA)
}
binding.btnGallery.setOnClickListener {
openGallery()
}
}
fun openCamera() {
// createTempFile -> 임시 파일을 만들어 줌
// prefix -> createTempFile 에서 뒤에 숫자를 붙여줌
// suffix -> 확장자
var photoFile = File.createTempFile(
"IMG_",
".jpg",
getExternalFilesDir(Environment.DIRECTORY_PICTURES)
)
// file 의 uri 를 가져 와서 사용 -> File 이름과 구조를 Uri 로 바꿔줌
photoUri = FileProvider.getUriForFile(
this,
"${packageName}.provider",
photoFile
)
// launcher 를 launch 시켜줌
cameraLauncher.launch(photoUri)
}
fun openGallery() {
// 갤러리에서 선택한 이미지를 imageView 에 띄우기
galleryLauncer.launch("image/*")
}
}
AndroidManifest.xml
...
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
...
</activity>
<!-- 추가한 부분 -->
<provider
android:authorities="${applicationId}.provider"
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
</application>