투케이2K

168. (AndroidStudio/android/java) 카메라 (camera) 사진 촬영 및 scoped storage 갤러리 사진 저장 본문

Android

168. (AndroidStudio/android/java) 카메라 (camera) 사진 촬영 및 scoped storage 갤러리 사진 저장

투케이2K 2021. 6. 24. 15:35

/* =========================== */

[ 개발 환경 설정 ]

개발 툴 : AndroidStudio

개발 언어 : java

/* =========================== */

/* =========================== */

[소스 코드]

 

//TODO [로직 [1] : 사전 퍼미션 요청 필요함]
    /**
     * <uses-permission android:name="android.permission.CAMERA"/>
     * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
     * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
     * <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/>
     * */





//TODO [로직 [2] : 카메라 호출 실시]
Uri image_uri;
public void goCamera(){
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Camera > goCamera() 메소드 : 카메라 호출 실시]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        try {
            ContentValues values = new ContentValues(); //TODO [갤러리 Picture 폴더에 사진이 저장된다]
            values.put(MediaStore.Images.Media.TITLE, getNowTime24()); //TODO [사진 이름]
            values.put(MediaStore.Images.Media.DESCRIPTION, "From the Camera"); //TODO [설명]

            image_uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri);
            startActivity(cameraIntent); //TODO [일반 인텐트 실시]
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }




