Android 使用targetSdkVersion 25访问摄像头时出现问题?
我有一个使用摄像头的应用程序,当我使用Android 使用targetSdkVersion 25访问摄像头时出现问题?,android,target-sdk,Android,Target Sdk,我有一个使用摄像头的应用程序,当我使用targetSdkVersion 23编译它时,它可以正常工作,但当我尝试使用version 25时,我遇到以下错误: android.os.FileUrieExposedException: file:///storage/emulated/0/DCIM/IMG_1093948364.jpg 暴露在应用程序之外 通过ClipData.Item.getUri() 这是我正在使用的代码: private void showCameraAction() {
targetSdkVersion 23
编译它时,它可以正常工作,但当我尝试使用version 25
时,我遇到以下错误:
android.os.FileUrieExposedException:
file:///storage/emulated/0/DCIM/IMG_1093948364.jpg 暴露在应用程序之外
通过ClipData.Item.getUri()
这是我正在使用的代码:
private void showCameraAction() {
if(ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
getString(R.string.mis_permission_rationale_write_storage),
REQUEST_STORAGE_WRITE_ACCESS_PERMISSION);
}else {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getActivity().getPackageManager()) != null) {
try {
mTmpFile = FileUtils.createTmpFile(getActivity());
} catch (IOException e) {
e.printStackTrace();
}
if (mTmpFile != null && mTmpFile.exists()) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
startActivityForResult(intent, REQUEST_CAMERA);
} else {
Toast.makeText(getActivity(), R.string.mis_error_image_not_exist, Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(getActivity(), R.string.mis_msg_no_camera, Toast.LENGTH_SHORT).show();
}
}
}
private void requestPermission(final String permission, String rationale, final int requestCode){
if(shouldShowRequestPermissionRationale(permission)){
new AlertDialog.Builder(getContext())
.setTitle(R.string.mis_permission_dialog_title)
.setMessage(rationale)
.setPositiveButton(R.string.mis_permission_dialog_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(new String[]{permission}, requestCode);
}
})
.setNegativeButton(R.string.mis_permission_dialog_cancel, null)
.create().show();
}else{
requestPermissions(new String[]{permission}, requestCode);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode == REQUEST_STORAGE_WRITE_ACCESS_PERMISSION){
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
showCameraAction();
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
我该怎么办?谢谢。您的
FileUtils.createTmpFile(getActivity())
可能使用file://URI与其他应用程序共享文件(在您的示例中是照相机)
大于24的Android版本使用content://URI,当您尝试直接使用file://URI共享文件时,将引发此异常
内容URI允许您使用临时访问权限授予读写访问权限
看看。解决方案:
更改为:
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTmpFile));
为此:
//getActivity() because its a fragment
Uri uri = FileProvider.getUriForFile(getActivity(),
getActivity().getPackageName()
, mTmpFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
它成功了。请检查此项,并将“请提供解决方案”作为问题的答案,而不是更新。这是为了帮助未来的游客,避免混淆。谢谢。下面几行我正在制作一个Uri(链接说这是问题所在),我试着这样写:
Uri Uri=FileProvider.getUriForFile(MultiImageSelectorFragment.this,MultiImageSelectorFragment.this.getApplicationContext().getPackageName()+“.provider”,mTmpFile)代码>但我在getApplicationContext()中遇到一个错误
,它无法解析方法“getApplicationContext()”。有没有想过如何修复它?