안녕하세요 초이입니다.
안드로이드 Q의 Scoped Storage가 발표되면서
외부저장소의 공용 공간에 파일을 쓰거나 읽기를 원하면 MediaStore를 사용하라고 명시가 되버렸습니다.
그 기념으로 사용예제만 글로 작성하려고 합니다~
그리고 읽어주시기전에
저는 Target API version을 29(Q)로 맞춰놓고 작성하였습니다.
- 이미지 파일 저장
private void saveFile() {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "image_1024.JPG");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
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 {
ParcelFileDescriptor pdf = contentResolver.openFileDescriptor(item, "w", null);
if (pdf == null) {
Log.d("asdf", "null");
} else {
String str = "heloo";
byte[] strToByte = str.getBytes();
FileOutputStream fos = new FileOutputStream(pdf.getFileDescriptor());
fos.write(strToByte);
fos.close();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.clear();
values.put(MediaStore.Images.Media.IS_PENDING, 0);
contentResolver.update(item, values, null, null);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
제가 FileOutputStream으로 텍스트를 저장하기 했지만 저 부분만 응용하셔서 이미지를 저장하시면 됩니다.
- 비디오 파일 저장
private void saveFile() {
ContentValues values = new ContentValues();
values.put(MediaStore.Video.Media.DISPLAY_NAME, "video_1024.mpeg");
values.put(MediaStore.Video.Media.MIME_TYPE, "video/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.put(MediaStore.Video.Media.IS_PENDING, 1);
}
ContentResolver contentResolver = getContentResolver();
Uri item = contentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
try {
ParcelFileDescriptor pdf = contentResolver.openFileDescriptor(item, "w", null);
if (pdf == null) {
Log.d("asdf", "null");
} else {
String str = "heloo";
byte[] strToByte = str.getBytes();
FileOutputStream fos = new FileOutputStream(pdf.getFileDescriptor());
fos.write(strToByte);
fos.close();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.clear();
values.put(MediaStore.Video.Media.IS_PENDING, 0);
contentResolver.update(item, values, null, null);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
- 오디오 파일 저장
private void saveFile() {
ContentValues values = new ContentValues();
values.put(MediaStore.Audio.Media.DISPLAY_NAME, "video_1024.mp3");
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/*");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.put(MediaStore.Audio.Media.IS_PENDING, 1);
}
ContentResolver contentResolver = getContentResolver();
Uri item = contentResolver.insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
try {
ParcelFileDescriptor pdf = contentResolver.openFileDescriptor(item, "w", null);
if (pdf == null) {
Log.d("asdf", "null");
} else {
String str = "heloo";
byte[] strToByte = str.getBytes();
FileOutputStream fos = new FileOutputStream(pdf.getFileDescriptor());
fos.write(strToByte);
fos.close();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
values.clear();
values.put(MediaStore.Audio.Media.IS_PENDING, 0);
contentResolver.update(item, values, null, null);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
세개의 코드가 별반 차이가 없을겁니다
다음 게시물에서는 MediaStore에서 읽어오는 것을 포스팅 하겠습니다.
항상 읽어주셔서 감사합니다.
[안드로이드] AndroidManifest.xml (0) | 2019.10.05 |
---|---|
[안드로이드] MediaStore 파일 읽기 (1) | 2019.07.16 |
[안드로이드] ContentValues Mime Type (0) | 2019.07.16 |
(안드로이드) Socket.io를 활용한 웹 소켓 서버, 클라이언트 구축 (0) | 2019.05.23 |
(안드로이드) 내부저장소 접근하기 (8) | 2019.03.28 |