如何解决预览流黑屏的问题

1. 未正确获取相机权限就初始化相机。

2. 设置的预览流尺寸不支持。

HarmonyOS
2024-05-20 21:44:40
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
wingcky

针对未正确获取相机权限就初始化相机的问题,可参考如下代码:

首先在module.json5文件中申请权限。

{ 
  "module": { 
    ... 
    "requestPermissions": [ 
      { 
        "name": "ohos.permission.CAMERA", 
        "usedScene": { 
          "abilities": [ 
            "FormAbility" 
          ], 
          "when":"always" 
        }, 
        "reason": "$string:app_name" 
      }, 
      { 
        "name": "ohos.permission.MICROPHONE", 
        "usedScene": { 
          "abilities": [ 
            "FormAbility" 
          ], 
          "when":"always" 
        }, 
        "reason": "$string:app_name" 
      }, 
      { 
        "name": "ohos.permission.WRITE_MEDIA", 
        "usedScene": { 
          "abilities": [ 
            "FormAbility" 
          ], 
          "when":"always" 
        }, 
        "reason": "$string:app_name" 
      }, 
      { 
        "name": "ohos.permission.READ_MEDIA", 
        "usedScene": { 
          "abilities": [ 
            "FormAbility" 
          ], 
          "when":"always" 
        }, 
        "reason": "$string:app_name" 
      } 
    ], 
    ... 
  } 
}

然后修改EntryAbility.ets中onWindowStageCreate的代码:

import { window } from '@kit.ArkUI'; 
import { abilityAccessCtrl, UIAbility } from '@kit.AbilityKit'; 
import { hilog } from '@kit.PerformanceAnalysisKit'; 
import { BusinessError } from '@kit.BasicServicesKit'; 
 
export default class EntryAbility extends UIAbility { 
  // ... 
  onWindowStageCreate(windowStage: window.WindowStage): void { 
    let atManager = abilityAccessCtrl.createAtManager(); 
    atManager.requestPermissionsFromUser(this.context, ['ohos.permission.CAMERA']).then((data) => { 
      console.info('data:' + JSON.stringify(data)); 
      console.info('data permissions:' + data.permissions); 
      console.info('data authResults:' + data.authResults); 
      // Main window is created, set main page for this ability 
      hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); 
 
      windowStage.loadContent('pages/CameraPage', (err, data) => { 
        if (err.code) { 
          hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); 
          return; 
        } 
        hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); 
      }); 
    }).catch((err: BusinessError) => { 
      console.info('data:' + JSON.stringify(err)); 
    }); 
  } 
  // ... 
}

因为当应用被切换到后台后,相机资源会被全部回收,所以为了避免出现前后台切换后预览流黑屏的问题,需在onPageShow中进行重新创建会话、配置会话、启动等操作,并在onPageHide中对相机资源进行销毁

/** 
 * 自定义拍照 
 */ 
@Entry 
@Component 
struct CameraDemoPage { 
 // ... 
  async onPageShow() { 
    let baseContext = getContext() as common.BaseContext; 
    await this.initCamera(baseContext, this.surfaceId); 
  } 
  
  async onPageHide() { 
    await this.releaseCamera(); 
  } 
  //... 
}

针对设置的预览流尺寸不支持的问题:

可先获取相机设备支持的输出流能力,得到支持的预览尺寸。

async initCamera(baseContext: ESObject, surfaceId: string) { 
  // ... 
  // 获取相机设备支持的输出流能力 
  let cameraOutputCap: camera.CameraOutputCapability = cameraManager.getSupportedOutputCapability(cameraArray[0]); 
  if (!cameraOutputCap) { 
    console.error("cameraManager.getSupportedOutputCapability error"); 
    return; 
  } 
  console.info("outputCapability: " + JSON.stringify(cameraOutputCap)); 
  // 预览流与录像输出流的分辨率的宽高比要保持一致 
  let previewProfilesArray: Array<camera.Profile> = cameraOutputCap.previewProfiles; 
  let position: number = 0; 
  if (previewProfilesArray != null) { 
    previewProfilesArray.forEach((value: camera.Profile, index: number) => { 
      console.info(`支持的预览尺寸: [${value.size.width},${value.size.height},${value.size.width / value.size.height }]`); 
      if (value.size.width === 2592 && value.size.height === 1200) { 
        position = index; 
      } 
    }) 
  } else { 
    console.error("createOutput photoProfilesArray == null || undefined"); 
  } 
  // ... 
}
分享
微博
QQ
微信
回复
2024-05-22 15:33:07
相关问题
this传递问题,该如何解决
860浏览 • 1回复 待解决
如何解决底层库无法调试问题
462浏览 • 1回复 待解决
如何解决文件中文乱码问题
1188浏览 • 3回复 待解决
如何解决webview离线加载白屏问题
473浏览 • 1回复 待解决
如何解决webview loaddata白屏问题
434浏览 • 1回复 待解决
HarmonyOS如何解决数据存储问题
7776浏览 • 3回复 已解决
如何连续获取相机预览数据
163浏览 • 1回复 待解决
如何解决MD5加密中遇到问题
206浏览 • 1回复 待解决
如何解决module相互依赖问题
534浏览 • 1回复 待解决
如何解决hdc无法连接真机问题
612浏览 • 1回复 待解决
http请求报错2300006如何解决
909浏览 • 1回复 待解决
获取UIContext报错1300002如何解决
717浏览 • 1回复 待解决