반응형

Q OS 부터는 Scoped storage를 이용해야한다. (getExternalStorage같은 것들이 이용되지 않는다.)

 

이때 중요한건 해당 txt 파일이 강제로 집어넣은 txt파일이 아닌 ContentResolver로 저장된 파일들에 대해 탐색이 된다.

package com.example.myapplication;

import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.webkit.MimeTypeMap;

import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Uri uri = MediaStore.Files.getContentUri("external");
                String[] projection = {
                        MediaStore.Files.FileColumns._ID,
                        MediaStore.Files.FileColumns.DISPLAY_NAME,
                        MediaStore.Files.FileColumns.DATA
                };
                String selection = MediaStore.Files.FileColumns.MIME_TYPE + "=?";
                String[] selectionArgs = new String[] {
                        MimeTypeMap.getSingleton().getMimeTypeFromExtension("txt")
                };

                try (Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null)) {
                    // 여러개 파일을 동시에 다읽고 싶다면 아래 코드에서 처리
                    /*
                        if (cursor != null && cursor.moveToFirst()) {
                            do {
                                int columnCount = cursor.getColumnCount();
                                System.out.println("KKw columnCount :: " + columnCount);
                                for (int i =0 ;i < columnCount; i++) {
                                    System.out.println("KKw columnName :: " + cursor.getString(i));
                                }
                            } while(cursor.moveToNext());
                        }
                    */
                    // 하나의 파일만 읽고 싶을때는 아래 코드에서 처리
                    if (cursor != null) {
                        cursor.moveToFirst();
                        int idColumn = cursor.getColumnIndex(MediaStore.Files.FileColumns._ID);
                        long id = cursor.getLong(idColumn);

                        Uri contentUri = Uri.withAppendedPath(
                                MediaStore.Files.getContentUri("external"),
                                String.valueOf(id));
                        System.out.println("Content Uri : " + contentUri);
                        System.out.println("Content Uri toString :" + contentUri.toString());
                        System.out.println("Content Uri getPath :" + contentUri.getPath());

                        String realUri = uri + File.separator + cursor.getString(0);

                        StringBuilder stringBuffer = new StringBuilder();
                        InputStream inputStream = getContentResolver().openInputStream(Uri.parse(realUri));

                        if(inputStream == null){
                            return;
                        }
                        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                        String line;
                        while ((line = reader.readLine()) != null) {
                            stringBuffer.append(line).append("\n");
                        }
                        System.out.println("Text read :: " + stringBuffer.toString());
                    } else {
                        System.out.println("Cursor is null");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
반응형