Notice
Recent Posts
Recent Comments
Link
투케이2K
146. (AndroidStudio/android/java) Scoped Storage 사용해 텍스트 파일 저장 및 호출 - ContentResolver , MediaStore 본문
Android
146. (AndroidStudio/android/java) Scoped Storage 사용해 텍스트 파일 저장 및 호출 - ContentResolver , MediaStore
투케이2K 2021. 5. 14. 14:25/* =========================== */
[ 개발 환경 설정 ]
개발 툴 : AndroidStudio
개발 언어 : java
/* =========================== */
/* =========================== */
[소스 코드]
//TODO [사전 퍼미션 요청 필요함]
<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 [파일 경로 설명]
//콘텐츠 파일 경로 (파일 삭제) : content://media/external/file/37352
//절대 파일 경로 (파일 불러오기) : /storage/emulated/0/Download/TX20210513213131.txt
//TODO [텍스트 파일 저장 실시]
saveFile(getNowTime24(), "HelloTextFile");
//TODO [텍스트 파일 불러오기 : 절대 경로 사용]
readFile(S_Preference.getString(getApplication(), "saveScopeAbsoluteTxt"));
//TODO [MediaStore 파일 저장 실시]
private void saveFile(String fileName, String fileData) {
String deleteCheck = S_Preference.getString(getApplication(), "saveScopeContentTxt");
if(deleteCheck != null && deleteCheck.length() > 0){ //TODO 이전에 저장된 파일이 있을 경우 지운다
try {
ContentResolver contentResolver = getContentResolver();
contentResolver.delete(
Uri.parse(S_Preference.getString(getApplication(), "saveScopeContentTxt")),
null,
null);
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"[A_ScopeTxt > saveFile() 메소드 : 이전에 저장된 파일 삭제 실시]");
Log.d("","\n"+"[콘텐츠 파일 경로 : "+String.valueOf(deleteCheck)+"]");
Log.d("","\n"+"[절대 파일 경로 : "+S_Preference.getString(getApplication(), "saveScopeAbsoluteTxt")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
}
catch (Exception e){
e.printStackTrace();
}
}
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_ScopeTxt > saveFile() 메소드 : MediaStore 파일 저장 실시]");
Log.d("","\n"+"[파일 이름 : "+String.valueOf(fileName)+"]");
Log.d("","\n"+"[파일 데이터 : "+String.valueOf(fileData)+"]");
Log.d("//===========//","================================================");
Log.d("---","---");
//TODO [저장하려는 파일 타입, 이름 지정]
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName+".txt");
values.put(MediaStore.MediaColumns.MIME_TYPE, "plain/text");
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
ContentResolver contentResolver = getContentResolver();
Uri item = contentResolver.insert(MediaStore.Files.getContentUri("external"), values);
try {
//TODO [쓰기 모드 지정]
ParcelFileDescriptor pdf = contentResolver.openFileDescriptor(item, "w", null);
if (pdf == null) {
Log.d("---","---");
Log.e("//===========//","================================================");
Log.d("","\n"+"[A_ScopeTxt > saveFile() 메소드 : MediaStore 파일 저장 실패]");
Log.d("","\n"+"[원인 : "+String.valueOf("ParcelFileDescriptor 객체 null")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
} else {
//TODO [텍스트 파일 쓰기 실시]
byte[] strToByte = fileData.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);
}
//TODO [경로 저장 실시]
//[콘텐츠 : 텍스트 경로 저장]
S_Preference.setString(getApplication(), "saveScopeContentTxt", 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(), "saveScopeAbsoluteTxt", absolutePath);
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("","\n"+"[A_ScopeTxt > saveFile() 메소드 : MediaStore 파일 저장 성공]");
Log.d("","\n"+"[콘텐츠 파일 경로 : "+S_Preference.getString(getApplication(), "saveScopeContentTxt")+"]");
Log.d("","\n"+"[절대 파일 경로 : "+S_Preference.getString(getApplication(), "saveScopeAbsoluteTxt")+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
//TODO [다시 텍스트 파일 불러오기 실시]
readFile(S_Preference.getString(getApplication(), "saveScopeAbsoluteTxt"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
//TODO [MediaStore 파일 불러오기 실시]
private void readFile(String path) {
Log.d("---","---");
Log.d("//===========//","================================================");
Log.d("","\n"+"[A_ScopeTxt > readFile() 메소드 : MediaStore 파일 불러오기 실시]");
Log.d("","\n"+"[절대 파일 경로 : "+String.valueOf(path)+"]");
Log.d("//===========//","================================================");
Log.d("---","---");
Uri externalUri = MediaStore.Files.getContentUri("external");
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_ScopeTxt > readFile() 메소드 : MediaStore 파일 불러오기 실패]");
Log.d("","\n"+"[원인 : "+String.valueOf("Cursor 객체 null")+"]");
Log.e("//===========//","================================================");
Log.d("---","---");
return;
}
//TODO [텍스트 파일 불러오기 실시]
String absoluteUrl = path;
String line = ""; //TODO [한줄씩 읽기]
try {
BufferedReader buf = new BufferedReader(new FileReader(absoluteUrl));
while((line=buf.readLine())!=null){
Log.d("---","---");
Log.w("//===========//","================================================");
Log.d("","\n"+"[A_ScopeTxt > readFile() 메소드 : MediaStore 파일 불러오기 성공]");
Log.d("","\n"+"[절대 파일 경로 : "+String.valueOf(absoluteUrl)+"]");
Log.d("","\n"+"[절대 파일 내용 : "+String.valueOf(line)+"]");
Log.w("//===========//","================================================");
Log.d("---","---");
//TODO [UI 동작]
save_content_edit.setText("");
save_content_edit.append(line);
save_content_edit.append("\n");
}
buf.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//TODO [현재 시간 알아오는 메소드]
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 "TX"+str; //TODO [TX는 text 의미]
}
/* =========================== */
/* =========================== */
[결과 출력]
/* =========================== */
반응형
'Android' 카테고리의 다른 글
Comments