내 코드는 다음과 같습니다.
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/Camera
if 이전과 같고 존재합니다. 내 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
도움이되지 않습니다.
이동식 저장소의 파일 시스템에 직접 쓰려고합니다. 앱에 고유 한 일부 디렉터리 (예 :에서 반환 한 디렉터리)를 제외하고는 작동하지 않습니다 getExternalFilesDirs()
.
사용 ACTION_OPEN_DOCUMENT_TREE
한다고해서 마술처럼 파일 시스템 액세스 권한이 부여되는 것은 아닙니다. 무엇을 수행 할 일하는 것은 당신에게있다 Uri
당신이와 함께, 사용할 수있는 ContentResolver
, DocumentFile
그 기반으로 문서 및 컬렉션으로 작업에, 그리고 친척 Uri
.
ACTION_OPEN_DOCUMENT_TREE
문서에서 다루는 스토리지 액세스 프레임 워크의 일부입니다 .
또한 Android 7.0 이상 은 사용자가 이동식 저장소 와 같은 항목 에 대한 액세스 권한을 부여 할 수있는 더 간단한 방법을 제공하는 범위가 지정된 디렉토리 액세스 를 제공합니다 DCIM/
. 그러나, 너무 당신을 제공합니다 Uri
, 당신은 여전히 사용할 것 ContentResolver
, DocumentFile
등이에 따라 콘텐츠와 컬렉션과 함께 작업에에 Uri
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다