Android调用系统相机拍照

794 阅读1分钟

打开相机

注意:调用系统相机是不需要权限的

首先定义相机返回的Uri

    //用于保存拍照图片的uri
    private var mCameraUri: Uri? = null

创建相机返回的Uri:

    /**
     * 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法
     */
    private fun createImageUri(): Uri? {
        val status: String = Environment.getExternalStorageState()
        // 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储
        return if (status == Environment.MEDIA_MOUNTED) {
            contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, ContentValues())
        } else {
            contentResolver.insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, ContentValues())
        }
    }

对老版本先创建文件:

    /**
     * 创建保存图片的文件
     */
    @Throws(IOException::class)
    private fun createImageFile(): File? {
        val imageName: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
        val storageDir: File? = requireActivity().getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        if (!storageDir?.exists()!!) {
            storageDir.mkdir()
        }
        val tempFile = File(storageDir, imageName)
        return if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) {
            null
        } else tempFile
    }

发起相机请求

    /**
     * 调起相机拍照
     */
    fun openCamera(){
        val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        // 判断是否有相机
        if (captureIntent.resolveActivity(requireActivity().packageManager) != null) {
            var photoFile: File? = null
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                // 适配android 10
                mCameraUri = createImageUri()
            } else {
                try {
                    //photoFile = File(getJpgPathEndWithSeparator() + "${System.currentTimeMillis()}.jpg")
                    photoFile = createImageFile()
                } catch (e: IOException) {
                    e.printStackTrace()
                }
                if (photoFile != null) {
                    mCameraUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
                        FileProvider.getUriForFile(requireContext(), "${requireContext().packageName}.fileProvider", photoFile)
                    } else {
                        Uri.fromFile(photoFile)
                    }
                }
            }
            if (mCameraUri != null) {
                captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCameraUri)
                captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                startActivityForResult(captureIntent, 110)
            }
        }
    }

接受回调:

    override fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == 110) {
            if (resultCode == RESULT_OK) {
                if (isAndroidQ) {
                    // Android 10 使用图片uri加载
                    bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(mCameraUri!!))
                } else {
                    // 使用图片路径加载
                    bitmap = BitmapFactory.decodeFile(mCameraImagePath)
                }
                //这里使用了第三方库进行裁剪,如果不想要可以不用
                crop_imageview.setImageToCrop(bitmap)
                crop_imageview.setAutoScanEnable(false)
            } else {
                Toast.makeText(this, "取消", Toast.LENGTH_LONG).show()
            }
        }

    }

具体参考:github.com/IMAlex233/C…

萌新求个Star