Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现

Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现


需求:

默认相机拍照尺寸

需求原因
1)客户自身喜好
2)部分客户自己的摄像头不兼容,比如拍照尺寸太大会卡顿,拉丝等现象

在这里插入图片描述

参考资料

Android 13.0 MTK Camera2 设置默认拍照尺寸功能实现
Android 11.0 MTK Camera2 设置默认拍照尺寸功能实现

这两篇文章介绍的蛮好的,可以看看,对于类似需求同理也可以按照改一改? 为什么有些会默认最高分辨率拍照,可能原因在于手机端产品为了最好的拍摄效果,尺寸会默认到最大。

对于Camera2 开发,遇到的困难点就是源码代码量太多,对于很多同事来说就是一脸懵逼,建议多积累一定的代码量,掌握基本的知识。

架构图了解

MTKCamera2相机架构
Camera2架构
Android Camera架构简析

Camera相关专栏

Camera Framework 专栏
小驰私房菜系列
小驰私房菜MTK系列
小驰Camera 开发系列
Camera 相机开发
展讯平台 Camera
官方文档:谷歌官方 API 描述

零散知识了解

MTK 相机UI介绍
Camera2 相机认知
Camera2学习笔记
camera2关于拍照预览方向旋转90度和拍照图片镜像功能实现
Camera2 预览集成、简单拍照:熟悉预览步骤流程比较有用
Camera镜像上下左右颠倒问题的解决办法
MTK相机成像质量差
Camera应用分析

部分相机源码参考,学习API使用,梳理流程,偏应用层

极客相机 Camera2 API
Camera2 API详解
极客相机源码
Camera2 相机Demo
Camera2 专业相机Demo
拍照、预览、录像Demo
使用Camera2 拍照

Camera2 系统相关

Camera2 Service 启动

修改文件-修改方案

修改文件:

\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\picturesize\src\com\mediatek\camera\feature\setting\picturesize\PictureSize.java

\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\picturesize\src\com\mediatek\camera\feature\setting\picturesize\PictureSizeHelper.java

修改内容:

PictureSize.java onValueInitialized 方法

在 onValueInitialized 方法中,默认valueInStore 中调用PictureSizeHelper 类中自定义的 getCustomDefault 方法

         if (valueInStore == null) {
   
   
             // Default picture size is the max full-ratio size.
-            List<String> entryValues = getEntryValues();
+                       LogHelper.d(TAG, "valueInStore == null  Default picture size is the max full-ratio size:");
+            /*List<String> entryValues = getEntryValues();
             for (String value : entryValues) {
                 if (PictureSizeHelper.getStandardAspectRatio(value) == fullRatio) {
                     valueInStore = value;
+                                       LogHelper.d(TAG, "valueInStore == null:valueInStore:"+valueInStore);
                     break;
                 }
-            }
+            }*/
+                        valueInStore =PictureSizeHelper.getCustomDefault(getEntryValues());
+                       
         }

PictureSizeHelper.java getCustomDefault 方法

自定义 getCustomDefault 方法,设置默认分辨率。 这里直接写死,或者 根据客需要求设置为最大、最小 等。

    public static String getCustomDefault(List<String> supportedEntryValues){
   
   
       
        for (int i=0;i< supportedEntryValues.size();i++) {
   
      
            /*Size size = valueToSize(supportedEntryValues.get(i));
            temp = size.width * size.height;        
            if (temp > maxSize) {
                maxSize = temp;
                maxIndex = i;
            }*/
		 LogHelper.d(TAG,   "getCustomDefault:" +supportedEntryValues.get(i));

        }
        return  "1920x1088";
    }

源码分析

设置拍照尺寸的核心类

\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\picturesize\src\com\mediatek\camera\feature\setting\picturesize\PictureSize.java
\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\picturesize\src\com\mediatek\camera\feature\setting\picturesize\PictureSizeHelper.java
\vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\picturesize\src\com\mediatek\camera\feature\setting\picturesize\PictureSizeSettingView.java

源码逐步分析

关联的照片大小搜索

grep -rn 照片大小

在这里插入图片描述
找到如下路径相关关键字:照片大小

feature/mode/vsdof/res/values-zh-rCN/strings.xml
<string name="sdof_picture_size_title">"照片大小"</string>


feature/setting/picturesize/res/values-zh-rCN/strings.xml
 <string name="pref_camera_picturesize_title">"照片大小"</string>

PictureSizeSelector

上面已经找到了两个关键字,这里先根据第一个关键字找一下源码:
路径:

/vendor/mediatek/proprietary/packages/apps/Camera2/feature/setting/picturesize/src/com/mediatek/camera/feature/setting/picturesize/PictureSizeSelector.java
R.string.pref_camera_picturesize_title

在这里插入图片描述

我们看类定义:


/**
 * Picture size selector.
 */

public class PictureSizeSelector extends PreferenceFragment {
   
   

就是图片大小选择器
对应的是如下界面:
在这里插入图片描述
既然是这个界面,那就看一下点击选中方法和进入这个界面的设置方法

进入界面选中的逻辑

这里关联的有四个方法,对应的进入界面选中逻辑:


    @Override
    public void onCreate(Bundle savedInstanceState) {
   
   
        LogHelper.d(TAG, "[onCreate]");
        super.onCreate(savedInstanceState);

        prepareValuesOnShown();
        Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
        if (toolbar != null) {
   
   
            toolbar.setTitle(getActivity().getResources()
                    .getString(R.string.pref_camera_picturesize_title));
        }
        addPreferencesFromResource(R.xml.picturesize_selector_preference);
        PreferenceScreen screen = getPreferenceScreen();
        for (int i = 0 ; i < mEntryValues.size(); i++) {
   
   
            RadioPreference preference = new RadioPreference(getActivity());
            if (mEntryValues.get(i).equals(mSelectedValue)) {
   
   
                preference.setChecked(true);
            }
			LogHelper
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野火少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值