Notice
Recent Posts
Recent Comments
Link
투케이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는 카메라 의미]
}
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
반응형
'Android' 카테고리의 다른 글
Comments