Android 파일 시스템에 새로운 기능이 추가 된 후 문제를 해결하려고하는데이 오류가 발생합니다.
android.os.FileUriExposedException: file:///storage/emulated/0/MyApp/Camera_20180105_172234.jpg exposed beyond app through ClipData.Item.getUri()
그래서 누군가가 이것을 고칠 수 있기를 바랍니다. 🙂
감사
private Uri getTempUri() {
// Create an image file name
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String dt = sdf.format(new Date());
imageFile = null;
imageFile = new File(Environment.getExternalStorageDirectory()
+ "/MyApp/", "Camera_" + dt + ".jpg");
AppLog.Log(
TAG,
"New Camera Image Path:- "
+ Environment.getExternalStorageDirectory()
+ "/MyApp/" + "Camera_" + dt + ".jpg");
File file = new File(Environment.getExternalStorageDirectory() + "/MyApp");
if (!file.exists()) {
file.mkdir();
}
imagePath = Environment.getExternalStorageDirectory() + "/MyApp/"
+ "Camera_" + dt + ".jpg";
imageUri = Uri.fromFile(imageFile);
return imageUri;
}
답변
SDK 24 이상의 경우 앱 저장소 외부에있는 파일의 Uri를 가져와야하는 경우이 오류가 발생합니다.
@ eranda.del 솔루션을 사용하면이를 허용하도록 정책을 변경할 수 있으며 제대로 작동합니다.
그러나 앱의 API 정책을 변경하지 않고 Google 가이드 라인을 따르려면 FileProvider를 사용해야합니다.
먼저 파일의 URI를 가져 오려면 FileProvider.getUriForFile () 메서드를 사용해야합니다.
Uri imageUri = FileProvider.getUriForFile(
MainActivity.this,
"com.example.homefolder.example.provider", //(use your app signature + ".provider" )
imageFile);
그런 다음 Android 매니페스트에서 공급자를 구성해야합니다.
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.homefolder.example.provider"
android:exported="false"
android:grantUriPermissions="true">
<!-- ressource file to create -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths">
</meta-data>
</provider>
</application>
( “권한”에서 getUriForFile () 메서드의 두 번째 인수와 동일한 값을 사용합니다 (앱 서명 + “.provider”)).
마지막으로 리소스 파일 “file_paths”를 만들어야합니다. 이 파일은 res / xml 디렉토리 아래에 만들어야합니다 (이 디렉토리도 만들어야 할 것입니다).
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>
답변
카메라 또는 파일 검색을 시작하기 전에 다음 코드 블록을 추가하십시오.
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
참조 링크 엄격 모드 와 모든 사용법 및 기술 세부 사항에 대한 설명을 참조하십시오.
답변
AndroidManifest에 필요한 공급자 구성은 필요하지 않으며 카메라 및 저장소 권한 만 허용되어야합니다. 다음 코드를 사용하여 카메라를 시작하십시오.
final int REQUEST_ACTION_CAMERA = 9;
void openCamra() {
Intent cameraImgIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraImgIntent.putExtra(MediaStore.EXTRA_OUTPUT,
FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID +".provider",
new File("your_file_name_with_dir")));
startActivityForResult(cameraImgIntent, REQUEST_ACTION_CAMERA);
}
이미지를 캡처 한 후 다음 위치에서 캡처 한 이미지를 찾을 수 있습니다.
"your_file_name_with_dir"