Flutter 相机定制

Flutter中与硬件相关的部分,一直都挺蛋疼的。方案基本上有两种,自己写,或者等出相关的库。

最近做的一个项目中,需要对相机做定制。有过相关模块开发经验的,就知道这种需求并不简单,况且是这种跨平台解决方案的初期。

需求来了,怎么办呢?那就只能硬着头皮上了。先去pub上找找,有没有可以使用的库。初步挑到两个库,一个camera,另一个是image_picker。

image_picker试了下,基本上就pass了,只能调用系统相机或者选择相册,相机相关部分,肯定是没法使用。相册部分倒是可以拿来使用。

camera试着运行了下demo,感觉这个库可以使用,直接将相机预览封装成一个flutter widget。我们可以很方便的在上面进行各种定制。

设计图上需要相机全屏显示,试着在demo上修改成全屏,悲剧出现了,风一般的拉伸效果。添加一个调取相机的页面,在退出相机页面后,demo置后台,切换到前台的时候,Android这边crash了,试了N多次,100%的crash,我勒个擦,谷歌官方的插件写的这么随意~

然后,重点来了,本文主要是解决这两个问题,一个是全屏显示的问题,另一个则是crash问题

先上一张Android端的拍照效果图:

Android端全屏拉伸问题

对于这种相机拉伸问题,做过相机定制相关的,都会知道是预览的分辨率选择错误导致的,知道这一点过后,修改起来就简单的多了。直接拉camer plugin的源码,Android的实现,相对还是比较简单,一个文件700来行代码。找到计算预览尺寸的方法。

    private void computeBestPreviewAndRecordingSize(
        StreamConfigurationMap streamConfigurationMap, Size minPreviewSize, Size captureSize) {
        ....
    }

考虑到以后camera插件升级的问题,直接单独新建一个文件进行最佳预览尺寸的计算,然后在调用处进行替换即可。

Android端前后台切换必现crash问题

Android端前后台切换的问题,查看log发现是resume过后崩溃的,直接撸源代码,发现插件监听了Activity的生命周期,在resume的时候进行了open操作。

  @Override
  public void onActivityResumed(Activity activity) {
    if (requestingPermission) {
      requestingPermission = false;
      return;
    }
    if (activity == CameraPlugin.this.activity) {
      if (camera != null) {
        camera.open(null);
      }
    }
  }

问题来了,关键是,插件没有进行unregister操作,在退出相机页面过后,调用dispose方法,会将camera关闭,并且将cameraDevice置为null,其他生命周期回调中调用cameraDevice的都会crash。onActivityResumed调用camer.open也会crash。这些crash的根本原因是因为没有将回调unregister掉。了解这些过后,修改起来就简单了,在dispose的时候,将插件的生命周期回调给unregister掉。修改完成后,试下效果,果然都没有crash。

后话

相关代码段我就不贴出来了,关于全屏预览尺寸的计算,网上太多的资料了,将previewSize计算正确即可。第二个crash的问题,添加一个unregisterActivityLifecycleCallbacks即可。对于修改的地方,做好注释,后续升级插件合入的时候不错乱即可。

目前来看Flutter第三方真的很差,如果只是自己个人项目,或者一些偏向于数据展示的项目,可以试一下。但是对于商业项目,尤其是硬件依赖性比较强的,还是建议一段时间过后再看看。

大后话

谷歌官方的camera插件,如果只是自己使用的话,可以按照上面的方法去修改,如果想要用在商业项目上,还是劝三思。

谷歌官方camera插件Android部分,用的是camera2 API,这个API有什么问题呢?

  1. 从21开始支持,也就是说需要放弃百分之十几的份额;
  2. 上面版本不是最坑的,最坑的是什么呢?硬件厂商对camera2的支持程度,遇到几台机子,对camera2支持非常差,这些机子还是近一年比较新的机子(vivo x20a),获取到的最大预览分辨率非常低,拍出来的图片尺寸也对不上。

最后,重写了Android部分,直接采用camera API,支持版本从16开始,完全没啥问题,对硬件支持也都非常完美。谷歌这个坑埋的有点深,最开始考虑时间因素,结果花在插件上修改分辨率、修改crash、排查特殊机型问题的时间不少。

参考

  1. Android设备对新Camera2 API的支持问题:以华为M2为例

原文地址:https://www.cnblogs.com/holy-loki/p/9735082.html

