투케이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 의미]
}

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

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

[결과 출력]

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

 

반응형
Comments