美文网首页
调用系统相机拍照并将照片插入相册

调用系统相机拍照并将照片插入相册

作者: NewNiu | 来源:发表于2021-11-16 11:07 被阅读0次

    请求相机功能

    如果您应用的基本功能是拍照,请将其在 Google Play 上的显示范围限制在装有相机的设备上。如需声明您的应用依赖于相机,请在清单文件中添加 <uses-feature> 代码:

        <manifest ... >
            <uses-feature android:name="android.hardware.camera"
                          android:required="true" />
            ...
        </manifest>
    

    如果您的应用使用相机,但不需要相机也可以正常运作,应将 android:required 设为 false。这样,Google Play 便会允许未装有相机的设备下载您的应用。因此,您必须负责通过调用 hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) 检查相机在运行时的可用性。如果相机不可用,您应停用相机功能。

    使用相机应用拍照

    推荐一个比startActivityForResult更方便获取一个Activity的返回结果的方法:

    @NonNull
        @Override
        public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
                @NonNull ActivityResultContract<I, O> contract,
                @NonNull ActivityResultCallback<O> callback) {
            return registerForActivityResult(contract, mActivityResultRegistry, callback);
        }
    
    val getImageResultBack =
                registerForActivityResult(ActivityResultContracts.TakePicture()) {
                    // 相机拍照后返回
                    if (it) {
                        mPicUri?.let { uri ->
                            // dialog这里用于将返回图片结果展示出来
                            val dialog = ImageDialog()
                            dialog.setImage(uri)
                            dialog.show(supportFragmentManager, "1")
                            // Android版本小于Q的手机在获取到拍摄的照片后需要动态将其插入到相册,否则图片不在相册中显示
                            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
                                val absolutePath = FileUtil.getRealFilePathByUri(this, uri)
                                MediaUtil.mediaInsertImage(this@MainActivity,absolutePath)
                                // 这是另一种过时的插入方法,目前依然可以使用
                                /*MediaStore.Images.Media.insertImage(
                                    contentResolver,
                                    absolutePath,
                                    "IMG_${TimeUtil.getCurrentTime_yyyyMMdd_HHmmss()}",
                                    "description"
                                )
                                sendBroadcast(
                                    Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE),
                                    "file://${Uri.parse(absolutePath)}"
                                )*/
                            }
                        }
                    }
                }
    // 调用相机    mPicUri最好在每次拍照前都把其值重新更新,以免发生新拍的照片将旧照片覆盖的情况   下面方法在按钮点击后调用
    getImageResultBack?.launch(mPicUri)
    

    另一种官方文档上提供的Intent方法:

    以下都是官方提供的方法

    Android 向其他应用委托操作的方法是调用一个 Intent,用于描述您要执行的操作。此过程涉及三个部分:Intent 本身,用于启动外部 Activity 的调用,以及用于在焦点返回到 Activity 时处理图片数据的一些代码。

    下面是一个调用 Intent 以拍摄照片的函数。

    // 该方法比较常用,但所有返回结果都需要在OnActivityResult中返回结果处理
    val REQUEST_IMAGE_CAPTURE = 1
    
        private fun dispatchTakePictureIntent() {
            Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
                takePictureIntent.resolveActivity(packageManager)?.also {
                    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
                }
            }
        }
    // 获取缩略图
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
            if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
                val imageBitmap = data.extras.get("data") as Bitmap
                imageView.setImageBitmap(imageBitmap)
            }
        }
    // 相关方法不赘述,请参考[`官方文档`](https://developer.android.google.cn/training/camera/photobasics)
    

    项目CameraDemo

    相关文章

      网友评论

          本文标题:调用系统相机拍照并将照片插入相册

          本文链接:https://www.haomeiwen.com/subject/risqtrtx.html