安卓怎么实现改变android camera 预览实时预览时的图像

通过以下两种方式,可以在应用程序中使用摄像机
使用现有应用程序中Android摄像头应用程序
直接使用应用程序提供的Android摄像头API
使用现有应用程序的Android摄像头应用程序
使用 MediaStore.ACTION_IMAGE_CAPTURE 启动安装在手机上的摄像头应用程序。它的语法下面给出:
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
除了以上,也可以通过 MediaStore 提供其它可用的意图。它们列出如下
意图类型和说明
ACTION_IMAGE_CAPTURE_SECURE
它返回照相机拍摄到的图像,设备被固定
ACTION_VIDEO_CAPTURE
它调用已有的视频应用程序在Android中捕获视频
EXTRA_SCREEN_ORIENTATION
它是用来在屏幕的方向设置:垂直或横向
EXTRA_FULL_SCREEN
它被用来控制ViewImage的用户接口
INTENT_ACTION_VIDEO_CAMERA
这个意图是用来启动摄像机在视频模式
EXTRA_SIZE_LIMIT
它用于指定的视频或图像捕获尺寸大小限制
现在使用startActivityForResult()函数推出活动,并等待它的结果。它的语法下面给出:
startActivityForResult(intent,0)
这种方法已在活动&activity&类被定义。从主活动调用它。有在做同样的工作的活动类中定义的方法,但是当它不是从活动要求,但在其他地方使用。它们被列在下面:
活动功能说明
startActivityForResult(Intent intent, int requestCode, Bundle options)
它开始的活动,但可以利用它选择额外的包
startActivityFromChild(Activity child, Intent intent, int requestCode)
启动活动时,活动是任何其他活动的子活动
startActivityFromChild(Activity child, Intent intent, int requestCode, Bundle options)
它的工作与上述相同,但它可以在捆绑与它的形状采取额外的值
startActivityFromFragment(Fragment fragment, Intent intent, int requestCode)
它启动的碎片活动当前所在内部
startActivityFromFragment(Fragment fragment, Intent intent, int requestCode, Bundle options)
它不仅启动从碎片的活性,但可以采用额外的值
不管用来启动其活动功能,它们都返回结果。其结果可以通过覆盖 onActivityResult 方法获得。
这里有一个例子,说明如何启动现有的摄像机应用程序捕获的图像和位图的形式显示结果
为了试验这个例子,需要在支持摄像机的实际设备上运行此应用程序。
使用Eclipse IDE创建Android应用程序,并将其命名为Camera。在创建这个项目,确保目标SDK编译在Android SDK中的最新版本或使用更高级别的API。
修改src/MainActivity.java&文件中添加意图启动活动代码,由result方法来接受输出。
修改所需的布局XML文件&res/layout/activity_main.xml&添加GUI组件。在这里,我们只添加ImageView和一个TextView
修改res/values/strings.xml&定义所需的常量值
运行应用程序并选择运行Android设备,并在其上安装的应用和验证结果。
以下是修改后的主活动文件的内容:src/com.yiibai.camera/MainActivity.java.
package com.example.camera;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class MainActivity extends Activity {
ImageView imgFavorite;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgFavorite = (ImageView)findViewById(R.id.imageView1);
imgFavorite.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
public void open(){
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
Bitmap bp = (Bitmap) data.getExtras().get(&data&);
imgFavorite.setImageBitmap(bp);
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
以下是文件&res/layout/activity_main.xml file 的内容:
xmlns:android=&/apk/res/android&
xmlns:tools=&/tools&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:paddingBottom=&@dimen/activity_vertical_margin&
android:paddingLeft=&@dimen/activity_horizontal_margin&
android:paddingRight=&@dimen/activity_horizontal_margin&
android:paddingTop=&@dimen/activity_vertical_margin&
tools:context=&.MainActivity&
android:id=&@+id/imageView1&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:layout_marginLeft=&34dp&
android:layout_marginTop=&36dp&
android:contentDescription=&@string/hello_world&
android:src=&@drawable/ic_launcher&
android:id=&@+id/textView1&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_alignParentTop=&true&
android:layout_alignRight=&@+id/imageView1&
android:text=&@string/tap&
android:textAppearance=&?android:attr/textAppearanceLarge&
以下将是&res/values/strings.xml&的内容,以定义一个新的常量
&?xml version=&1.0& encoding=&utf-8&?&
name=&app_name&Camera
name=&action_settings&Settings
name=&hello_world&Hello world!
name=&tap&Tap the image to open the camera!!
以下是 AndroidManifest.xml 的默认内容:
&?xml version=&1.0& encoding=&utf-8&?&
xmlns:android=&/apk/res/android&
package=&com.yiibai.camera&
android:versionCode=&1&
android:versionName=&1.0&
android:minSdkVersion=&8&
android:targetSdkVersion=&17&
android:allowBackup=&true&
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@style/AppTheme&
android:name=&com.yiibai.camera.MainActivity&
android:label=&@string/app_name&
android:name=&android.intent.action.MAIN&
android:name=&android.intent.category.LAUNCHER&
让我们试着运行相机应用程序。假设已经连接实际的Android移动设备到计算机。显示如下窗口,选择要运行的Android应用程序的选项。
选择移动设备作为一个选项,然后检查您的移动设备将显示如下界面:
现在只需轻点图标的android的图像,相机将被打开。只需拍摄一张照片。捕获后,两个按钮就会出现或者把它丢弃
只需按下抽动(绿色)按钮,将被带回应用程序使用Android图标拍摄的图像
直接使用应用程序提供的Android摄像头API
使用照相机API给摄像机整合在应用中
首先,需要使用静态方法通过API calledCamera.open提供并初始化相机对象。它的语法如下:
Camera object = null;
object = Camera.open();
除了上述功能,也有这是下面列出由Camera类提供的其它功能
方法 & 描述
getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo)
它返回一个特定摄像机信息
getNumberOfCameras()
它返回限定的可用的设备上的照相机的整数
它被用来锁定相机,所以没有其他应用程序可以访问它
它被用来释放在镜头锁定,所以其他应用程序可以访问它
open(int cameraId)
它是用来打开特定相机时,支持多个摄像机
enableShutterSound(boolean enabled)
它被用来使能/禁止图像俘获的默认快门声音
现在,需要做一个独立的类和SurfaceView扩展它并实现SurfaceHolder接口。
已经使用的两种类具有以下目的
它是用来控制摄像机和拍摄图像或从相机拍摄的视频
SurfaceView
这个类是用来展示实时摄像头预览给用户
必须调用摄像机类的预览方法来启动摄像机的预览给用户
public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
private Camera theCamera;
public void surfaceCreated(SurfaceHolder holder) {
theCamera.setPreviewDisplay(holder);
theCamera.startPreview();
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3){
public void surfaceDestroyed(SurfaceHolder arg0) {
除了预览,可以使用照相机API提供的其它功能中设置的摄像机的其它选项
方法 & 描述
startFaceDetection()
此功能启动人脸检测相机
stopFaceDetection()
它是用来阻止其通过上述功能启用的脸部检测
startSmoothZoom(int value)
这需要一个整数值,并调整摄像机的焦距非常顺畅的值
stopSmoothZoom()
它是用来阻止摄像机的变焦
stopPreview()
它是用来阻止相机的预览给用户
takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)
它被用来使能/禁止图像拍摄的默认快门声音
下面的例子演示了摄像机API的应用程序中的使用
为了试验这个例子中,需要搭载最新的Android OS实际的移动设备,因为摄像机不支持模拟器
使用Android Studio创建Android应用程序,并将其命名为:Camera。在创建这个项目,确保目标SDK和编译在Android SDK的最新版本或使用更高级别的API。
修改src/MainActivity.java文件引用添加摄像机的代码,并获得了XML的组件
创建一个新的文件ShowCamera.java使用SurfaceView扩展和实现SurfaceHolder接口。
修改所需的布局XML文件res/layout/activity_main.xml&添加GUI组件。在这里我们只添加FrameView,一个按钮和一个ImageView。
修改 res/values/strings.xml&定义所需的常量值
修改 AndroidManifest.xml&如下图所示,添加必要的权限摄像机
运行应用程序并选择运行Android的设备,并在其上安装的应用和验证结果。
下面是修改后的主活动文件&src/com.yiibai.camera1/MainActivity.java.&的内容。
package com.example.camera1;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Camera cameraObject;
private ShowCamera showCamera;
private ImageView pic;
public static Camera isCameraAvailiable(){
Camera object = null;
object = Camera.open();
catch (Exception e){
return object;
private PictureCallback capturedIt = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);
if(bitmap==null){
Toast.makeText(getApplicationContext(), &not taken&, Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), &taken&, Toast.LENGTH_SHORT).show();
cameraObject.release();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pic = (ImageView)findViewById(R.id.imageView1);
cameraObject = isCameraAvailiable();
showCamera = new ShowCamera(this, cameraObject);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(showCamera);
public void snapIt(View view){
cameraObject.takePicture(null, null, capturedIt);
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
创建新java文件:src/com.yiibai.camera1/ShowCamera.java.&并添加以下代码&
package com.example.camera1;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holdMe;
private Camera theCamera;
public ShowCamera(Context context,Camera camera) {
super(context);
theCamera = camera;
holdMe = getHolder();
holdMe.addCallback(this);
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
public void surfaceCreated(SurfaceHolder holder) {
theCamera.setPreviewDisplay(holder);
theCamera.startPreview();
} catch (IOException e) {
public void surfaceDestroyed(SurfaceHolder arg0) {
修改&res/layout/activity_main.xml&的内容&
&?xml version=&1.0& encoding=&utf-8&?&
xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:orientation=&horizontal&
android:layout_width=&wrap_content&
android:layout_height=&match_parent&
android:layout_weight=&0.30&
android:orientation=&vertical&
android:id=&@+id/camera_preview&
android:layout_width=&fill_parent&
android:layout_height=&199dp&
android:id=&@+id/button_capture&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:onClick=&snapIt&
android:text=&@string/Capture&
android:id=&@+id/imageView1&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:scaleType=&fitXY&
android:src=&@drawable/ic_launcher&
& /LinearLayout&
修改&res/values/string.xml&的内容&
&?xml version=&1.0& encoding=&utf-8&?&
name=&app_name&Camera1
name=&action_settings&Settings
name=&hello_world&Hello world!
name=&Capture&Capture
修改AndroidManifest.xml&的内容,并添加必要的权限,如下图所示。
&?xml version=&1.0& encoding=&utf-8&?&
xmlns:android=&/apk/res/android&
package=&com.yiibai.camera1&
android:versionCode=&1&
android:versionName=&1.0&
android:minSdkVersion=&8&
android:targetSdkVersion=&17&
android:name=&android.permission.CAMERA&
android:name=&android.hardware.camera&
android:name=&android.hardware.camera.autofocus&
android:allowBackup=&true&
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@style/AppTheme&
android:name=&com.yiibai.camera1.MainActivity&
android:label=&@string/app_name&
android:name=&android.intent.action.MAIN&
android:name=&android.intent.category.LAUNCHER&
让我们试着运行&Camera&应用程序。假设已经连接实际的Android移动设备到计算机。启动应用程序之前会显示如下窗口,选择要运行的Android应用程序的选项。
选择移动设备作为一个选项,然后检查移动设备将显示如下界面:
相机将开始显示在上半屏的预览。只需点击捕捉按钮。现在,可以存储所拍摄的图像,将其上传到网上或者是放弃它。
本站所有代码下载:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"代码下载" 获取。
上一篇:下一篇:查看: 6941|回复: 8
android camera前摄像头预览时,左右反了
该用户从未签到主题帖子e币
本帖最后由 xuanf008 于
17:47 编辑
android 前摄像头拍照摄影预览的时候,左右对调了,也就是说Y轴反了。但是拍出来的效果是正的。
有没有什么办法可以使拍照为正的,拍出来的效果也是正的呢。(竖屏拍照的时候,上下对调了)
只修改上层,不修改中间层和底层的情况下,就是在预览的时候Y轴旋转180°。
望高手解释一下。最好能详细,谢谢
该用户从未签到主题帖子e币
有没有人晓得啊。
该用户从未签到主题帖子e币
哥帮你看看。你是要针对你的应用 还是针对板子来改呢
针对应用,我知道重底层改输出流好像可以实现,但是我通过修改上层预览效果实现!&
该用户从未签到主题帖子e币
ruanufo 发表于
哥帮你看看。你是要针对你的应用 还是针对板子来改呢
针对应用,我知道重底层改输出流好像可以实现,但是我通过修改上层预览效果实现!
该用户从未签到主题帖子e币
这个就得去底层改了
预览效果为什么不能改上层,就不能在上层显示的时候做控制了吗?&
该用户从未签到主题帖子e币
yida 发表于
这个就得去底层改了
预览效果为什么不能改上层,就不能在上层显示的时候做控制了吗?
该用户从未签到主题帖子e币
哎呀,我也遇到这个问题了。。谁能解答呢
签到天数: 4 天连续签到: 1 天[LV.2]偶尔看看I主题帖子e币
我遇到前置摄像头预览正常,拍出来的效果居然上下颠倒,有没有知道的?
该用户从未签到主题帖子e币
可以将拍照的结果,旋转90°,然后再显示出来,就ok了。反正我还是这样解决的,不知道你的具体情况是那样的
推荐阅读热门话题
61887420384328283281261252226218208204201192715
25&分钟前半小时前半小时前半小时前1&小时前2&小时前2&小时前2&小时前2&小时前2&小时前2&小时前5&小时前5&小时前5&小时前5&小时前6&小时前
Powered byhttp://blog.csdn.net/sevensundark/article/details/7433177
最近遇到的一个问题,app中有照相功能的预览画面,提供照相功能,在此画面打开的前提下,按关机键使机器进入休眠状态,然后再解除休眠回来,画面中的照相预览部分变成一片漆黑....可如果是app之间的切换(例如,Home键出去,再长按Home键回来)的话没有此问题。
最近遇到的一个问题,app中有照相功能的预览画面,提供照相功能,在此画面打开的前提下,按关机键使机器进入休眠状态,然后再解除休眠回来,画面中的照相预览部分变成一片漆黑....可如果是app之间的切换(例如,Home键出去,再长按Home键回来)的话没有此问题。
首先打log对比休眠和普通切换App应用,系统做的事情有哪些区别: 休眠--状况A
切换App--状况B
画面打开:
onCreate-&onRestoreInstanceState-&onStart-&onResume-&surfaceCreated-&surfaceChanged-&surfaceChanged
(surfaceChanged会执行两遍,还没研究为何)
1.进入休眠:onSaveInstanceState-&onPause
2.休眠解除:onResume
1.切出:onSaveInstanceState-&onPause-&surfaceDestroyed-&onStop
2.切回:onRestart-&onStart-&onResume-&surfaceCreated-&surfaceChanged
可以发现,休眠与解除休眠并没有像App切换那样做那么多事,surfaceDestroyed和surfaceChanged都没执行,代码中照相预览需要的Camera对象在surfaceDestroyed中进行释放,在surfaceCreated中进行实例化...
问题集中在上面两种变化状态都会执行的onPause方法里了,果然,onPause里也有对Camera对象进行释放的操作...
原因明了: 进入休眠状态时,执行了camera对象的释放,却在解除休眠状态时没有能执行surfaceCreated进行camera对象的实例化。
于是,删除onpause中释放camera对象的代码,大功告成......
不过,中间试验中发现个有趣的现象,预览用到的控件SurfaceView,取到这个对象,设置它的显示属性能够唤出surfaceDestroyed和surfaceCreated方法的执行。
在onPause中调用setVisibility(View.INVISIBLE)唤出surfaceDestroyed的执行,再在onResume中调用setVisibility(View.VISIBLE)唤出surfaceCreated的执行,同样解决问题。
为啥显示属性会触发到surfaceDestroyed和surfaceCreated,参考了一下源码,大概知道个所以然....
SurfaceView重写了父类(View)的setVisibility方法:
这里设置几个全局boolean变量,例如调用setVisibility(View.INVISIBLE)的时候,mViewVisibility和mRequestedVisible都被赋为false,然后调用updateWindow方法:
去除了多余不需要关心的代码,主要的代码如上。根据前面setVisibility方法里boolean变量的值,能推断出几个关键分歧判断变量的值。
setVisibility(View.INVISIBLE)的场合:
mVisible-&ture
mViewVisibility-&false
mRequestedVisible-&false
visibleChanged-&true
visible-&false
于是reportSurfaceDestroyed执行,surfaceCreated不执行
setVisibility(View.VISIBLE)的场合:
mVisible-&false
mViewVisibility-&true
mRequestedVisible-&true
visibleChanged-&true
visible-&true
于是reportSurfaceDestroyed不执行,surfaceCreated执行
源码才是王道.......
如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@ 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
用于实时预测用户对物品偏好,支持企业定制推荐算法,支持A/B Test效果对比
对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系...
基于全网公开发布数据、传播路径和受众群体画像,利用语义分析、情感算法和机器学习,分析公众对品牌形象、热点事件和公...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...}

我要回帖

更多关于 android camera 预览 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信