본문 바로가기

Android

Android 파일 입출력 및 권한 요청

안드로이드 스튜디오를 통해 어플을 만들다보면, 파일을 저장하기 위한 수단으로 FILE I/O, FireBase 등 여러 가지 방법을 생각하게 되는데, 개중에서 가장 쉽고 편한 방법은 파일 입출력이다.

 

파일 입출력에 관하여 짧게 포스팅하겠다.

 

아래는 파일을 저장하는 saveFile()과 loadFile()의 content이다.

private void saveFile(){
    Log.d("File", "saving");
    File saveFile = null;
    if( Build.VERSION.SDK_INT < 29) saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/lolSaveFiles");
    else saveFile = MainActivity.this.getExternalFilesDir("/lolSaveFiles");

    if(!saveFile.exists())
        saveFile.mkdir();
    try {
        BufferedWriter buf = new BufferedWriter(new FileWriter(saveFile+"/savedSummonerIDList.txt", false));
        for(int i=0;i<infos.size();i++){
            buf.append(infos.get(i).getSummoner().getAccountId()+"");
            buf.newLine();
        }
        buf.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void loadFile(){
    Log.d("File", "loading");
    String readLine = null;
    File saveFile = null;

    if( Build.VERSION.SDK_INT < 29) saveFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/lolSaveFiles");
    else saveFile = MainActivity.this.getExternalFilesDir("/lolSaveFiles");
    if(saveFile == null)
        saveFile.mkdir();
    try {
        BufferedReader buf = new BufferedReader(new FileReader(saveFile+"/savedSummonerIDList.txt"));
        while ((readLine = buf.readLine()) != null) {
            new LoadSummonerTask().execute(readLine);
        }
        buf.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

내가 만들고 있는 롤 전적 검색 어플의 파일 저장 시스템인데, recyclerView에 추가한 플레이어 목록들에서 for문을 통해 각 플레이어들의 ID값을 newLine()으로 구분하여 저장하고, 다시 불러올 때도 readBuffer를 통해 불러와서 작업을 실행한다.

 

내용의 AsyncTask 클래스 함수에 대해선 이후에 포스팅하겠다.

 

loadFile()은 첫 액티비티의 onCreate()에서, saveFile()은 onDestroy()에서 실행하도록 넣어주었다.

 

불러오기를 앱 시작할 때, 저장을 종료할 때 하도록 한 것.

 

하지만 저대로 하면 오류가 걸리거나 실행되지 않을 텐데, 이유는 권한 때문이다.

 

안드로이드 스튜디오의 app > manifests > AndroidManifest.xml에서

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

를 <manifest></manifest> 바로 내부에 추가해준다.

 

이것으로 끝난 것은 아니고, 한가지 더 해주어야 한다.

 

OS가 오레오 버전 이상인 안드로이드 기기에 대해서는 권한 요청을 인앱에서 직접 해줘야 하므로, 코드를 추가해준다.

public void checkPermission(){
    if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
}

원래 여러가지 속성들을 더 추가할 수 있는데, (권한을 요청해야 하는 이유 설명 등) 귀찮아서 바로 권한 요청하는 창을 띄우게 해주었다. 이 checkPermission()을 onCreate()함수의 loadFile() 앞에 놔두면 된다.

 

이렇게 설정이 끝나면 권한 요청이 뜨며, 수락 시 입출력이 잘 되는 것을 볼 수 있다.

'Android' 카테고리의 다른 글

Android RecyclerView 스와이프하여 항목 삭제  (0) 2019.07.14
Android AsyncTask 사용법  (0) 2019.07.14
Android CardView 사용법  (0) 2019.07.13
Android Studio 폰트 설정  (0) 2019.07.13
Android Alert Dialog 사용법  (0) 2019.07.13