SPRING :: NOTE
[ANDROID] OS13부터 적용되는 File 입출력 적용하기 본문
안드로이드 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);
'Development Language > JAVA · ANDROID' 카테고리의 다른 글
[붕괴:스타레일] '봉쇄 섹터 II' 그래피티 위치 (0) | 2023.06.08 |
---|---|
[ANDROID] LLH Degree를 ECEF 좌표료 변환 (0) | 2023.05.24 |
[JAVA] ArrayList 중간배열 삭제하고 나머지 데이터 시프트 (Shift) 시키기 (0) | 2023.04.28 |
[JAVA] ArrayList에서 값이 들어있는 만큼 개수 세기 (0) | 2023.04.27 |
[ANDROID] 'android.useAndroidX' 관련 에러 (0) | 2022.11.22 |