카메라 앱으로 사진 찍어서 앱에 사용

Soomin Kim·2023년 3월 9일

Android

목록 보기
6/14

권한 설정

AndroidManifest.xml

<manifest ...>
	<uses-permission android:nam"android:permission.CAMERA"/>
    // 위치 권한도 설정할 경우
    <uses-permission android:nam"android:permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:nam"android:permission.ACCESS_COARSE_LOCATION"/>

적용

MainActivity.kt

class MainActivity: AppCompatActivity() {
	private val cameraResultLauncher: ActivityResultLauncher<String> = 
    registerForActivityResult(
    ActivityResultContracts.RequestPermission()){
    	isGranted ->
        if (isGranted) {
        	// Granted
        }else{
        	// Denied
        }
    }
    
    // 여러 권한 요청
    private val cameraAndLocationResultLauncher: ActivityResultLauncher<Array<String>> = 
    registerForActivityResult(
    ActivityResultContracts.RequestMultiplePermissions()){
    // permissions에는 문자열(권한 이름), Boolean (승인여부)
    	permissions ->
        permissions.entries.forEach{
        val permissionName = it.key
        val isGranted = it.value
        if (isGranted) {
        	if (permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
            // Granted for FINE location
            }else if (permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
            // Granted for Coarse Location
            }
            else{
            // Granted for Camera
            }
        }else{
        	if (permissionName == Manifest.permission.ACCESS_FINE_LOCATION) {
            // Denied for location
            }else if (permissionName == Manifest.permission.ACCESS_COARSE_LOCATION) {
            // Denied for Coarse Location
            }else{
            // Denied for Camera
            }
        }
  
        }
        
    }
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val btnCameraPermission: Button = findViewById(R.id.btnCameraPermission)
        
        btnCameraPermission.setOnClickListener{
        	if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M && 
            shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)){
            	showRationaleDialog("카메라 접근 허용이 필요합니다", "카메라 접근 허용이 거부되어, 카메라를 사용할 수 없습니다.")
            }else{
//단일 권한일 경우            	cameraResultLauncher.launch(Manifest.permission.CAMERA)
// 여러개의 권한
cameraResultLauncher.launch(
	arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
)

            }
            
        }
        
        private fun showRationaleDialog(
        title: String,
        message: String,
        ) {
        
        	val builder: AlertDialog.Builder = AlertDialog.Builder(this)
            builder.setTitle(title).setMessage(message)
            .setPositiveButton("Cancel"){dialog, _ -> 
            dialog.dismiss()
            }
            builder.create().show()
        }
        
        btn_camera.setOnClickListener{
        	if (ContextCompat.checkSelfPermission(
            	this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                startActivityForResult(intent, CAMERA_REQUEST_CODE)
                
            }else{
            	ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_CODE)
            }
        }
    }
    
    override fun onRequestPermissionsResult(requestcode: Int, permissions: Array<out String>, grantResults: IntArray){
    	super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    	if (requestCode == CAMERA_PERMISSION_CODE){
    		if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            	val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                startActivityForResult(intent, CAMERA_REQUEST_CODE)
            }else{
            	Toast.makeTest(this, "카메라 접근이 거부되었습니다. 접근 권한 변경은 설정에서 할 수 있습니다.", Toast.LENGTH_LONG).show()
            }
        }
  	}
    
    // 사용자가 카메라로 이미지를 선택하면 자동으로 불러지는 메소드
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == Activity.RESULT OK) {
        	if(requestCode == CAMERA_REQUEST_CODE){
            	// 불러온 이미지를 이미지 변수에 저장
            	val thumbNail: Bitmap = data!!.extras!!.get("data") as Bitmap.
                iv_image.setImageBitmap(thumbNail)
            }else{
            	
            }
        }
    }
}
class MainActivity: AppCompatActivity() {
	companion object{
    	private const val CAMERA_PERMISSION_CODE = 1
        private const val CAMERA_REQUEST_CODE = 2
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        btn_camera.setOnClickListener{
        	if (ContextCompat.checkSelfPermission(
            	this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
                val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                startActivityForResult(intent, CAMERA_REQUEST_CODE)
                
            }else{
            	ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), CAMERA_PERMISSION_CODE)
            }
        }
    }
    
    override fun onRequestPermissionsResult(requestcode: Int, permissions: Array<out String>, grantResults: IntArray){
    	super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    	if (requestCode == CAMERA_PERMISSION_CODE){
    		if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            	val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                startActivityForResult(intent, CAMERA_REQUEST_CODE)
            }else{
            	Toast.makeTest(this, "카메라 접근이 거부되었습니다. 접근 권한 변경은 설정에서 할 수 있습니다.", Toast.LENGTH_LONG).show()
            }
        }
  	}
    
    // 사용자가 카메라로 이미지를 선택하면 자동으로 불러지는 메소드
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == Activity.RESULT OK) {
        	if(requestCode == CAMERA_REQUEST_CODE){
            	// 불러온 이미지를 이미지 변수에 저장
            	val thumbNail: Bitmap = data!!.extras!!.get("data") as Bitmap.
                iv_image.setImageBitmap(thumbNail)
            }else{
            	
            }
        }
    }
}
profile
개발자지망생

0개의 댓글