因为这个需要向系统相机发送 content://URI,并授予 URI 临时访问权限。而进行此授权的最简单方式是使用 FileProvider类
步骤如下:
1.清单文件加权限以及注册Provider
权限需要 SD卡读写和相机权限 SD卡读写权限需要动态获取
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--
name写包名
authorities 授权名
exported 是否可以让其他应用组件使用
grantUriPermissions 授予uri权限
-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.wang"
android:exported="false"
android:grantUriPermissions="true">
<!--
name 文件提供者路径 打开Fileprovider类 可以看到
resource 定义的xml文件
-->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/paths"></meta-data>
</provider>
这里可以看到 meta-data里的 resource 的@xml/paths 需要创建,在res文件下创建xml文件夹
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- external-path 是sd卡根目录-->
<!-- name 可以随便写-->
<!-- path 是你的路径 SD卡下面有 DCIM DOWNLOAD Music 等文件 这里选DCIM 保存-->
<external-path
name="my"
path="DCIM"/>
</paths>
这些做完之后就是去打开相机进行拍照了
打开相机进行拍照 (提前弄好一个文件名字来使用) 利用FileProvider.getUriForFile()来得到uri
private fun opencamera() {
var intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) //所需要的action
var name = createname() //根据时间创建出一个文件名字
var file = File("/storage/emulated/0/DCIM" + name)
uri = FileProvider.getUriForFile(this, "com.wang", file) //文件提供者
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri)
startActivityForResult(intent, 2)
}
//根据时间创建出一个文件名字
private fun createname(): String? {
val name: String = SimpleDateFormat("yyyyMMddhhmmss").format(Date())
return name + ".jpg"
}
最后可以在onActivityResult里拿到图片并设置到Imageview上
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
//打开图库的
IMAGE -> {
if (resultCode == Activity.RESULT_OK) {
Log.d("----", "" + data?.action)
val data1 = data?.data
img.setImageURI(data1)
}
}
打开相机的
CAMERA -> {
if (resultCode == Activity.RESULT_OK) {
img.setImageURI(uri) //设置图片
}
}
}
}
这样就简单的完成了拍照保存本地并设置头像