Android 调起相机拍照并保存本地

因为这个需要向系统相机发送 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)   //设置图片
                }
            }
        }
    }

这样就简单的完成了拍照保存本地并设置头像
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值