欢迎来真孝善网,为您提供真孝善正能量书籍故事!

Android 7.0及更高版本相机拍照时FileUriExposedException问题解析

时间:11-02 现代故事 提交错误

很多朋友对于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自带相机拍出的照片出 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位网友表示赞同!

人心叵测i

安卓7.0的手机现在已经算是比较老版本的了吧?所以才会有这个问题?

    有8位网友表示赞同!

裸睡の鱼

建议大家及时更新手机系统吧,可能会解决很多问题。包括FileUriExposedException。

    有15位网友表示赞同!

凉城°

这个文件URI暴露的问题,会不会影响我手机其他的功能?

    有18位网友表示赞同!

Hello爱情风

安卓7.0的手机真的越来越不靠谱了!

    有16位网友表示赞同!

苏樱凉

希望能看到这个FileUriExposedException问题的解决方案,我好继续正常拍照片...

    有18位网友表示赞同!

把孤独喂饱

我查了一下网上,似乎有很多朋友都遇到过这个问题,看来还不是个很常见的问题。

    有11位网友表示赞同!

如梦初醒

想了解一下FileUriExposedException的危害,会不会泄露我的个人隐私?

    有20位网友表示赞同!

杰克

有没有办法不用升级系统就能解决这个问题啊?!

    有7位网友表示赞同!

琴断朱弦

看到这个标题我瞬间回忆起自己曾经因为手机更新问题遇到的烦恼...

    有10位网友表示赞同!

【Android 7.0及更高版本相机拍照时FileUriExposedException问题解析】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活