SPRING :: NOTE

[ANDROID] OS13부터 적용되는 File 입출력 적용하기 본문

Development Language/JAVA · ANDROID

[ANDROID] OS13부터 적용되는 File 입출력 적용하기

RAYZIE 2023. 5. 11. 17:00
반응형

안드로이드 33부터 내장 파일 아무거나 접근을 못한다.

아 짜증난다.

파일 읽어오는 부분들을 전부 수정해줘야한다.

유예기간을 많이 주긴 했지만, 진짜 너무 귀찮다.

다음과 같이 구성하면 xml파일을 생성하여 내 앱 절대경로에 파일을 생성할 수 있다.


안드로이드에서 파일을 생성하고, 그 파일을 다른 앱에서 읽을 수 있도록 하는 과정을 살펴보면서 오류를 해결할 수 있습니다.

1. 파일을 생성할 경로 설정하기
우선 파일을 생성할 경로를 설정해야 합니다. 여기서는 getFilesDir()을 사용하여 내부 저장소의 DB_FILES 폴더에 example.xml 파일을 생성하도록 설정했습니다.

// 파일을 쓸 디렉토리 생성
File dirPath = new File(getFilesDir(), "DB_FILES");
if (!dirPath.exists()) {
    dirPath.mkdirs();
}

// 파일을 쓸 경로를 설정합니다.
File xmlFile = new File(dirPath, "example.xml");

2.XML 파일 생성하기
다음으로 XML 파일을 생성합니다. 여기서는 XmlSerializer 클래스를 사용하여 XML을 생성합니다.

// XML 파일을 생성합니다.
XmlSerializer xmlSerializer = Xml.newSerializer();
StringWriter writer = new StringWriter();
try {
    xmlSerializer.setOutput(writer);
    xmlSerializer.startDocument("UTF-8", true);
    xmlSerializer.startTag("", "example");
    xmlSerializer.startTag("", "message");
    xmlSerializer.text("Hello, world!");
    xmlSerializer.endTag("", "message");
    xmlSerializer.endTag("", "example");
    xmlSerializer.endDocument();
} catch (IOException e) {
    e.printStackTrace();
}

3.파일에 XML 쓰기
XML 파일을 생성한 후, 해당 파일에 XML을 씁니다. 이때 openFileOutput() 메서드를 사용하여 파일에 대한 FileOutputStream 객체를 얻어옵니다. 그리고 outputStream.write() 메서드를 사용하여 XML을 파일에 씁니다.

// 생성한 XML 파일을 쓰기 위해 OutputStream을 열어줍니다.
FileOutputStream outputStream;
try {
    outputStream = openFileOutput("DB_FILES/example.xml", Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
    e.printStackTrace();
    return;
}

// OutputStream에 XML을 씁니다.
try {
    outputStream.write(writer.toString().getBytes());
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

4.파일 URI 생성하기
파일을 생성하고 XML을 쓴 후, 다른 앱에서 해당 파일에 접근할 수 있도록 URI를 생성합니다. 이때 FileProvider.getUriForFile() 메서드를 사용하여 파일에 대한 URI를 생성합니다. getUriForFile() 메서드의 첫 번째 매개변수로는 현재 Context를 전달하고, 두 번째 매개변수로는 File 객체를 전달합니다. 세 번째 매개변수로는 FileProvider의 authorities를 전달합니다.

// 파일 프로바이더를 이용하여 파일에 대한 Uri를 생성합니다.
Uri xmlUri = FileProvider.getUriForFile(this, "com.example.app.fileprovider", xmlFile);
반응형
Comments