很多朋友对于Android 7.0及更高版本相机拍照时FileUriExposedException问题解析和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
官方推荐使用FileProvider来解决这个问题。
我们来看看具体的实现步骤。
在manifest.xml文件添加provider,相机,读写文件权限
.注意android:authorities中的值。后面用到的getUriForFile(Context, String, File)中,第二个参数就是里面的值。
编写file_paths.xml
?xml version="1.0"encoding="utf-8"?路径中文件的一些可配置选项
//相当Context.getFilesDir() +路径,名称是共享url的一部分//getCacheDir()//Environment.getExternalStorageDirectory()//getExternalFilesDir(String) Context.getExternalFilesDir(null)//Context.getExternalCacheDir() write相机获取图片活动:FileProviderActivity
包eebochina.com.testtechniques.fileProvider;
导入android.Manifest;
导入android.app.Activity;
导入android.content.ClipData;
导入android.content.ContentResolver;
导入android.content.Intent;
导入android.content.pm.PackageManager;
导入android.content.pm.ResolveInfo;
导入android.graphics.BitmapFactory;
导入android.net.Uri;
导入android.os.Build;
导入android.os.Environment;
导入android.os.ParcelFileDescriptor;
导入android.provider.MediaStore;
导入android.support.v4.content.ContextCompat;
导入android.support.v4.content.FileProvider;
导入android.support.v7.app.AppCompatActivity;
导入android.os.Bundle;
导入android.view.View;
导入android.widget.Button;
导入android.widget.ImageView;
导入android.widget.Toast;
导入java.io.File;
导入java.io.FileDescriptor;
导入java.io.FileNotFoundException;
导入java.util.List;
导入eebochina.com.testtechniques.R;
公共类FileProviderActivity 扩展AppCompatActivity {
私有按钮mButton;
私有ImageView mImageView;
私有Uri contentUri;
私有文件newFile;
私人活动活动;
私人最终int NEED_CAMERA=200;
@覆盖
protected void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_provider);
活动=这个;
mButton=(Button) findViewById(R.id.file_btn);
mImageView=(ImageView) findViewById(R.id.file_show);
mButton.setOnClickListener(new View.OnClickListener() {
@覆盖
公共无效onClick(查看视图){
//检查是否有摄像头以及读写文件权限
if (ContextCompat.checkSelfPermission(活动,Manifest.permission.CAMERA)
!=PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(活动,Manifest.permission.WRITE_EXTERNAL_STORAGE)
!=PackageManager.PERMISSION_GRANTED) {
Activity.requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, NEED_CAMERA);
} 别的{
启动相机();
}
}
});
}
@覆盖
public void onRequestPermissionsResult(int requestCode, String[] 权限,
int[] grantResults) {
开关(请求代码){
案例NEED_CAMERA:
//如果权限被拒绝,grantResults为空
if (grantResults.长度0
grantResults[0]==PackageManager.PERMISSION_GRANTED) {
启动相机();
} 别的{
Toast.makeText(activity, "需要相机和读写文件权限才能更改功能", Toast.LENGTH_SHORT).show();
}
休息;
}
}
/**
* 打开相机拍照
*/
私有无效startCamera(){
文件imagePath=new File(Environment.getExternalStorageDirectory(), "图像");
if (!imagePath.exists()) imagePath.mkdirs();
newFile=new File(imagePath, "default_image.jpg");
//第二个参数是manifest.xml中定义的provider的authorities属性
contentUri=FileProvider.getUriForFile(this, "com.example.android.fileprovider", newFile);
意图intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//兼容版本处理,因为intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)仅在5.0以上版本有效
如果(Build.VERSION.SDK_INT=Build.VERSION_CODES.LOLLIPOP){
Intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} 否则如果(Build.VERSION.SDK_INT=Build.VERSION_CODES.JELLY_BEAN) {
ClipData 剪辑=
ClipData.newUri(getContentResolver(), "一张照片", contentUri);
Intent.setClipData(剪辑);
Intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} 别的{
列表资源信息列表=
获取包管理器()
.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String 包名=resolveInfo.activityInfo.packageName;
grantUriPermission(包名, contentUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
Intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
startActivityForResult(意图,1000);
}
@覆盖
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (结果代码==RESULT_OK) {
ContentResolver contentProvider=getContentResolver();
ParcelFileDescriptor mInputPFD;
尝试{
//获取contentProvider图片
mInputPFD=contentProvider.openFileDescriptor(contentUri, "r");
FileDescriptor fileDescriptor=mInputPFD.getFileDescriptor();
mImageView.setImageBitmap(BitmapFactory.decodeFileDescriptor(fileDescriptor));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}代码已经写好了,附上简单效果图:
关于Android 7.0及更高版本相机拍照时FileUriExposedException问题解析,的介绍到此结束,希望对大家有所帮助。
【Android 7.0及更高版本相机拍照时FileUriExposedException问题解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
哎哟喂,我手机Android 7.0自带相机拍出的照片出 sorun了!文件URI暴露导致上传和分享都挂
有18位网友表示赞同!
安卓7.0的手机要换系统才能解决这个FileUriExposedException?
有13位网友表示赞同!
听说这是个比较老问题了,android官方应该已经出了解决方案吧?
有18位网友表示赞同!
看这标题我以为是安卓7.0手机拍的照片特别清晰!结果竟然是文件漏洞啊...
有8位网友表示赞同!
有人遇到这个FileUriExposedException的解决方案吗?帮忙分享一下呗,急!
有10位网友表示赞同!
我这手机也是Android 7.0,平时用相机拍照一直没发现问题,最近几天才开始这样?怎么回事啊?
有19位网友表示赞同!
我的手机也安卓7.0,可是我拍的照片都能正常上传和分享啊!难道版本不同?
有20位网友表示赞同!
这个问题真是让人头疼!想上个视频分享软件都受限了...
有13位网友表示赞同!
FileUriExposedException到底是什么鬼?能不能解释一下 layman terms ?
有8位网友表示赞同!
有没有技术高手来解答一下这个FileUriExposedException是什么意思啊!望指教!
有7位网友表示赞同!
安卓7.0的手机现在已经算是比较老版本的了吧?所以才会有这个问题?
有8位网友表示赞同!
建议大家及时更新手机系统吧,可能会解决很多问题。包括FileUriExposedException。
有15位网友表示赞同!
这个文件URI暴露的问题,会不会影响我手机其他的功能?
有18位网友表示赞同!
安卓7.0的手机真的越来越不靠谱了!
有16位网友表示赞同!
希望能看到这个FileUriExposedException问题的解决方案,我好继续正常拍照片...
有18位网友表示赞同!
我查了一下网上,似乎有很多朋友都遇到过这个问题,看来还不是个很常见的问题。
有11位网友表示赞同!
想了解一下FileUriExposedException的危害,会不会泄露我的个人隐私?
有20位网友表示赞同!
有没有办法不用升级系统就能解决这个问题啊?!
有7位网友表示赞同!
看到这个标题我瞬间回忆起自己曾经因为手机更新问题遇到的烦恼...
有10位网友表示赞同!