`
yunlonglove
  • 浏览: 241764 次
社区版块
存档分类
最新评论

Android照相机俩种常见的使用方式(一)

 
阅读更多

Android中实现拍照有两种方法,一种是调用系统自带的相机,然后使用其返回的照片数据。 还有一种是自己用Camera类和其他相关类实现相机功能,这种方法定制度比较高,洗染也比较复杂,这里我分别对这俩种方法进行了一顶的总结。

首先拿自己设定照相机这种方法来说,这个使用具有一定的局限性,因为有的现在手机设计样式不想以前那样,有个照相按钮,现在大部分都是设置在固定桌面进行拍照,所以使用受限,但在一定场合下还是可用的,下面就是先关代码:

首先我们还是先配置我们的AndroidManifest.xml文件 因为我们要访问照相机 SD卡对照片进行保存所以设置权限设置下面的语句:

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-permission android:name="android.permission.CAMERA" />

然后,我们应该对我们照相的界面进行配置 下面就是main.xml文件的设置:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<SurfaceView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:id="@+id/surface" />

</LinearLayout>

因为我们知道我们在做视屏播放器的时候也是用到的SurfaceView,这里也是用到其设置。要注意宽和高我们均设置全充满,不然效果不佳。

为了我们照相机效果更加完美,我们应该先将标题和状态栏去掉。下面开始我们的主程序代码,

public class MainActivity extends Activity {

private boolean preview;

private SurfaceView surfaceView;

private Camera camera;

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//去除title

requestWindowFeature(Window.FEATURE_NO_TITLE);

//去掉Activity上面的状态栏

getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,

WindowManager.LayoutParams. FLAG_FULLSCREEN);

//设置亮度

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

setContentView(R.layout.main);

surfaceView=(SurfaceView)this.findViewById(R.id.surface);

//设置分辨率

surfaceView.getHolder().setFixedSize(960, 640);

//下面主要是手机自身引擎将得到的画面输出

surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

surfaceView.getHolder().addCallback(new SurfaceCallback());

}

相关说明一下我们先要对我们的想要的照相机的界面进行相关的设置操作作为准备工作,所以设置一些基本硬件设置!而且我们在做照相机最重要的应用就是回调的应用!

private final class SurfaceCallback implements SurfaceHolder.Callback{

@Override

public void surfaceChanged(SurfaceHolder holder, int format, int width,

int height)

{

// TODO Auto-generated method stub

}

@Override

public void surfaceCreated(SurfaceHolder holder)

{

// TODO Auto-generated method stub

try

{

camera=Camera.open();

//从窗口管理器中得到屏幕

WindowManager windowManager=(WindowManager)getSystemService(Context.WINDOW_SERVICE);

Display display=windowManager.getDefaultDisplay();

//得到屏幕之后开始设置先关参数

Camera.Parameters parameters=camera.getParameters();

//得到预览图片的大小即为屏幕的尺寸 parameters.setPreviewSize(display.getWidth(),display.getHeight());

//设置每秒的帧数

parameters.setPreviewFrameRate(3);

//设置照片的输出格式

parameters.setPictureFormat(PixelFormat.JPEG);

//设置其照片的质量

parameters.set("jpeg-quality", 85);

//设置照片的大小

parameters.setPictureSize(display.getWidth(),display.getHeight());

camera.setParameters(parameters);

//通过surfaceView显示取景画面

camera.setPreviewDisplay(surfaceView.getHolder());

//开始预览

camera.startPreview();

preview=true;

} catch (IOException e)

{

// TODO Auto-generated catch block

System.out.print(e.toString());

}

}

@Override

public void surfaceDestroyed(SurfaceHolder holder)

{

// TODO Auto-generated method stub

if (camera!=null)

{

if(preview)

{

camera.stopPreview();

camera.release();

}

}

}

}

//按键处理

@Override

public boolean onKeyDown(int keyCode, KeyEvent event)

{

// TODO Auto-generated method stub

//单次处理 并且不为空

if (camera!=null&&event.getRepeatCount()==0)

{

switch (keyCode)

{

//自动对焦

case KeyEvent.KEYCODE_SEARCH:

camera.autoFocus(null);

break;

//照相处理

case KeyEvent.KEYCODE_CAMERA:

case KeyEvent.KEYCODE_DPAD_CENTER:

//自动调用下面的照相类进行处理

//照相的时候为内部处理 调用硬件实现 所以无法为大家呈现预览功能

camera.takePicture(null,null, new TakePicture());

//此时硬件正在处理图片 此刻无法进行预览 必须在下面进行预览

break;

default:

break;

}

}

return true;

}

下面就是当我们照完相的时候我们定要为我们的相片进行保存,这里默认保存的路径为SD卡,而且当我们照完相的时候定要想做下次照相的预览功能,所以我们应该将预览功能放在之后做,下面就是实现过程:

//内部类进行照相处理

private final class TakePicture implements PictureCallback

{

@Override

public void onPictureTaken(byte[] data, Camera camera)

{

// TODO Auto-generated method stub

//生成一张图片 并保存在SD卡上

try

{

Bitmap bitMap=BitmapFactory.decodeByteArray(data, 0, data.length);

File file=new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");

FileOutputStream outputStream=new FileOutputStream(file);

bitMap.compress(CompressFormat.JPEG,100 , outputStream);

outputStream.close();

//照完一张图片之后可以继续进行预览照相

camera.stopPreview();

camera.startPreview();

} catch (Exception e)

{

// TODO Auto-generated catch block

System.out.println(e.toString());

}

}

}

}

总体来说这种方法起自己感觉有时不是太合适,收到限制,所以要我选择的话我会选择调用自己手机里的照相机!在测试这个工程的时候我也是用别人老一代的安卓测试用的,新一代的onKeyDown不知如何让使用!先要看自动调用系统的请看我下一篇的文章!

分享到:
评论

相关推荐

    android照相机应用源码

    在Android平台上,开发一款照相机应用是相当常见的需求,它涉及到多媒体处理、用户界面设计以及硬件接口调用等多个方面。本资源"android照相机应用源码"提供了一个可以直接运行的Android相机应用示例,这对于初学者...

    android 照相机 demo

    android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo android 照相机 demo

    Android4.0.3照相机源码

    在Android 4.0.3(Ice Cream Sandwich)版本中,照相机功能是系统的核心组件之一,对于开发者来说,理解其源码可以帮助我们深入学习Android系统以及如何构建高性能、功能丰富的相机应用。以下是对Android 4.0.3照相机...

    Android照相机触屏对焦例子

    在Android平台上,开发一款带有照相功能的应用时,触屏对焦是一项常见的需求。这个"Android照相机触屏对焦例子"将引导我们了解如何实现这一功能。Android提供了丰富的API来支持摄像头操作,包括触屏对焦。我们将深入...

    delphi xe5 android 调用照相机获取拍的照片

    在本篇文章中,我们将探讨如何在 Delphi XE5 中使用 Android 平台的照相机组件,获取拍摄的照片。 使用 Delphi XE5 调用 Android 照相机的步骤 ----------------------------------- 要使用 Delphi XE5 调用 ...

    android 照相机源码 Camera源码

    在Android系统中,照相机功能是用户日常使用的重要部分,深入了解Android照相机的源码有助于开发者优化拍照体验、实现自定义功能或者解决相关问题。本文将深入探讨Android照相机源码,涵盖其核心组件、工作流程以及...

    Android照相机自动对焦例子

    在Android平台上,开发一款带有自动对焦功能的照相机应用是一项常见的需求。自动对焦能够帮助用户在不同的光照条件和拍摄场景下获得清晰的图像。本文将深入探讨如何在Android应用中实现这一功能,主要围绕以下几个...

    android照相机相册选择,可以多选

    本项目标题为“android照相机相册选择,可以多选”,说明它实现了在Android平台上让用户能够通过自定义的方式,不仅能够使用相机拍摄照片,还能够从相册中选取多张图片,并且具备删除已选择图片的功能。这一特性极大...

    android 照相机

    在Android平台上,开发照相机应用是一项常见的任务。本篇文章将深入探讨如何实现在Android中集成照相机功能,包括两种主要方法:直接定义照相机组件和调用系统内置的相机应用。 1. 直接定义照相机组件(Camera API...

    android照相机

    在Android平台上,开发一款照相机应用是一项常见的任务,它涉及到许多关键知识点,包括硬件权限管理、相机API的使用、图像处理、用户界面设计以及拍照功能的优化等。本项目提供的"android照相机"源码是一个基础框架...

    Android 照相机裁切图片

    在Android开发中,实现“Android 照相机裁切图片”的功能是常见的需求,尤其是在社交应用或者图片处理类应用中。这个功能允许用户拍摄照片后,根据自己的需要选择并调整图片的展示区域,以便精确地选取想要的部分。...

    Android照相机移动对焦例子

    在Android平台上,开发一款带有移动对焦功能的照相机应用是一项常见的需求。移动对焦,也称为自动对焦,允许用户通过触摸屏幕选择对焦点,从而优化拍摄效果。本篇文章将详细探讨Android照相机移动对焦的相关知识点,...

    delphi xe5 android 调用照相机摄像头拍照片camera

    在使用Delphi XE5开发Android应用程序时,调用照相机功能是常见的需求,以便让用户拍摄照片并集成到应用中。本示例着重讲解如何在Delphi XE5环境下,利用Android API来实现这一功能,无需额外的组件,只通过原生代码...

    Android编写的照相机

    在Android平台上,开发一款照相机应用是常见的任务之一。这个"Android编写的照相机"项目是一个基础的Demo,旨在帮助初学者理解如何在Android应用程序中集成相机功能。下面,我们将详细探讨这个Demo实现的关键知识点...

    Android 照相机

    本文将深入探讨Android照相机开发的相关知识点,包括API的使用、权限管理、相机配置、预览显示、图片捕获以及一些常见问题的解决策略。 1. **Android Camera API** Android提供了多种方式来访问和控制照相机。早期...

    delphi xe6 android 调用照相机摄像头拍照片

    在使用Delphi XE6开发Android应用程序时,调用照相机功能是常见的需求,这使得用户可以直接通过应用拍摄照片。本教程将详细讲解如何在Delphi XE6中实现这一功能,无需额外的组件,只需利用系统自带的功能,确保代码...

    Android 调用系统相册和系统照相机功能雨实例源码.zip

    在Android应用开发中,调用系统相册和相机功能是常见的需求,这使得用户能够方便地选择或拍摄图片,进一步增强应用的交互性。本文将详细介绍如何在Android中实现这两个功能,并提供相应的源码实例。 首先,我们来看...

    Android自定义照相机的实例

    在Android平台上,开发自定义照相机应用是一项常见的任务,它允许开发者根据特定需求定制相机功能和用户界面。本文将深入探讨如何实现这样一个自定义照相机实例,包括界面设计、权限管理、相机操作以及图片处理等...

    Android实现自定义照相机

    在Android平台上,自定义相机是一项常见的功能,它允许开发者根据特定需求定制相机界面和功能,以提供更加个性化和丰富的用户体验。下面将详细讲解如何在Android中实现自定义相机。 首先,你需要创建一个新的`...

Global site tag (gtag.js) - Google Analytics