HarmonyOS开发中 调起系统拍照,点击拍照后的确认按钮点击无反应?

通过action : wantConstant.Action.ACTION_IMAGE_CAPTURE调起系统拍照,点击拍照后,确认的按钮点击无反应.文档中说这个action已经废弃了,但没有找到新的action

阅读 776
avatarAI BotBETA

在HarmonyOS开发中,如果你发现使用wantConstant.Action.ACTION_IMAGE_CAPTURE(这个常量名可能根据具体的API版本或文档有所不同,但通常指的是调用系统拍照应用的action)调起系统拍照后,点击拍照确认按钮无反应,并且文档指出该action已废弃,这通常意味着你需要寻找新的方法来实现这一功能。

解决方案

由于HarmonyOS和Android在某些方面相似但也有其独特性,你需要查找HarmonyOS官方文档或API参考来找到正确的替代方案。以下是一些可能的步骤和建议:

  1. 查阅HarmonyOS官方文档

    • 访问HarmonyOS的官方网站或开发者论坛,查找关于相机和媒体管理的最新文档。
    • 特别注意是否有关于调起系统拍照服务的新API或指导。
  2. 使用Camera Kit

    • HarmonyOS可能提供了Camera Kit,这是一个专门用于处理相机功能的库。检查是否可以通过Camera Kit来实现拍照功能,而不是直接调起系统应用。
    • Camera Kit可能提供了更丰富的接口来控制拍照流程,包括拍照后的回调和图片处理。
  3. 使用Intent但更新Action

    • 如果wantConstant.Action.ACTION_IMAGE_CAPTURE确实已废弃,尝试查找是否有新的Action常量可以替代。
    • 在某些情况下,即使文档没有明确说明,使用Android的MediaStore.ACTION_IMAGE_CAPTURE也可能在HarmonyOS上有效,但这需要测试确认。
  4. 检查权限

    • 确保你的应用已经获得了访问相机和存储的权限。权限问题也可能导致拍照功能无法正常工作。
  5. 示例代码和社区帮助

    • 查找HarmonyOS的官方示例代码或开发者社区中的讨论,看看其他开发者是如何处理这个问题的。
    • 在HarmonyOS的开发者论坛或Stack Overflow的HarmonyOS相关标签下提问,寻求社区的帮助。
  6. 更新HarmonyOS SDK

    • 确保你使用的HarmonyOS SDK是最新的,因为新版本中可能包含了对旧问题的修复和新功能的支持。

示例代码(假设性)

由于具体的API和实现方式会随HarmonyOS版本而变化,以下是一个假设性的示例,说明如何使用Camera Kit(如果可用)进行拍照:

// 假设代码,需要根据实际API调整
CameraKit cameraKit = CameraKit.getInstance(this);
cameraKit.startCameraActivityForResult(new CameraKit.CameraKitCaptureIntent.Builder().build(), requestCode);

// 在onActivityResult中处理拍照结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == YOUR_REQUEST_CODE && resultCode == RESULT_OK) {
        // 处理拍照结果
    }
}

请注意,上述代码是假设性的,并不直接适用于任何特定版本的HarmonyOS。你需要根据实际的API和文档进行调整。

1 个回答

可以通过以下两种方式调起系统相机:

import { common, Want } from '@kit.AbilityKit'; 
import { BusinessError } from '@kit.BasicServicesKit'; 
import { fileIo, fileUri } from '@kit.CoreFileKit'; 
import { promptAction } from '@kit.ArkUI'; 
import { camera, cameraPicker } from '@kit.CameraKit'; 
const TAG = '[SystemCameraDemo]'; 
@Entry 
@Component 
struct Index { 
  @State path: string = ''; 
  @State isVideo: boolean = false; 
  private context = getContext(this) as common.UIAbilityContext; 
  async cameraPicker(type: cameraPicker.PickerMediaType) { 
    try { 
      let pickerProfile: cameraPicker.PickerProfile = { 
        // 相机的位置 
        cameraPosition: camera.CameraPosition.CAMERA_POSITION_BACK, 
        //saveUri 保存配置信息的uri 
        //videoDuration 录制的最大时长 
      }; 
      cameraPicker.pick(getContext(this), [type], pickerProfile) 
        .then((result: cameraPicker.PickerResult) => { 
          if (result.resultCode != 0) { 
            // 处理业务逻辑错误 
            console.error(TAG, `cameraPicker.pick failed, result is ${JSON.stringify(result)}`); 
            promptAction.showToast({ message: '拍摄失败' }) 
            return; 
          } 
          //若saveUri为空,resultUri为公共媒体路径。若saveUri不为空且具备写权限,resultUri与saveUri相同。若saveUri不为空且不具备写权限,则无法获取到resultUri 
          let uri: string = result.resultUri; 
          // 执行正常业务 
          console.info(TAG, `Succeeded in cameraPicker.pick. Data is ${JSON.stringify(result)}, uri is ${uri}`); 
          if (uri) { 
            // 保存到本地 
            this.save2Local(uri); 
          } else { 
            promptAction.showToast({ message: '拍摄失败' }) 
          } 
        }) 
    } catch (error) { 
      let err = error as BusinessError; 
      console.error(TAG, `the pick call failed. error code: ${err.code}`); 
      promptAction.showToast({ message: '拍摄失败' }) 
    } 
  } 
  startAbility(action: string, bundleName: string) { 
    let want: Want = { 
      action: action, 
      parameters: { 
        // 拍照完成后返回的应用BundleName 
        callBundleName: bundleName, 
        supportMultiMode: false 
      } 
    }; 
    try { 
      this.context.startAbilityForResult(want, (err: BusinessError, result: common.AbilityResult) => { 
        if (err.code) { 
          // 处理业务逻辑错误 
          console.error(TAG, `startAbilityForResult failed, code is ${err.code}, message is ${err.message}`); 
          return; 
        } 
        let uri: string = result?.want?.parameters?.resourceUri as string; 
        // 执行正常业务 
        console.info(TAG, `Succeeded in starting ability for result. Data is ${JSON.stringify(result)}, uri is ${uri}`); 
        if (uri) { 
          // 保存到本地 
          this.save2Local(uri); 
        } else { 
          promptAction.showToast({ message: '拍摄失败' }) 
        } 
      }); 
    } catch (err) { 
      let error = err as BusinessError; 
      console.error(TAG, `startAbilityForResult failed, err is ${JSON.stringify(error)}`); 
      promptAction.showToast({ message: '拍摄失败' }) 
    } 
  } 
  save2Local(uri: string) { 
    try { 
      let file = fileIo.openSync(uri, fileIo.OpenMode.READ_ONLY); 
      let prefix = uri.substring(uri.lastIndexOf('.') + 1); 
      let tempFileName = getContext(this).filesDir + '/' + new Date().getTime() + '.' + prefix; 
      let tempFile = fileIo.openSync(tempFileName, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE); 
      fileIo.copyFileSync(file.fd, tempFile.fd); 
      this.path = fileUri.getUriFromPath(tempFileName); 
      this.isVideo = (prefix == 'mp4' || prefix == 'MP4'); 
      console.info(TAG, `resolve2Sandbox successful.`); 
      promptAction.showToast({ message: '拍摄成功' }) 
    } catch (err) { 
      let error = err as BusinessError; 
      console.error(TAG, `resolve2Sandbox failed, err is ${JSON.stringify(error)}`); 
    } 
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进