Android 11 踩雷之 App无法唤起相机

1 篇文章 0 订阅
1 篇文章 0 订阅

Android 11 踩雷之 App无法唤起相机

因为本人申请了MIUI12的开发版,所以体验了Android11,讲真的体验感极差,基本上App很少有适配android11 的 举个例子大多数游戏的分享会报错,部分App保存图片时会造成闪退等。

好了,言归正传,我们先来看问题
在这里插入图片描述
这是在吊起相机时出现的问题,问题代码是
在这里插入图片描述

  // 在sd卡中创建一保存图片(原图和缩略图共用的)文件夹
    private fun createFileIfNeed(fileName: String): File {
        val fileA = this.getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath + "/test"
        val fileJA = File(fileA)
        if (!fileJA.exists()) {
            fileJA.mkdirs()
        }
        val file = File(fileA, fileName)
        if (!file.exists()) {
            file.createNewFile()
        }
        return file
    }

我们先来看看为什么会出现这个问题
在这里插入图片描述
android11 将存储空间分为了2部分,所以直接调用就会导致,权限不足而导致崩溃。

解决方法:
首先权限申请方面:在Android11之前,在文件里只需要相册相册的权限,在manifest里声明相机的权限,然后用相机的调用码,就可以打开相机,进行拍照裁剪等操作。

但是在android11中这是不允许的,需要在manifest文件中声明,而且需要申请相机权限。

然后就是代码中彻底解决:
在这里插入图片描述
将这一行替换掉
替换成
在这里插入图片描述

因为Android11 更新后,不存在公共分区,所以无法在公共分区创建文件。

 // 在sd卡中创建一保存图片(原图和缩略图共用的)文件夹
    private fun createFileIfNeed(fileName: String): File {
        val fileA = this.getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absolutePath + "/test"
        val fileJA = File(fileA)
        if (!fileJA.exists()) {
            fileJA.mkdirs()
        }
        val file = File(fileA, fileName)
        if (!file.exists()) {
            file.createNewFile()
        }
        return file
    }

到现在问题解决。

最后给大家分享一下,kotlin的简便权限申请,简单又好用

object PermissionUtils {
    private val RESULT_CODE_TAKE_CAMERA = 7461    //拍照
    private val RESULT_CODE_OPEN_ALBUM = 7462     //读写
    private val RESULT_CODE_SOUND_RECORD = 7463   //录音
    private val RESULT_CODE_CALL_PHONE = 10111   //拨号
    lateinit var context: Context
    private var cameraCallback: (() -> Unit)? = null        //相机回调
    private var readAndWriteCallback: (() -> Unit)? = null  //读写回调
    private var audioCallback: (() -> Unit)? = null         //录音回调
    private var callPhone: (() -> Unit)? = null         //录音回调

    /**
     * 电话权限申请
     */
    fun CallPhone(context: Context, callPhone: () -> Unit) {
        this.context = context
        this.callPhone = callPhone
        Log.e("测试电话权限申请", "ok")
        permission(context, Manifest.permission.CALL_PHONE, RESULT_CODE_CALL_PHONE, callPhone)
    }

    /**
     * 相机权限申请
     */
    fun camera(context: Context, cameraCallback: () -> Unit) {
        this.context = context
        this.cameraCallback = cameraCallback
        permission(context, Manifest.permission.CAMERA, RESULT_CODE_TAKE_CAMERA, cameraCallback)
    }


    /**
     * 读写权限申请
     */
    fun readAndWrite(context: Context, readAndWriteCallback: () -> Unit) {
        this.context = context
        this.readAndWriteCallback = readAndWriteCallback
        permissions(
            context,
            arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.CAMERA),
            RESULT_CODE_OPEN_ALBUM,
            readAndWriteCallback
        )
    }

    /**
     * 录音权限申请
     */
    fun audio(context: Context, audioCallback: () -> Unit) {
        this.context = context
        this.audioCallback = audioCallback
        permission(
            context,
            Manifest.permission.RECORD_AUDIO,
            RESULT_CODE_SOUND_RECORD,
            audioCallback
        )
    }

    /**
     * 权限申请结果
     */
    fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        val cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED
        Log.e("测试电话权限申请3", "ok")
        when (requestCode) {

            RESULT_CODE_TAKE_CAMERA -> {    //拍照
                if (cameraAccepted) {
                    cameraCallback?.let { it() }
                } else {
                    //用户拒绝
                    Toast.makeText(context, "请开始拍照权限", Toast.LENGTH_SHORT).show()
                }
            }
            RESULT_CODE_OPEN_ALBUM -> { //读写
                if (cameraAccepted) {
                    readAndWriteCallback?.let { it() }
                } else {
                    Toast.makeText(context, "请开启应用读取权限", Toast.LENGTH_SHORT).show()
                }
            }
            RESULT_CODE_SOUND_RECORD -> { //录音
                if (cameraAccepted) {
                    audioCallback?.let { it() }
                } else {
                    Toast.makeText(context, "请开启应用录音权限", Toast.LENGTH_SHORT).show()
                }
            }
            RESULT_CODE_CALL_PHONE -> { //拨号
                if (cameraAccepted) {
                    callPhone?.let {
                        Log.e("已申请电话权限", "ok")
                        it()
                    }
                } else {
                    Log.e("未申请电话权限", "ok")
                    Toast.makeText(context, "请开启应用电话权限", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    //权限申请
    private fun permission(
        context: Context,
        systemCode: String,
        resultCode: Int,
        callback: () -> Unit
    ) {
        //判断是否有权限
        if (ContextCompat.checkSelfPermission(
                context,
                systemCode
            ) == PackageManager.PERMISSION_GRANTED
        ) {
            Log.e("已申请权限", "ok")
            callback()
        } else {
            //申请权限
            Log.e("无权限", "ok")
            ActivityCompat.requestPermissions(context as Activity, arrayOf(systemCode), resultCode)
        }
    }  //权限申请

    private fun permissions(
        context: Context,
        systemCode: Array<String>,
        resultCode: Int,
        callback: () -> Unit
    ) {
        //判断是否有权限
        if (ContextCompat.checkSelfPermission(
                context,
                systemCode[0]
            ) == PackageManager.PERMISSION_GRANTED
        ) {
            Log.e("已申请权限", "ok")
            callback()
        } else {
            //申请权限
            Log.e("无权限", "ok")
            ActivityCompat.requestPermissions(context as Activity, systemCode, resultCode)
        }
    }
}

调用的时候也很简单

PermissionUtils.readAndWrite(this, {

        })

到此,本文结束,谢谢大家耐心的阅读。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风伴佳人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值