일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 막내의막무가내 코틀린
- 주택가 잠실새내
- 막내의막무가내 플러터 flutter
- 막내의 막무가내 알고리즘
- flutter network call
- 막내의막무가내 목표 및 회고
- 막내의막무가내 알고리즘
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내
- 막무가내
- 안드로이드 sunflower
- 막내의막무가내 안드로이드 코틀린
- 안드로이드 Sunflower 스터디
- 주엽역 생활맥주
- 안드로이드
- 막내의막무가내 일상
- 프래그먼트
- 부스트코스
- 막내의막무가내 프로그래밍
- 2022년 6월 일상
- 막내의막무가내 안드로이드 에러 해결
- 프로그래머스 알고리즘
- 막내의막무가내 플러터
- 부스트코스에이스
- 막내의막무가내 rxjava
- 막내의막무가내 SQL
- 막내의막무가내 코볼 COBOL
- 막내의 막무가내
- Fragment
- 막내의막무가내 안드로이드
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] 카메라로 찍고 해당 이미지 세팅하기 + 예제는 마지막꺼 참고해주세요 본문
이번에는 안드로이드에서 카메라로 사진을 찍고 이미지뷰에 세팅하는 방법에 대해 포스팅해보겠습니다.
들어가기에 앞서 안드로이드 8.1.0, API 27에서는 잘 돌아감을 확인했습니다.
1. 다음과 같이 Permission을 주는데 Internet은 줄 필요는 없습니다.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"
android:required="true" />
2. 처음 액티비티가 생성되는 부분인 onCreate에서 사용자에게 permission을 받습니다.
// 6.0 마쉬멜로우 이상일 경우에는 권한 체크 후 권한 요청
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "권한 설정 완료");
} else {
Log.d(TAG, "권한 설정 요청");
ActivityCompat.requestPermissions(ProfileActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
3. 권한요청하는 메소드를 정의해놓는다. 이 메소드에 대해서는 나도 잘모르겠어서 찾아봤었는데 6.0마쉬멜로우버전에서 쓰이는 선택적인 권한부여 관련 메소드인 것 같다. 지금은 Q까지 나온상태라 이게 동작을 하는건지는 잘 모르겠다. 알려주시면 감사하겠습니다.
참고 : https://academy.realm.io/kr/posts/android-marshmellow-permission/
// 권한 요청
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d(TAG, "onRequestPermissionsResult");
if (grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "Permission: " + permissions[0] + "was " + grantResults[0]);
}
}
4. 카메라로 사진을 찍기위해 인텐트 작성한다. (사진으로는 밑이 else문만 보면된다.)
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAPTURE_IMAGE);
5. 카메라로 촬영한 결과를 처리하기위해 onActivityResult에서 다음과 같이 작성해준다. (난 비트맵으로 받아와서 이미지뷰에 세팅해주었다.) 사진으로는 else if문 쪽을 보면된다.
if (requestCode == CAPTURE_IMAGE && resultCode == Activity.RESULT_OK && data.hasExtra("data")) {
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
if (bitmap != null) {
mPhotoCircleImageView.setImageBitmap(bitmap);
}
}
[결과화면]
참고로 밑 예제에 카메라예제 2번쨰 글에 이미지를 만들어 저장하는 방법 등도 있으니 참고하시면 좋을 것 같습니다.
========================================================================
이 글을 쓰고 추후에 추가한 카메라 앨범 표본코드 정리입니다.
위에서 쓴 글에서는 권한추가만 참고해주시고 이걸 사용하셔도 될 것 같습니다.
사진을 올리는 이벤트를 처리할 곳에서 photoDialogRadio() 함수를 호출해주면 됩니다.
onActivityForResult는 그대로 해주시면 됩니다.
//사진찍기 or 앨범에서 가져오기 선택 다이얼로그
private void photoDialogRadio() {
final CharSequence[] PhotoModels = {"갤러리에서 가져오기", "취소"};
AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
//alt_bld.setIcon(R.drawable.icon);
alt_bld.setTitle("프로필사진 설정");
alt_bld.setSingleChoiceItems(PhotoModels, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0) { //갤러리
takePhotoFromGallery();
} else if (item == 1) { //취소
mSetImageVIew.setImageResource(0);
mUploadImageVIew.setImageResource(R.drawable.ic_picture);
}
}
});
AlertDialog alert = alt_bld.create();
alert.show();
}
//갤러리에서 사진 불러오기
private void takePhotoFromGallery() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
intent.setType("image/*");
startActivityForResult(intent, PICK_IMAGE);
}
주석 참고바랍니다. 방법1과 2가 있습니다.(비트맵방식)
//갤러리 사진가져온거 결과(비트맵으로) 저장
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && data.getData() != null) {
if (requestCode == PICK_IMAGE) {
//방법1
try {
//불러온 사진 데이터를 비트맵으로 저장합니다.
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
//이미지뷰에 비트맵 세팅해줍니다
mSetImageVIew.setImageBitmap(bitmap);
} catch (Exception e) {
e.printStackTrace();
}
//방법2
try {
//in은 아마 InputStream일겁니다. 일단 작성하고 알트엔터 누르시면 무슨 자료형인지 알려줄겁니다.
in = getContentResolver().openInputStream(data.getData());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//inputStream을 bitmap으로 변환해줍니다.
mBitmap = BitmapFactory.decodeStream(in);
Log.d(TAG, "갤러리에서 불러온 사진 데이터:" + data.getData());
Log.d(TAG, "갤러리에서 불러온 사진 비트맵" + mBitmap);
}
}
}
이상 포스팅을 마치겠습니다.
감사합니다
https://github.com/mtjin/StudyTogether
[2021]
최근에 startActivityForResult() 가 deprecated 되었습니다.
이제부터는 다음 방법을 사용하길 권장드립니다.
developer.android.com/training/basics/intents/result?hl=ko
댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!
'안드로이드 > 자바 & Previous' 카테고리의 다른 글
[안드로이드] 파이어베이스 리사이클러뷰 정리 (6) | 2019.05.10 |
---|---|
[안드로이드] 리사이클러뷰 아래 구분선 주는 방법 (0) | 2019.05.07 |
[안드로이드] 쉽게 로딩 프로그레스 다이얼로그(ProgressDialog) 구현방법 (2) | 2019.05.01 |
[안드로이드] 갤러리 사진 불러오는 방법(다중선택 포함) + Crop 기능 (6) | 2019.04.26 |
[안드로이드] 내가 올렸던 질문 답변 - 파이어베이스 데이터베이스 관련 (0) | 2019.04.24 |