//TODO [로직 [3] : 카메라로 촬영한 사진 저장 판단 실시]
@Override
    public void onResume(){
        super.onResume();        
        //TODO [카메라 촬영 완료 후 사진 이미지 표시]
        try {
            if(image_uri != null){
                try {
                    //TODO [저장된 이미지가 있는지 확인 실시]
                    InputStream is = getContentResolver().openInputStream(image_uri);
                    int size = is.read();
                    is.close();
                    Log.d("---","---");
                    Log.w("//===========//","================================================");
                    Log.d("","\n"+"[A_Camera > onResume() 메소드 : 액티비티 실행 준비]");
                    Log.d("","\n"+"[저장된 이미지 확인 : 이미지 저장됨]");
                    Log.d("","\n"+"[콘텐츠 경로 : "+String.valueOf(image_uri)+"]");
                    Log.d("","\n"+"[길이 : "+String.valueOf(size)+"]");
                    Log.w("//===========//","================================================");
                    Log.d("---","---");

                    //TODO [이미지 뷰에 사진 표시 실시]
                    imageView.setImageURI(image_uri);

                    //TODO [MediaStore 에 새로 JPEG 파일로 저장 실시]
                    saveFile(getNowTime24(), imageView);
                }
                catch (Exception e){
                    Log.d("---","---");
                    Log.e("//===========//","================================================");
                    Log.d("","\n"+"[A_Camera > onResume() 메소드 : 액티비티 실행 준비]");
                    Log.d("","\n"+"[저장된 이미지 확인 : 이미지 저장되지 않음]");
                    Log.e("//===========//","================================================");
                    Log.d("---","---");
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }





//TODO [로직 [4] : MediaStore 에 새로 JPEG 파일로 저장 실시]
private void saveFile(String fileName, ImageView view) {
        String deleteCheck = S_Preference.getString(getApplication(), "saveCameraScopeContent");
        if(deleteCheck != null && deleteCheck.length() > 0){ //TODO 이전에 저장된 파일이 있을 경우 지운다
            try {
                ContentResolver contentResolver = getContentResolver();
                contentResolver.delete(
                        Uri.parse(S_Preference.getString(getApplication(), "saveCameraScopeContent")),
                        null,
                        null);
                Log.d("---","---");
                Log.e("//===========//","================================================");
                Log.d("","\n"+"[A_Camera > saveFile() 메소드 : 이전에 저장된 파일 삭제 실시]");
                Log.d("","\n"+"[콘텐츠 파일 경로 : "+String.valueOf(deleteCheck)+"]");
                Log.d("","\n"+"[절대 파일 경로 : "+S_Preference.getString(getApplication(), "saveCameraScopeAbsolute")+"]");
                Log.e("//===========//","================================================");
                Log.d("---","---");
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }

        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Camera > saveFile() 메소드 : MediaStore 파일 저장 실시]");
        Log.d("","\n"+"[파일 이름 : "+String.valueOf(fileName)+"]");
        Log.d("//===========//","================================================");
        Log.d("---","---");

        //TODO [저장하려는 파일 타입, 이름 지정]
        ContentValues values = new ContentValues();
        values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName+".JPG");
        values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
        //values.put(MediaStore.Images.Media.MIME_TYPE, getMIMEType(fileRoot));
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            values.put(MediaStore.Images.Media.IS_PENDING, 1);
        }
        ContentResolver contentResolver = getContentResolver();
        Uri item = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

        try {
            //TODO [쓰기 모드 지정]
            ParcelFileDescriptor pdf = contentResolver.openFileDescriptor(item, "w", null);

            if (pdf == null) {
                Log.d("---","---");
                Log.e("//===========//","================================================");
                Log.d("","\n"+"[A_Camera > saveFile() 메소드 : MediaStore 파일 저장 실패]");
                Log.d("","\n"+"[원인 : "+String.valueOf("ParcelFileDescriptor 객체 null")+"]");
                Log.e("//===========//","================================================");
                Log.d("---","---");
            } else {
                //TODO [이미지 뷰에 표시된 사진을 얻어온다]
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 4;
                //Bitmap bitmap= BitmapFactory.decodeFile(filePath, options);
                Bitmap bitmap = ((BitmapDrawable) view.getDrawable()).getBitmap();

                //TODO [이미지 리사이징 실시]
                int width = 354; // [축소시킬 너비]
                int height = 472; //[축소시킬 높이]
                float bmpWidth = bitmap.getWidth();
                float bmpHeight = bitmap.getHeight();

                if (bmpWidth > width) {
                    // [원하는 너비보다 클 경우의 설정]
                    float mWidth = bmpWidth / 100;
                    float scale = width/ mWidth;
                    bmpWidth *= (scale / 100);
                    bmpHeight *= (scale / 100);
                } else if (bmpHeight > height) {
                    // [원하는 높이보다 클 경우의 설정]
                    float mHeight = bmpHeight / 100;
                    float scale = height/ mHeight;
                    bmpWidth *= (scale / 100);
                    bmpHeight *= (scale / 100);
                }

                //TODO [리사이징 된 파일을 비트맵에 담는다]
                //Bitmap resizedBmp = Bitmap.createScaledBitmap(bitmap, (int) bmpWidth, (int) bmpHeight, true); //TODO [해상도 맞게 표시]
                Bitmap resizedBmp = Bitmap.createScaledBitmap(bitmap, (int) width, (int) height, true); //TODO [지정한 사이즈 기준]
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                resizedBmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] imageInByte = baos.toByteArray();

                //TODO [이미지를 저장하는 부분]
                FileOutputStream outputStream = new FileOutputStream(pdf.getFileDescriptor());
                outputStream.write(imageInByte);
                outputStream.close();

                //TODO [경로 저장 실시]
                //[콘텐츠 : 이미지 경로 저장]
                S_Preference.setString(getApplication(), "saveCameraScopeContent", String.valueOf(item));

                //[절대 : 이미지 경로 저장]
                Cursor c = getContentResolver().query(Uri.parse(String.valueOf(item)), null,null,null,null);
                c.moveToNext();
                String absolutePath = c.getString(c.getColumnIndex(MediaStore.MediaColumns.DATA));
                S_Preference.setString(getApplication(), "saveCameraScopeAbsolute", absolutePath);

                Log.d("---","---");
                Log.w("//===========//","================================================");
                Log.d("","\n"+"[A_Camera > saveFile() 메소드 : MediaStore 파일 저장 성공]");
                Log.d("","\n"+"[콘텐츠 파일 경로 : "+S_Preference.getString(getApplication(), "saveCameraScopeContent")+"]");
                Log.d("","\n"+"[절대 파일 경로 : "+S_Preference.getString(getApplication(), "saveCameraScopeAbsolute")+"]");
                Log.w("//===========//","================================================");
                Log.d("---","---");

                //TODO [다시 사진 표시 실시]
                readFile(imageView, S_Preference.getString(getApplication(), "saveCameraScopeContent"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }






//TODO [로직 [5] : MediaStore 저장된 파일 읽기 실시]
private void readFile(ImageView view, String path) {
        Log.d("---","---");
        Log.d("//===========//","================================================");
        Log.d("","\n"+"[A_Camera > readFile() 메소드 : MediaStore 파일 불러오기 실시]");
        Log.d("","\n"+"[콘텐츠 파일 경로 : "+String.valueOf(path)+"]");
        Log.d("//===========//","================================================");
        Log.d("---","---");
        Uri externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        String[] projection = new String[]{
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.MIME_TYPE
        };

        Cursor cursor = getContentResolver().query(externalUri, projection, null, null, null);

        if (cursor == null || !cursor.moveToFirst()) {
            Log.d("---","---");
            Log.e("//===========//","================================================");
            Log.d("","\n"+"[A_Camera > readFile() 메소드 : MediaStore 파일 불러오기 실패]");
            Log.d("","\n"+"[원인 : "+String.valueOf("Cursor 객체 null")+"]");
            Log.e("//===========//","================================================");
            Log.d("---","---");
            return;
        }

        //TODO [특정 파일 불러오기 실시]
        String contentUrl = path;
        try {
            InputStream is = getContentResolver().openInputStream(Uri.parse(contentUrl));
            if(is != null){
                // [선택한 이미지에서 비트맵 생성]
                Bitmap img = BitmapFactory.decodeStream(is);
                is.close();

                // [이미지 뷰에 이미지 표시]
                view.setImageBitmap(img);
                Log.d("---","---");
                Log.w("//===========//","================================================");
                Log.d("","\n"+"[A_Camera > readFile() 메소드 : MediaStore 파일 불러오기 성공]");
                Log.d("","\n"+"[콘텐츠 파일 경로 : "+String.valueOf(contentUrl)+"]");
                Log.w("//===========//","================================================");
                Log.d("---","---");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }





//TODO [로직 [6] : 일반 파일 이름 지정 메소드 정의]
public static String getNowTime24() {
        long time = System.currentTimeMillis();
        //SimpleDateFormat dayTime = new SimpleDateFormat("hh:mm:ss");
        SimpleDateFormat dayTime = new SimpleDateFormat("yyyyMMddkkmmss");
        String str = dayTime.format(new Date(time));
        return "CM"+str; //TODO [CM는 카메라 의미]
    }

/* =========================== */

/* =========================== */

[결과 출력]

/* =========================== */

반응형
Comments