自学HarmonyOS应用开发(72)- 准备相机(1)

2021-10-14 16:14:54 浏览数 (1)

相机是手机的常用功能,同时也是许多更高阶功能的基础。本文按步骤详细介绍Harmony应用开发中启动相机的过程。

声明相机相关权限

相机相关功能可能用到的权限包括:照相机权限,读写存储存储空间权限,访问麦克风权限和获取定位权限。这些权限首先需要在config.json中进行声明。

代码语言:javascript复制
{
  ...
  "module": {
    "abilities": [
      {
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ],
        "orientation": "unspecified",
        "visible": true,
        "formsEnabled": false,
        "name": "xwg.aicamera.MainAbility",
        "icon": "$media:icon",
        "description": "$string:mainability_description",
        "label": "$string:entry_MainAbility",
        "type": "page",
        "launchType": "standard"
      }
    ],
    "reqPermissions": [
      {
        "name": "ohos.permission.CAMERA"
      },{
        "name": "ohos.permission.WRITE_USER_STORAGE"
      },
      {
        "name": "ohos.permission.READ_USER_STORAGE"
      },
      {
        "name": "ohos.permission.MICROPHONE"
      },
      {
        "name": "ohos.permission.LOCATION"
      }
    ]
  }
}

上述代码第27行到第41行声明了前述权限。

获取用户授权

相机关联的权限属于敏感权限,除了在congif.json中声明外,还需要在程序启动时显示获取用户授权,例如获取相机权限的画面如下:

MainAbility获取相机相关授权的代码如下:

代码语言:javascript复制
代码语言:javascript复制
public class MainAbility extends Ability {
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
        requestPermissions();
    }

    private void requestPermissions() {
        String[] permissions = {
                SystemPermission.WRITE_USER_STORAGE, SystemPermission.READ_USER_STORAGE, SystemPermission.CAMERA,
                SystemPermission.MICROPHONE, SystemPermission.LOCATION
        };
        List<String> permissionFiltered = Arrays.stream(permissions)
                .filter(permission -> verifySelfPermission(permission) != IBundleManager.PERMISSION_GRANTED)
                .collect(Collectors.toList());
        requestPermissionsFromUser(permissionFiltered.toArray(new String[permissionFiltered.size()]), 0);
    }

    @Override
    public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
        if (permissions == null || permissions.length == 0 || grantResults == null || grantResults.length == 0) {
            return;
        }
        for (int grantResult : grantResults) {
            if (grantResult != PERMISSION_GRANTED) {
                terminateAbility();
                break;
            }
        }
    }
}

requestPermissions在MainAbility的onStart方法中被调用,它的功能是向用户申请授权。申请结束后,系统会自动调用onRequestPermissionsFromUserResult方法。

如果权限获取失败,应用会终止执行。

准备相机布局

这一步主要是为了给相机准备一个表示区域,其他的和一般的布局没有区别。

代码语言:javascript复制
代码语言:javascript复制
<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayout
    xmlns:ohos="http://schemas.huawei.com/res/ohos"
    ohos:height="match_parent"
    ohos:width="match_parent"
    ohos:alignment="center"
    ohos:orientation="vertical">

    <DependentLayout
        ohos:id="$ id:root_container"
        ohos:height="match_parent"
        ohos:width="match_parent"
        ohos:alignment="bottom"
        ohos:orientation="vertical">
        <DirectionalLayout
            ohos:id="$ id:surface_container"
            ohos:height="match_parent"
            ohos:width="match_parent"/>
            />
        <DirectionalLayout
            ohos:id="$ id:directionalLayout"
            ohos:height="match_content"
            ohos:width="match_parent"
            ohos:alignment="center"
            ohos:align_parent_bottom="$ id:root_container"
            ohos:orientation="horizontal">
            <Button
                ohos:id="$ id:ini_camera"
                ohos:height="match_content"
                ohos:width="0"
                ohos:weight="10"
                ohos:clickable="true"
                ohos:text_size="20fp"
                ohos:text="$string:init_camera"/>
            <Component
                ohos:height="match_parent"
                ohos:width="0"
                ohos:weight="1"/>
            <Button
                ohos:id="$ id:tack_picture_btn"
                ohos:height="match_content"
                ohos:width="0"
                ohos:weight="10"
                ohos:clickable="true"
                ohos:text_size="20fp"
                ohos:text="$string:TakePhoto"/>
        </DirectionalLayout>
    </DependentLayout>
</DirectionalLayout>

代码第15到19行就是为相机显示预留的区域,记住它的id是surface_container,长宽都给指定为match_parent。再下面的部分定义了两个标准的按钮。

走到这一步,应用的显示如下:

后续内容请期待后面的文章。

参考资料

相机示例代码

https://gitee.com/openharmony/app_samples/tree/master/media/Camera

权限开发概述

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-overview-0000000000029883

权限开发指导

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-guidelines-0000000000029886

应用权限列表

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-available-0000001051089272

作者著作介绍

《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。


0 人点赞