관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 카메라로 찍고 해당 이미지 세팅하기 + 예제는 마지막꺼 참고해주세요 본문

안드로이드/자바 & Previous

[안드로이드] 카메라로 찍고 해당 이미지 세팅하기 + 예제는 마지막꺼 참고해주세요

막무가내막내 2019. 5. 1. 23:37
728x90

 

 

이번에는 안드로이드에서 카메라로 사진을 찍고 이미지뷰에 세팅하는 방법에 대해 포스팅해보겠습니다.

들어가기에 앞서 안드로이드 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번쨰 글에 이미지를 만들어 저장하는 방법 등도 있으니 참고하시면 좋을 것 같습니다.

 

출처 및 참고 :http://blog.naver.com/PostView.nhn?blogId=whdals0&logNo=221408855795&categoryNo=29&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=search

 

안드로이드 카메라 예제 (1/3) - 카메라 촬영 후 썸네일 가져오기

이번에는 3 단계로 나누어진 안드로이드 카메라 예제를 올려보겠습니다. 1탄 - 안드로이드 카메라 사용을 ...

blog.naver.com

 

========================================================================

이 글을 쓰고 추후에 추가한 카메라 앨범 표본코드 정리입니다.

위에서 쓴 글에서는 권한추가만 참고해주시고 이걸 사용하셔도 될 것 같습니다.

사진을 올리는 이벤트를 처리할 곳에서 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

 

mtjin/StudyTogether

스터디 모집 어플 프로젝트. Contribute to mtjin/StudyTogether development by creating an account on GitHub.

github.com

 

 


[2021]

최근에 startActivityForResult() 가 deprecated 되었습니다.

이제부터는 다음 방법을 사용하길 권장드립니다.

developer.android.com/training/basics/intents/result?hl=ko

 

활동에서 결과 가져오기  |  Android 개발자  |  Android Developers

개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를 들어, 앱에서 카메라 앱

developer.android.com

 

 

댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!

728x90
Comments