Android에서 이동식 미디어의 DCIM 디렉토리에 대한 쓰기 액세스 권한을 얻는 방법은 무엇입니까?

어둡게

내 코드는 다음과 같습니다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        writeFile();
    }



    public void writeFile()  {

        File removableRoot = RootsUtil.getRemovableRoots(this)[0];
        File DCIMDirectory = new File(removableRoot, "DCIM");
        File cameraDirectory = new File(DCIMDirectory, "Camera");

        if( cameraDirectory.exists() ) {
            try {
                String filename = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(new Date()) + ".txt";


                //cameraDirectory.mkdirs();
                File file = new File(cameraDirectory, filename);
                FileWriter writer = null;

                writer = new FileWriter(file);
                PrintWriter printWriter = new PrintWriter(writer);
                printWriter.println("Hello World");

                printWriter.close();
                writer.close();

                System.out.println("Number of files: " + cameraDirectory.listFiles().length);

            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

cameraDirectory/storage/9C33-6BBD/DCIM/Cameraif 이전과 같고 존재합니다. Camera응용 프로그램 파일을 저장하는 입니다.

이 디렉토리에도 파일을 쓰려고하는데 다음 예외로 인해 실패합니다.

java.io.FileNotFoundException: /storage/9C33-6BBD/DCIM/Camera/20170204_192001.txt: open failed: EACCES (Permission denied)
    at libcore.io.IoBridge.open(IoBridge.java:452)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
    at java.io.FileWriter.<init>(FileWriter.java:42)
    at com.inthemoon.trycamerawrite.MainActivity.writeFile(MainActivity.java:48)
    at com.inthemoon.trycamerawrite.MainActivity.onCreate(MainActivity.java:28)
    at android.app.Activity.performCreate(Activity.java:6876)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3207)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3350)
    at android.app.ActivityThread.access$1100(ActivityThread.java:222)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1795)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7229)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
    at libcore.io.Posix.open(Native Method)
    at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
    at libcore.io.IoBridge.open(IoBridge.java:438)
    ... 17 more

분명히이 디렉토리에 쓸 권한이 없습니다. 이 허가를 얻는 방법은 무엇입니까?

최신 정보

다음과 같은 방법으로 코드를 수정했습니다.

private static final int RQS_OPEN_DOCUMENT_TREE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE, Uri.fromFile(cameraDirectory));
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        startActivityForResult(intent, RQS_OPEN_DOCUMENT_TREE);

        //writeFile();
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        writeFile();
    }

사용자가 수동으로 선택하도록 허용하면 DCIM/Camera도움이되지 않습니다.

CommonsWare

이동식 저장소의 파일 시스템에 직접 쓰려고합니다. 앱에 고유 한 일부 디렉터리 (예 :에서 반환 한 디렉터리)를 제외하고는 작동하지 않습니다 getExternalFilesDirs().

사용 ACTION_OPEN_DOCUMENT_TREE한다고해서 마술처럼 파일 시스템 액세스 권한이 부여되는 것은 아닙니다. 무엇을 수행 할 일하는 것은 당신에게있다 Uri당신이와 함께, 사용할 수있는 ContentResolver, DocumentFile그 기반으로 문서 및 컬렉션으로 작업에, 그리고 친척 Uri.

ACTION_OPEN_DOCUMENT_TREE문서에서 다루는 스토리지 액세스 프레임 워크의 일부입니다 .

또한 Android 7.0 이상 은 사용자가 이동식 저장소 와 같은 항목 대한 액세스 권한을 부여 할 수있는 더 간단한 방법을 제공하는 범위가 지정된 디렉토리 액세스 를 제공합니다 DCIM/. 그러나, 너무 당신을 제공합니다 Uri, 당신은 여전히 사용할 것 ContentResolver, DocumentFile등이에 따라 콘텐츠와 컬렉션과 함께 작업에에 Uri.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관