안드로이드 스튜디오를 통해 어플을 만들다보면, 파일을 저장하기 위한 수단으로 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 |