[Android] Android export file in internal storage (안드로이드 내부 저장소의 데이터 출력, fileprovider)

export file in internal storage (내부 저장소의 데이터 출력, fileprovider)




안드로이드에서는 보안을 위해서 데이터를 내부에 저장하는 것이 가장 안전한 방법이다.

안드로이드의 데이터 저장위치에 대한 내용을 검색해 보면 크게

내부저장소, 외부저장소 (공유영역, 어플고유영역)으로 나뉘어 진다.

내부저장소는 어플 자체에서만 접근 가능하며, 사용자도 접근하지 못한다.

외부저장소의 공유영역은 모든 어플에서 접근 가능하며, 어플을 삭제해도 데이터가 남는 영역이다.

외부저장소의 고유영역은 모든 어플에서 접근 가능하지만, 어플을 삭제할때 데이터도 같이 삭제되는 영역이다.

이러한 각 데이터 저장 영역에 대해서는 많은 포스팅이 있으니 참고하자.

http://jinyongjeong.github.io/2018/09/30/android_path/

http://ismydream.tistory.com/124

http://bitsoul.tistory.com/117

https://developer88.tistory.com/28

만약 보안을 위해서 내부영역에 데이터를 저장했는데 이메일을 통해서 데이터를 출력하고 싶다면 어떻게 해야할까.

가장 쉽게 생각할 수 있는것이 외부영역으로 데이터를 복사한 후에 데이터를 출력하고 삭제하는 방법이다.

하지만 이럴때 사용할 수 있는 것이 fileprovider이다.

fileprovider는 내부 영역에 특정 파일을 외부 어플에서 접근 가능하도록 제공해 주는 역할을 하며

특정 파일을 지정해서 공유할 수 있기 때문에 안전하다.

fileprovider를 사용하기 위해서는 다음과 같은 절차가 필요하다.

1. Manifest 설정

AndroidManifest.xmlapplication 안쪽에 선언

<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_path" />
</provider>

2. provider의 경로 설정

res/xml/file_path.xml 을 생성하고 다음을 입력

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <files-path path="/" name="default" />
    </paths>
</paths>

경로가 xml 폴더가 아닐경우 오류가 난다

3. Email을 통해 데이터 출력

File file = new File(activity.getFilesDir(), "/exported_data.zip");
Uri uri = FileProvider.getUriForFile(context, activity.getPackageName()+".fileprovider", file);
Intent i = new Intent(Intent.ACTION_SEND);
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_SUBJECT, "Gaitspeedometer data");
i.putExtra(Intent.EXTRA_STREAM, uri);

try {
    startActivity(Intent.createChooser(i, "Send file..."));
} catch (Exception e) {
    Toast.makeText(activity, "No activity found for export", Toast.LENGTH_SHORT).show();
}

위와 같이 코드를 실행하면 내부 영역에 있는 exported_data.zip파일이 이메일에 첨부되고 출력할 수 있게 된다.