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

2021-11-16  本文已影响0人  NewNiu

请求相机功能

如果您应用的基本功能是拍照,请将其在 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

上一篇下一篇

猜你喜欢

热点阅读