1. View를 캡처합니다.
- 현재 시간을 기준으로 사진 제목을 생성합니다.
- 캡처할 뷰와 사진 제목을 인자로 captureReceipt 함수를 호출합니다.
- captureReceipt 함수에서 뷰를 캡처하고, Bitmap 형태로 변환합니다.
- 안드로이드 버전에 따라 저장소의 경로가 다르므로, 안드로이드 버전에 따라 다른 함수를 호출하여 이미지를 저장합니다.
private void makeTitle() {
SimpleDateFormat sdf = new SimpleDateFormat( "yyyyMMddHHmmss");
Date time = new Date();
String captureTitle = sdf.format(time); // 사진제목
captureView({layout}, captureTitle);
}
public void captureView(View view, String title) {
if(view==null){ //Null Point Exception ERROR 방지
System.out.println("::::ERROR:::: view == NULL");
return;
}
Bitmap bitmap = getBitmapFromView(view);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) saveToExStorageInHigherQ(title, bitmap);
else saveToExStorageInLowerQ(title, bitmap);
}
저장소에 이미지를 저장하기 위해서는 WRITE_EXTERNAL_STORAGE 권한이 필요합니다.
안드로이드 버전 10 (Q) 이상부터는 이 권한이 아닌 MANAGE_EXTERNAL_STORAGE 권한이 필요합니다.
따라서, 안드로이드 버전에 따라 저장소 권한을 체크해주어야 합니다.
2. Android 버전을 나누어 저장소에 캡처한 View를 저장합니다.
아래 코드는 안드로이드 Q 버전 이상에서 실행됩니다.
사진 캡처한 Bitmap 이미지를 외부 저장소에 저장합니다.
캡처한 사진의 제목을 나타내는 title과 캡처한 사진의 Bitmap 이미지를 인자로 받아, 사진을 외부 저장소에 저장합니다.
저장소에 저장하기 전, 저장소 경로와 사진 파일의 이름을 설정하며, 이미지 파일 쓰기 작업을 하고 있을 때 다른 곳에서 데이터 요청을 무시하도록 IS_PENDING 플래그를 설정합니다.
저장이 완료되면, IS_PENDING 플래그를 0으로 변경하고 저장된 Uri를 사용하여 저장된 이미지를 갱신합니다.
마지막으로, 이미지 저장이 완료되었다는 메시지를 사용자에게 알립니다.
@RequiresApi(api = Build.VERSION_CODES.Q)
private void saveToExStorageInHigherQ(String title, Bitmap bitmap) {
ContentResolver contentResolver = _context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, title);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/*");
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES+"/맛통");
contentValues.put(MediaStore.Images.Media.IS_PENDING, 1); // 파일을 write중이라면 다른곳에서 데이터요구를 무시하겠다는 의미
Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
try {
if (uri != null) {
ParcelFileDescriptor pdf = contentResolver.openFileDescriptor(uri, "w", null);
if (pdf != null) {
FileOutputStream fos = new FileOutputStream(pdf.getFileDescriptor());
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
contentValues.clear();
contentValues.put(MediaStore.Images.Media.IS_PENDING, 0);
contentResolver.update(uri, contentValues, null, null);
Utility.showToast(_context, "higherQ; test; 이미지 저장이 완료되었습니다;");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
아래 메소드는 안드로이드 버전이 10 이하인 기기에서 실행됩니다.
이전 버전의 안드로이드에서는 외부 저장소에 파일을 직접 쓰는 것이 허용되었습니다.
이 메소드에서는 저장할 파일의 경로를 먼저 생성한 다음, FileOutputStream 클래스를 사용하여 파일을 쓰고, 마지막으로 미디어 스캐너에 파일을 추가하여 갤러리에서 파일을 볼 수 있도록 합니다.
private void saveToExStorageInLowerQ(String title, Bitmap bitmap) {
File storage = Environment.getExternalStoragePublicDirectory("/Pictures/맛통/");
if (!storage.exists()) { // 만약 경로에 폴더가 없다면 폴더 생성
storage.mkdir();
}
String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Pictures/맛통/"; //저장 경로
try{
FileOutputStream fos = new FileOutputStream(path+title);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
_context.sendBroadcast(
new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.parse("file://" + Environment.getExternalStorageDirectory()+"/Pictures/맛통/" + title))
); // 개
Utility.showToast(_context, "lowerQ; test; 이미지 저장이 완료되었습니다;");
}catch (Exception e){
e.printStackTrace();
}
}
'Android > 튜토리얼 및 가이드' 카테고리의 다른 글
[Android/Training] 사진을 외부앱으로 전송하기 (0) | 2023.05.09 |
---|---|
[Android/SDK연동]친구(나)에게 카카오링크 메시지 보내기 (0) | 2021.05.14 |
[Android/SDK연동]SNS 로그인 구현(6) - 카카오톡 로그인 SDK V2 (0) | 2021.05.14 |
[Android/API]SNS 로그인 구현(5) - 네이버 JSON 파싱으로 계정 정보 얻어오기 (0) | 2021.05.14 |
[Android/SDK연동]SNS 로그인 구현(4) - 페이스북 (0) | 2021.05.12 |