自定义Camera综述(一般步骤、注意事项、遇到的难题<【内存溢出问题】>、像素参考)
一般步骤:
1. 检查和访问Camera:创建代码来检查Camera和所申请访问的存在性;
2. 创建一个预览类:继承SurfaceView来创建一个Camera的预览类,并实现SurfaceHolder接口。这个类用来预览来自Camera的实时图像。
3. 构建一个预览布局:一旦有了Camera预览类,就可以把这个预览类和你想要的用户界面控制结合在一起来创建一个视图布局。
4. 针对采集建立监听:把监听器与响应用户动作(如按下按钮)的界面控制连接到一起来启动图像或视频的采集。
5. 采集和保存文件:针对真正采集的图片或视频,以及输出的保存来编写代码。
6. 释放Camera:使用Camera之后,你的应用程序必须释放Camera,以便其他应用程序能够使用。
注意事项:
Camera硬件是一个必须要认真管理的共享资源,因此你的应用程序在使用它时,不能跟其他应用程序发生冲突。(以后会讨论如何检查Camera硬件、如何申请对Camera的访问,如何采集图片和视频,以及在应用使用完成后如何释放Camera。)
警告:在应用程序使用完Camera时,要记住通过调用Camera.release()方法来释放Camera对象。如果你的应用程序没有正确的释放Camera,所有的后续的视图对Camera的访问,包括你自己的应用程序,都会失败,并可能到你的或其他的应用程序关闭。
遇到的难题:
1、Activity之间切换出现短暂黑屏。
在默认情况下,Android应用程序启动时,会有一个黑屏的时期。同样,使用startActivity(intent)方法从一个Activity进入到新的Activity时,这个过程中也会出现短暂的黑屏。原因是,首个activity会加载一些数据,比如初始化列表数据、向服务器发送请求获取数据等等。这个问题的存在是由Android应用框架决定的,但的确很影响用户体验。下面就动手来解决这个黑屏问题!
第一步:自定义Theme(主题)——使目标Activity透明
在your_project/res/values/styles.xml中加入自定义Activity的Theme,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Activity主题 -->
<style name="activityTheme" parent="@android:style/Theme">
<item name="android:windowIsTranslucent">true</item>
</style>
</resources>
其中<item name="android:windowIsTranslucent">true</item>的意思是设置目标Activity(要启动的那个Activity)是透明的。很容易理解,两个Activity,A和B;在A中启动B,因为B是透明的,看到的背景仍是A,这样就解决了这个短暂的黑屏问题。
第二步:修改Manifest,将Theme应用到目标Activity上
定义好Theme后,就该为对应的Activity绑定Theme了。这个代码主要在Manifest中实现,在Activity中加上以下属性:
<activity android:name=".activity.PlacingOrderStep1Activity" android:theme="@style/activityTheme" />
到此问题解决!
2、图片处理出现内存溢出问题。
原因:
- 大量使用createBitmap、setImageBitmap、setImageResource、BitmapFactory.decodeResource来设置一张大图;因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。
- 对处理完的Bitmap未进行显式的回收操作。if(bitmapObject.isRecycled()==false) //如果没有回收 { bitmapObject.recycle(); }
解决方法:
- 在左右旋转图片时采用:
通过BitmapFactory.decodeStream方法,创建bitmap,再将其设为ImageView的 source;decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。BitmapOrgLeft = BitmapFactory.decodeStream(new FileInputStream(MatrixLeftFile), null, RotateOptions);
采用压缩转档方法:BitmapOrgLeft.compress(Bitmap.CompressFormat.JPEG, 100, bos);
- 在其他特效处理时采用:
通过【线程】处理图片,将Bitmap转换为Drawable来处理,进而使用setImageDrawable(BitmapDrawable)来显示图片。
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Drawable targetBitmapDrawable = new BitmapDrawable((Bitmap) msg.obj);// 将Bitmap转换为Drawable
is.setImageDrawable(targetBitmapDrawable);
}
};
每次线程处理完图片,都进行线程的回收。
thread.start();
thread = null;
到此问题【部分】解决,最终只能做到最大5M的图片处理!
像素参考:
800万 3264x1836 8M
500万 2592x1944 5 M(目前已实现的)
300万 2048x1536 3.2M
UXGA 1600x1200 1920x1088 2M
XGA 1024x768 0.8M SVGA 800x600
VGA 640x480 0.3M
自定义Camera综述(一般步骤、注意事项、遇到的难题<【内存溢出问题】>、像素参考)的更多相关文章
- Android Camera开发系列(下)——自定义Camera实现拍照查看图片等功能
Android Camera开发系列(下)--自定义Camera实现拍照查看图片等功能 Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 上 ...
- 自定义Dialog的详细步骤(实现自定义样式一般原理)
现在很多App的提示对话框都非常有个性,然而你还用系统的对话框样式,是不是觉得很落后呢,今天我就给大家讲讲怎样自定义自己的Dialog,学会了之后,你就会根据自家app的主题,设计出相应的Dialog ...
- Android 自定义Camera 随笔
一.权限 <uses-permission android:name="android.permission.CAMERA" /> <uses-permiss ...
- android自定义相册 支持低端机不内存溢出
1 之前在网上看的自定义相册很多时候在低端机都会内存溢出开始上代码把 首先我们要拿到图片的所有路径 cursor = context.getContentResolver().query( Media ...
- [Android] 对自定义图片浏览器经常内存溢出的一些优化
首先关于异步加载图片可以参见 夏安明 的博客:http://blog.csdn.net/xiaanming/article/details/9825113 这篇文章最近有了新的更改,大概看了一下,内容 ...
- React Native绑定微信分享/登录/支付(演示+实现步骤+注意事项)
React Native(以下简称RN)绑定微信分享/微信登录/微信支付的实现演示+源码+注意事项!微信的调用大同小异,本文实现了微信的分享功能,其他功能可以在链接文档里面找到具体的方法. 本文分文三 ...
- HanLP的自定义词典使用方式与注意事项介绍
[环境]python 2.7 方法一:使用pyhanlp,具体方法如下: pip install pyhanlp # 安装pyhanlp 进入python安装包路径,如 /usr/lib/pytho ...
- MIP组件开发 自定义js组件开发步骤
什么是百度MIP? MIP(Mobile Instant Pages - 移动网页加速器)主要用于移动端页面加速 官网参考:https://www.mipengine.org/doc/00-mip-1 ...
- android自定义camera以及uri和文件路径之间的转换
相对直接调用系统的camera,这种方法使用得相对还少一些.根据api文档,步骤如下: 定义一个预览类 可以参照<android高薪之路>这本书上面,有这种方法的一种完整实现 而对应的ac ...
随机推荐
- Arcgis Engine最短路径分析
ArcEngine 最短路径分析(源码) using System; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI ...
- yii2 学习中
属性: public function __get($name) // 这里$name是属性名 { $getter = 'get' . $name; // getter函数的函数名 if (metho ...
- Quartz 并发/单线程
Quartz 并发/单线程 Quartz定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行, 如果定时任执行太长,会长时间占用资源,导致其它任务堵塞.1.在Spring中这 ...
- 258. Add Digits
题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...
- newClass a = Func(3)中隐藏的操作
缘起 #include <iostream> #include <bitset> using namespace std; class A { public: A() { co ...
- javascript精确计算
一篇文章: 4 个用于执行高级数学计算的 JavaScript 库 numbers.js Numeric Javascript accounting.js Tangle 有时只需要加减乘法能精确,没 ...
- QTP鼠标点击和浏览器事件的动态切换
今天在群里有人问到一个问题,我觉得应该会有很多人会碰到,今天根据自己的思路把这个解决方案整理出来,供自己和大家参考 需求描述: 当输入一个身份证号码的时候,这个号码所对应的数据会被加载到所属的省和市的 ...
- 安卓开发44:解决 INSTALL_FAILED_UID_CHANGED 等问题
apk无法卸载,一般可以下面的方法试一下: 1. 删除/data/app/(filename) 文件夹下的apk包 2. 删除/system/app/(filename) 文件夹下的apk包 3. 将 ...
- Oracle VM VirtualBox虚拟机安装系统
作为一个前端,必须要有自己的虚拟机,用于测试 IE6 .IE7浏览器. 要测试这两个浏览器,必须要是 Windows XP 系统才可以,这里我找到两个纯净版的 xp 系统 iso 镜像文件. http ...
- 栈中的push实现