Android 自定义相机黑屏

本文分享了一种解决Android应用中相机预览黑屏的方法,包括调整代码逻辑以适应不同机型,如魅族和小米,并确保在各种情况下都能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近遇到了一个奇葩问题 ,自定义相机  ,拍照一直没有问题  三百年没有动过的代码  ,在项目上uat的时候拍照黑屏了  ,先上代码让大家看一下  避免出现这个错误

if (mCamera == null) {
    mCamera = getCamera(mCameraId);

    if (mHolder != null) {
        
	startPreview(mCamera, mHolder);
}}
在onResume方法中这么写的一直没有问题  但是今天打开相机就是黑屏  ,后来发现了  在onResume方法中给开启相机会有一定的延迟 ,具体为什么我也不知道 ,因为我切换前后摄像头是可以预览的  所以我坚信了我预览的代码没有问题   

然而,为了解决这个问题  我把开启相机的代码放在了SurfaceHolder的surfaceCreated方法中

 public void surfaceCreated(SurfaceHolder holder) {
        if (mCamera == null) {
            mCamera = getCamera(mCameraId);


        }
        if (mCamera == null) {
            ToastUtil.makeText("请检查相机相关权限是否打开!");

          }else {
            
                startPreview(mCamera, holder);

        }

    }
我以为这样就没有问题了  还是自己太年轻啊正常的拍照是没有问题了 但是 锁屏和跳转到别的界面再回来的时候 又是黑屏了 因为 我在onPause方法中把相机设为null 在网上查了好多资料 有的说是设置预览大小的时候  获取宽高为奇数,我的不是这种问题 ,因为如果我的是这样的问题就不会出现有预览的界面 所以我Pass了 网上还有的人说在onResume方法中sleep一下 我尝试延时时间缩短到50ms已经可以完全正常预览了,而且视觉上几乎感觉不到延迟(zxing的二维码扫描预览视觉上也会有略微延迟),而如果改成10ms就不行了。差不多这个时间应该是需要用来调用底层so档的最短时间。所以最终解决办法还需要将上述OnResume()中的开启相机方法改成如下

if (isONe!=1){
    if (mCamera == null) {
        mCamera = getCamera(mCameraId);

        if (mHolder != null) {
            new Thread(){
                @Override
                public void run() {
                    super.run();
                    try{
                      Thread.sleep(50);
                    }catch (Exception e){

                    }
                    startPreview(mCamera, mHolder);
                }
            }.start();

        }
    }
}
嘻嘻 代码修改成这样 拍照已经是可以了 但是你以为这样就完成了 那就错了  你们太小看我家测试的能力了  。。。。。其实这时候我心中一万只曹尼玛经过  但是没有办法  我只能一个测试会改变一个程序员的代码习惯  ,因为我被我家的测试改变了  好了废话不多说了  我们自测只是小心翼翼的点击操作  好像自己的孩子一样 怕点坏了  但是我家测试就把你写的程序当作是他的天敌 使劲的操作  不点蹦就誓不罢休  唉 天有不测风云啊  android 这么多机型 总有一款机型会会出现问题 

下面我就说一下这个特殊机型 魅族 ,当手机的拍照权限拒绝的时候  魅族获取的Camera不为null   那么这就尴尬了  因为我判断逻辑就是判断Camera是否为null 上代码

	if (mCamera == null) {
            ToastUtil.makeText("请检查相机相关权限是否打开!");

          }else {
           
            startPreview(mCamera, holder);

        }

因为mCamera不为null 所以走进了开启相机 但是相机权限的关闭了 爆出了异常  所以 我在判断权限的位置多加了代码    代码如下

 if (mCamera == null) {
            ToastUtil.makeText("请检查相机相关权限是否打开!");

       	}else {
           try{

// setParameters 是针对魅族MX5。MX5通过Camera.open()拿到的Camera对象不为null

                Camera.Parameters mParameters = mCamera.getParameters();

                mCamera.setParameters(mParameters);
                startPreview(mCamera, holder);
            }catch(Exception e) {

                ToastUtil.makeText("请检查相机相关权限是否打开!");

            }

        }


这样就能满足条件了  嘻嘻完美解决了  之前还遇到了特别的问题  小米手机拍出的照片比一般的手机排除的照片要大  因为之前做视频拍摄的时候  视频要做压缩  所以在做视频配置的时候 小米手机要做特别的处理

第一写这么就的文章  写的不好  大家多多包涵














评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值