본문 바로가기
Study/Android

Android 파일 공유(FileUriExposedException )

by Answer Choi 2017. 12. 6.
반응형

안드로이드 N(7) 이후부터는 카메라로 촬영한 사진을 파일로 저장하려고 아래의 코드를 쓰게되면


FileUriExposedException 이 발생합니다.


1
2
3
4
intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
photoUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/image/temp.jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, camera);
cs



그 이유는 보안이 더 강화되면서 임시 액서스 권한을 부여해야 되기 때문입니다.



권한을 부여하는 방법


P.S Android Developers FileProvider를 방문 하시면 더 자세한 내용을 보실 수 있습니다.


1. res/xml/provider_paths.xml 파일 생성



위 그림과 같이 res/폴더밑에 xml폴더를 만들고, 그안에 provider_paths.xml 파일을 생성합니다.


내용은 아래와 같이 입력합니다.


1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="images" path="."/>
</paths>
cs


2. manifests 에 provider추가


1
2
3
4
5
6
7
8
9
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths" />
</provider>
cs


위의 provider를 <application> 태그 사이에 넣어줍니다.


Line 8은 위에서 입력한 provider xml 경로입니다.


3. Java coded


Java code는 비슷하지만 Uri.fromFile 대신 FileProvider.getUriForFile을 사용합니다.


1
2
3
4
intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
photoUri = FileProvider.getUriForFile(this,BuildConfig.APPLICATION_ID + ".provider"new File(Environment.getExternalStorageDirectory()+"/image/temp.jpg"));
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, camera);
cs


이제 에러없이 파일이 생성 되고 카메라가 작동하는걸 보실 수 있습니다.

반응형

인기글