时间: 2024-08-06 11:45:09

Flutter 相机定制的相关文章

跨平台技术演进及Flutter未来

一.移动跨平台技术演进 1. 引言 移动互联网发展十余年,伴随着 Android.iOS 等智能手机的不断普及,移动端已逐步取代 PC 端,成为兵家必争之地.正所谓“得移动端者得天下”,移动端已成为互联网领域最大的流量分发入口,一大批互联网公司正是在这大趋势下崛起. 2. 为什么需要跨平台技术 伴随着移动互联网的高速发展,公司间竞争越来越激烈,如何将好想法快速落地.快速试错,成为备受关注的问题.提升研发效率.缩短研发周期,保障产品快速试错并能快速迭代新功能,让新产品新功能以最快的速度同时抵达 A

Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段落,又是新一月,上月主要是围绕MediaPlayer相关展开,从今天开始,开始分析多媒体框架中的Camera模块,看下今天的Agenda: Camera拍照 Camera录像 新API android.hardware.camera2 新旧API特点对比 Camera自定义相机 新API andro

ffmpeg/camera实现最近很火的视频壁纸,相机壁纸

本篇实现一个有意思的玩意儿,视频壁纸,相机壁纸 这玩意好像现在还都是国外版本,哈哈 先上图: 视频壁纸 相机壁纸 1.动态壁纸制作的知识: 每一个动态壁纸都继承自WallpaperService,其中必须实现的抽象方法onCreateEngine,返回一个Engine对象,实际上所有的绘图与刷新都是由engine完成.如下 public class VideoLiveWallpaper extends WallpaperService { // 实现WallpaperService必须实现的抽象

DirectX 9.0 (12) FPS相机

作者: i_dovelemon 来源:CSDN 日期:2014 / 9 / 25 主题: View Space, Perspective Matrix 引言 在游戏中,我们能够很容易的在3D世界中漫游.要完成这样的功能,我们就需要定制自己的相机.在这里,我们来一起实现一个类似FPS游戏中的第一人称相机,让你能够自由自在的在3D世界中遨游. 相机功能 要想实现FPS的相机,那么我们首先要做的就是确定FPS游戏中相机的功能有哪些了.我们可以想象下,在CF或者COD中,我们能够通过鼠标的移动来改变相机

照片库、相机

1. 照片库 1.1 操作照片库 1> 添加照片 2> 删除照片 1.2 访问照片库 1.3 定制照片 1> 照片来源 2> 设置照片的可编辑性 1.4 设置相机 1> 打开相机 2> 设置相机模式 3> 设置闪光灯 4> 设置摄像头 1.5 照片库的应用 - 背景选择

安卓ROM简单定制、打包、签名、换字体

首先下载一个ROM主要是ZIP格式的. 一.下载一个ZIP格式的ROM解压,一个ROM的结构其实以CM7官方为例,很简单如下 01.META-INF 02.system 03.boot.img复制代码 当然有的也包含有DATA文件夹,那么这些是干嘛的呢!META-INF\com\google\android\updater-script放的是刷机脚本,刷进机器就靠这些脚本,一般不用动就行. system里面放的是系统文件夹 01.system\app system\bin 02.system\e

android 定制目录

首先简单介绍一下安卓系统文件夹对照表 主要介绍的是Android系统的文件夹结构,帮助大家更直观地了解系统 \\system\\app这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件.在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\\data\\文件夹中. 下面是详细的介绍: \\system\\bin这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件,Android手

定制着色器和渲染后期处理

1.设置后期处理 设置Three.js库为后期处理做准备,我们需要通过以下步骤对当前的配置进行修改: 1)创建一个EffectComposer(效果组合器)对象,然后在该对象上添加后期处理通道. 2)配置该对象,使它可以渲染我们的场景,并应用额外的后期处理步骤. 3)在render循环中,使用EffectComposer渲染场景.应用通道,并输出结果. 要使用后期处理,需要引入一些javaSscript文件.这些文件可以在Three.js发布包里找到.路径是examples/js/postpro

Android相机开发那些坑

版权声明:本文由王梓原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/168 来源:腾云阁 https://www.qcloud.com/community 最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸(1:1或3:4)的照片,并支持在拍摄出的照片上做贴纸相关的操作.由于之前没有接触过Android相机开发,所以在整个开发过程中踩了不少坑,费了不少时间和精力.这篇文章总