반응형
안드로이드 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 |
이제 에러없이 파일이 생성 되고 카메라가 작동하는걸 보실 수 있습니다.
반응형
'Study > Android' 카테고리의 다른 글
AP(Wifi)검색 및 특정 AP(WiFi)에 접속하는 방법 (0) | 2018.02.09 |
---|---|
Casting 'findViewById is redundant (0) | 2017.12.06 |
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. (0) | 2017.09.14 |
Firebase 인증 1-Facebook 인증 (0) | 2017.09.07 |
android Permission 거부시 다시 묻기 (0) | 2017.09.01 |