마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

마시멜로 파일입출력 권한에 대해서 질문합니다.

0 추천

안녕하세요.

마시멜로를 지원하기 위해서 권한획득을 하려 했습니다.

private void checkPermission()
    {
        if(Build.VERSION.SDK_INT >= 23)
        {
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
                    ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
            {
                if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE))
                {
                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQUEST_CODE_APP_PERMISSION_STORAGE);
                }
                else
                {
                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, Constant.REQUEST_CODE_APP_PERMISSION_STORAGE);
                }
            }
            else
            {
                defaultFolderCheck();
                curFolderFiles();
                permissionChecker = true;
            }
        }
        else
        {
            defaultFolderCheck();
            curFolderFiles();
            permissionChecker = true;
        }
    }

권한획득은 잘 됩니다.

 

그런데 문제는 권한획득 후에 "어플 재시작"을 한번 해야 권한이 적용됩니다.

 

    private void curFolderFiles()
    {
        if(permissionChecker)
        {
            File file = new File(curFolderURL);
            File files[] = file.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(Constant.FILE_EXTENSION);
                }
            });

            curFolderFileList.clear();
            if(files != null)
                for(int i = 0; i < files.length; i++)
                    curFolderFileList.add(new TextFile(files[i], getResources().getString(R.string.file_noname), new SimpleDateFormat(getResources().getString(R.string.file_dateformat))));

            curFileAdapter = new TextFileAdaptor(this, curFolderFileList);
            curFolderGridView.setAdapter(curFileAdapter);
            curFolderGridView.setOnItemClickListener(clickListener);
            curFolderGridView.setOnItemLongClickListener(longClickListener);
        }
    }

왜 안되나 싶어서 여기저기 Log를 걸어서 확인해보니

File file = new File(curFolderURL); 에서 "이게 파일이고 폴더이다"까지는 작동을 하는데

이 file의 fileList에 접근이 안됩니다.

 

그런데 어플을 재부팅하면 또 이게 먹힙니다.

 

왜그럴까요..ㅠㅠ

 

 

자문 자답입니다.

제가 AVD를 이용한 테스트가 아니라 일반폰으로 하다보니 특정환경에서 오류가 난듯합니다.

포팅된 CM13에서 오류가 났는데, 다른 사람이 포팅한 다른 CM13을 사용하니 잘됩니다.

결국은 롬의 문제인듯 싶습니다.

Esk (120 포인트) 님이 2017년 2월 22일 질문
Esk님이 2017년 2월 22일 수정

3개의 답변

0 추천
쎄미 (162,410 포인트) 님이 2017년 2월 22일 답변
이거도 해봤는데 재부팅해야 됩니다ㅠㅠ
관련 코드를 더 올려보세요. 안될리가 없는데...
결국은 해결했는데 말이죠... OS문제인듯 합니다.

제가 AVD를 이용한 테스트가 아니라 일반폰으로 하다보니 특정환경에서 오류가 난듯합니다.

포팅된 CM13에서 오류가 났는데, 다른 사람이 포팅한 다른 CM13을 사용하니 잘됩니다.

결국은 롬의 문제인듯 싶습니다.

MIUI에서도 비슷한 문제를 겪은바가 있어서...
0 추천
https://developer.android.com/training/permissions/requesting.html?hl=ko

권한 획득을 잘못하고 계신거 같은데요

권한 획득 응답이 오는 곳에서 뭔가를 처리해주셔야 할꺼 같은데(onRequestPermissionsResult)

한곳에서 다 하려고 하시는건 아닌지요
페어리 (12,270 포인트) 님이 2017년 2월 22일 답변
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestCode == Constant.REQUEST_CODE_APP_PERMISSION_STORAGE)
        {
            if(grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                    grantResults[1] == PackageManager.PERMISSION_GRANTED)
            {
                permissionChecker = true;
                defaultFolderCheck();
                curFolderFiles();
                Log.i("Debug", "Permission Allowed");
            }
            else
            {
                Log.i("Debug", "Permission Denied");
            }
        }
    }

이렇게 처리를 해주는데 확실히 권한은 획득이 되는데 그 권한 적용이 재부팅해야만 됩니다 ㅠㅠ

뭔가 제가 잘못하고 있는것같긴한데 말이죠..
0 추천
질문자님 혹시 compileSdkVersion 이랑 buildToolVersion 좀 알수 있을까요??
Development Guy (70,570 포인트) 님이 2017년 2월 22일 답변
컴파일하는 sdk는 25구요
빌드툴은 25.0.2 입니다.
sdk 버전 문제는 아닌거 같네요. sdk 버전이 낮으면 발생할 수 있는 버그가 있어서 물어봤습니다.
일단 답변주셔서 감사합니다만 버그를 잡았습니다.

cm13(안드로이드 6) 에서 안드로이드 7.1로 넘어가니 잘 되더라구요.
그래서 혹시나 해서 다른사람이 포팅한 cm13으로 다시 넘어가니 또 잘됩니다....

롬이 잘못된건지... 아니면 그냥 오류였는지....
...