안드로이드 파일 입출력

조회수 2929회

안녕하세요,

안드로이드용 메모장 앱을 개발 하는 중, 사용자가 적어 놓은 내용을 파일형태로 export시키려고 합니다.

문제는 기기내 존재하는 폴더를 명시하든, 제가 폴더를 정의하든 그쪽으로 파일이 생성되지 않는 다는 점입니다. 한번 보시고 조언 좀 부탁드립니다.

우선, build.gradel(Module:app)은 하기와 같습니다.

defaultConfig { applicationId "com.first.project.password" minSdkVersion 14 targetSdkVersion 24 versionCode 3 versionName "1.0.2" }

제가 가동하고 있는 기기는 api 22 이하라서 manifest에 권한설정을 하기와 같이 명시한 채 진행하고 있습니다.

그리고 다른 class에서 하기 메서드를 호출하면 리턴값이 false가 나오고, 에러 메세지는 다음과 같이 뜨는데 도대체 어느 부분에서 문제가 있는건지 갈피를 못 잡겠습니다.. 일단, trythis.csv파일을 만들어 "abcd"라는 문자열을 넣어 getExternalStoragePublicDirectory의 Environment.DIRECTORY_DOWNLOADS에 만드는 것이 목표입니다.

"com.first.project E/com.first.project.DataExportImport: error : java.io.IOException: open failed: EACCES (Permission denied)"

public boolean getAlbumStorageDir() {
    try {
            String content= "trythis";
            String fpath = "/storage/emulated/0/myNewFolder/" + content + ".csv";
            File file = new File(fpath);
            // If file does not exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write("abcd");
            bw.close();

            Log.d("Suceess", "Sucess");
            return true;

        } catch (IOException e) {
            Log.e(TAG, "error : " + e.toString());
            return false;
        }
    }

이렇게도 해보고 저렇게도 해봤는데 파일 입출력이 안됩니다. 혹시 어느 부분이 문젝가 있는건지 조언 좀 부탁드립니다.

public void getAlbumStorageDir() {
  //1번 방법
        String content= "trythis.csv";
        File sdCard = Environment.getExternalStorageDirectory();
        File directory = new File(sdCard.getAbsolutePath() + content);

//2번 방법
    /*    File file = new File(Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_DOWNLOADS), content);*/


        FileOutputStream outputStream;

        try {
            outputStream = new FileOutputStream(directory);
            outputStream.write(content.getBytes());
            outputStream.close();
        } catch (IOException e) {
            Log.e(TAG, "error : " + e.toString() );
        }
    }
  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 버전 분기는 어렵지 않게 구현할 수 있습니다. 예를 들면 아래와 같이 만들 수 있을 것 같습니다. 간단한 예제니 참고만하세요.

    @TargetApi(Build.VERSION_CODES.M)
    public static boolean isPermissionGranted(Context context, String permission) {
        return Build.VERSION.SDK_INT < Build.VERSION_CODES.M
            || context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
    }
    

    사용하는 곳에서는

    if (isPermissionGranted(context, Manifest.permission.ACCESS_FINE_LOCATION) {
        // 권한을 획득한 경우, 기존 로직 처리
        ...
    } else {
        // 권한 요청 함수 호출
        ...
    
    }
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변 감사드립니다~! 덕분에 권한설정 부분 잘 마무리할 수 있을 것 같습니다! 알 수 없는 사용자 2016.8.18 15:33
  • targetSdkVersion >= 23일 경우, 런타임에 퍼미션을 획득해야 합니다. (올려주신 코드에서는 targetSdkVersion이 24로 설정되어 있어요) targetSdkVersion을 22로 낮추거나 런타임 퍼미션 관련된 처리를 해주세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변감사드립니다! targetSdkVersion을 24로 설정해서 출시했다면 다시 22로 낮추는 건 어렵다고 들었습니다. ㅠㅜ 23이상 되는 유저와 23 미만의 유저를 구분져서 퍼미션 처리를 따로 한다면 23미만의 유저는 manifest에 등록된 퍼미션 요청에 따라 자동처리가 될 것 같고 23이상되는 유저에게는 ContextCompat.checkSelfPermission() 메서드를 요청해서 퍼미션 처리를 해줘야 할 것 같은데 궁금한 점은 알 수 없는 사용자 2016.8.12 16:41
    • 답변감사드립니다! targetSdkVersion을 24로 설정해서 출시했다면 다시 22로 낮추는 건 어렵다고 들었습니다. ㅠㅜ 23이상 되는 유저와 23 미만의 유저를 구분져서 퍼미션 처리를 따로 한다면 23미만의 유저는 manifest에 등록된 퍼미션 요청에 따라 자동처리가 될 것 같고 23이상되는 유저에게는 ContextCompat.checkSelfPermission() 메서드를 요청해서 퍼미션 처리를 별도로 해줘야 할 것 같은데 유저의 기기에 따라 코드처리를 다르게 하려면 어떤 수식을 넣어줘야 하나요?? 알 수 없는 사용자 2016.8.12 16:45
    • 답변감사드립니다! targetSdkVersion을 24로 설정해서 출시했다면 다시 22로 낮추는 건 어렵다고 들었습니다. ㅠㅜ 23이상 되는 유저와 23 미만의 유저를 구분져서 퍼미션 처리를 따로 한다면 23미만의 유저는 manifest에 등록된 퍼미션 요청에 따라 자동처리가 될 것 같고 23이상되는 유저에게는 ContextCompat.checkSelfPermission() 메서드를 요청해서 퍼미션 처리를 별도로 해줘야 할 것 같은데 유저의 기기에 따라 코드처리를 다르게 하려면 어떤 수식을 넣어줘야 하나요?? 알 수 없는 사용자 2016.8.12 16:48

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)