AndroidManifest 추가!
<manifest
...
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
...
</manifest>
activity_main.xml
<ImageView
android:layout_width="500dp"
android:layout_height="500dp"
tools:srcCompat="@tools:sample/avatars"
android:id="@+id/avatars"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintVertical_bias="0.654"/>
<Button
android:text="카메라"
android:layout_width="150dp"
android:layout_height="150dp" android:id="@+id/camera"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.229"
app:layout_constraintVertical_bias="0.122"/>
<Button
android:text="사진"
android:layout_width="150dp"
android:layout_height="150dp" android:id="@+id/picture"
app:layout_constraintStart_toEndOf="@+id/camera"
android:layout_marginStart="100dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintVertical_bias="0.122"/>
MainActivity
class MainActivity : AppCompatActivity() {
// storage 권한 처리에 필요한 변수
val CAMERA = arrayOf(Manifest.permission.CAMERA)
val STORAGE = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
val CAMERA_CODE = 98
val STORAGE_CODE = 99
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 카메라
val camera = findViewById<Button>(R.id.camera)
camera.setOnClickListener {
CallCamera()
}
// 앨범으로 이동
val picture = findViewById<Button>(R.id.picture)
picture.setOnClickListener {
GetAlbum()
}
}
fun getPath(uri: Uri?): String {
val projection = arrayOf<String>(MediaStore.Images.Media.DATA)
val cursor: Cursor = managedQuery(uri, projection, null, null, null)
startManagingCursor(cursor)
val columnIndex: Int = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
cursor.moveToFirst()
return cursor.getString(columnIndex)
}
// 카메라 권한, 저장소 권한
// 요청 권한
override fun onRequestPermissionsResult(requestCode: Int,
permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode){
CAMERA_CODE -> {
for (grant in grantResults){
if(grant != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "카메라 권한을 승인해 주세요", Toast.LENGTH_LONG).show()
}
}
}
STORAGE_CODE -> {
for(grant in grantResults){
if(grant != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "저장소 권한을 승인해 주세요", Toast.LENGTH_LONG).show()
}
}
}
}
}
// 다른 권한등도 확인이 가능하도록
fun checkPermission(permissions: Array<out String>, type:Int):Boolean{
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
for (permission in permissions){
if(ContextCompat.checkSelfPermission(this, permission)
!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, permissions, type)
return false
}
}
}
return true
}
// 카메라 촬영 - 권한 처리
fun CallCamera(){
if(checkPermission(CAMERA, CAMERA_CODE) && checkPermission(STORAGE, STORAGE_CODE)){
val itt = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(itt, CAMERA_CODE)
}
}
// 사진 저장
fun saveFile(fileName:String, mimeType:String, bitmap: Bitmap):Uri?{
var CV = ContentValues()
// MediaStore 에 파일명, mimeType 을 지정
CV.put(MediaStore.Images.Media.DISPLAY_NAME, fileName)
CV.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
// 안정성 검사
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
CV.put(MediaStore.Images.Media.IS_PENDING, 1)
}
// MediaStore 에 파일을 저장
val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, CV)
if(uri != null){
var scriptor = contentResolver.openFileDescriptor(uri, "w")
val fos = FileOutputStream(scriptor?.fileDescriptor)
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
fos.close()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
CV.clear()
// IS_PENDING 을 초기화
CV.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver.update(uri, CV, null, null)
}
}
return uri
}
// 결과
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
val imageView = findViewById<ImageView>(R.id.avatars)
if(resultCode == Activity.RESULT_OK){
when(requestCode){
CAMERA_CODE -> {
if(data?.extras?.get("data") != null){
val img = data?.extras?.get("data") as Bitmap
val uri = saveFile(RandomFileName(), "image/jpeg", img)
imageView.setImageURI(uri)
Toast.makeText(this, "$uri", Toast.LENGTH_LONG).show()
println("이미지 경로: $uri")
println("실제 이미지 경로 : " + getPath(uri))
}
}
STORAGE_CODE -> {
val uri = data?.data
imageView.setImageURI(uri)
}
}
}
}
// 파일명을 날짜 저장
fun RandomFileName() : String{
val fileName = SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis())
return fileName
}
// 갤러리 취득
fun GetAlbum(){
if(checkPermission(STORAGE, STORAGE_CODE)){
val itt = Intent(Intent.ACTION_PICK)
itt.type = MediaStore.Images.Media.CONTENT_TYPE
startActivityForResult(itt, STORAGE_CODE)
}
}
}
'안드로이드' 카테고리의 다른 글
[Android] GoogleMapsFragment (0) | 2022.04.05 |
---|---|
[Android] Geocoding (0) | 2022.04.03 |
[Android] 동적버튼 (0) | 2022.04.03 |
[Android] SQLite (0) | 2022.04.02 |
[Android] Singleton (0) | 2022.03.31 |
댓글