Android Camera 从0到1 (二) 使用小结

1. 项目中,经常有申请摄像头麦克风权限的场景。但是原生SDK在某些定制手机上是不可完全信任(有时候API告知我们有相机权限,实际上没有)的,所以我们可能有时候需要二次确认摄像头是否可用等逻辑


    /**
     * @return 二次判断摄像头,麦克风是否可用
     */
    public static boolean againVideoChatSimpleVerify() {
        if (PermissionUtil.isPermissionBlack()) {
            if (PermissionUtil.cameraIsCanUse() && PermissionUtil.audioIsCanUse()) {
                return true;
            }
        }
        return false;
    }

    /**
     * @return 此处可添加机型判断, 名单中的需要二次确认是否权限真正开启
     */
    public static boolean isPermissionBlack() {
        return true;
    }

    /**
     * 通过尝试打开相机的方式判断有无拍照权限(在6.0以下使用拥有root权限的管理软件可以管理权限)
     *
     * @return
     */
    public static boolean cameraIsCanUse() {
        boolean isCanUse = true;
        Camera mCamera = null;
        try {
            mCamera = Camera.open();
        } catch (Exception e) {
            isCanUse = false;
        }
        if (mCamera != null) {
            try {
                mCamera.setPreviewCallback(null);
                mCamera.stopPreview();
                mCamera.release();
                mCamera = null;
            } catch (Exception e) {
                e.printStackTrace();
                return isCanUse;
            }
        }
        return isCanUse;
    }

    /**
     * 获取语音文件名
     *
     * @param uid String
     * @return
     */
    public static String getVoiceFileName(String uid) {
        return uid + System.currentTimeMillis() + ".mp3";
    }

	public static String getVoiceFolderPath(){
		return "";
	}

    /**
     * @return
     */
    public static boolean audioIsCanUse() {
        boolean isCanUse = true;
        // 这里的音频文件名和音频文件路径随便写个字符串返回即可(因为我们不会真正去播放,而是初始化一下)
        String voiceFileName = getVoiceFileName(String.valueOf(System.currentTimeMillis()));
        String voicePath = getVoiceFolderPath();
        MediaRecorder mRecorder = new MediaRecorder();
        try {
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            mRecorder.setOutputFile(voicePath + "/" + voiceFileName);
        } catch (IllegalStateException e) {
            // ChanghongS06 手机报错 setAudioSource failed
            e.printStackTrace();
        }
        try {
            mRecorder.prepare();
        } catch (IOException e) {
            e.printStackTrace();
            isCanUse = false;
        } finally {
            try {
                mRecorder.stop();
                mRecorder.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return isCanUse;
    }

2. CameraX初学

这里有几篇很好的参考文章:

  1. 探索 Android 平台的 CameraX
  2. Jetpack支持库 CameraX 初体验
参考
  1. Android开发 camera被占用的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

初心一点

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

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

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

打赏作者

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

抵扣说明:

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

余额充值