Camera API Guides

原版地址:http://developer.android.com/guide/topics/media/camera.html

一、Camera

Android的框架支持各种各样的相机设备,让您可以在应用程序上拍摄图片和视频。本文档讨论了一个快速,简单的图像和视频捕捉方法,并概述了一种为您的用户创建自定义相机体验的先进方法。

二、Considerations

使您的应用程序在Android设备上使用相机之前,你应该考虑一些问题,你的应用程序打算如何使用这些硬件功能。

三、The Basics

1.Camera类
这个类是控制camera设备的主要API。当你编译好这个摄像头应用程序后,这个类可以用于拍摄照片或录像。
2.SurfaceView类
这个类是用来给用户提供摄像头预览。
3.MediaRecorder类
这个类用于录制来自camera的视频。
4.Intent类
使用intent类型MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.ACTION_VIDEO_CAPTURE可以被用于捕捉图像或视频,而不需要使用相机对象

四、Manifest DeclaratCions

在开始开发你的Camera应用程序之前,你应该确保你的清单有相应的声明以允许使用相机硬件和其他相关功能。

1.Camera Permission
你的应用程序必须有相应的权限才可以使用设备摄像头。

<uses-permission android:name="android.permission.CAMERA" />
注意:如果你通过intent来使用camera,你的应用程序就不需要申请这个权限.

2.Camera Features
你的应用程序必须声明camera属性的使用,比如:

<uses-feature android:name="android.hardware.camera" />
如果你的应用程序可以使用camera或者camera的正常操作属性,但是不需要这个属性。可以如下设置:
<uses-feature android:name="android.hardware.camera" android:required="false" />
3.Storage Permission
如果你的应用程序将图像和视频保存在SD卡上,你必须如下设置:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
4.Audio Recording Permission

要在视频模式下录音,你的应用程序必须有一下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" />
5.Location Permission
如果你的照片上需要位置信息,必须有下面的权限

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

五、Using Exsting Camera Apps
在你的应用程序上快速的拍照和拍摄视频的方法是使用intent来调用已经存在的Android Camera App。camera intent可以发出一个请求来通过现有的相机应用程序拍摄照片或视频剪辑,然后将控制权返回到您的应用程序。这个部分将向你展示如何使用这个技术来拍照或者拍摄视频。

调用camera intent的过程遵循以下一般步骤:

1.Compose a Camera Intent
使用下面其中一个intent类型来创建一个intent来请求拍照或视频:MediaStore.ACTION_IMAGE_CAPTURE:拍照 MediaStore.ACTION_VIDEO_CAPTURE :视频
2.Start the Camera Intent
使用 startActivityForResult()方法来执行camera intent,在开始这个intent后,camera应用程序接口就会在设备屏幕上出现,然后用户就可以拍照或者视频了。
3.Receive the Intent Result
使用 onActivityResult()方法来接收来自camera的intent。当用户完成了拍照和视频,系统会调用这个方法

Image capture intent
image capture intent可以包含下面额外的信息:MediaStore.EXTRA_OUTPUT :
这个设置需要一个Uri目标来指定一个路径和文件名决定在哪保存图片。这个设置是可选的,但是强烈推荐使用的。如果你没有指定这个值,camera app会将图片以默认的名字存放在一个默认的地方(由Intent.getData()的返回值决定)。
下面的例子解析了如何创建一个image capture intent并执行。方法getOutputMediaFileUri()可以参考下面的样例 Saving Media Files

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // create Intent to take a picture and return control to the calling application
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
当startActivityForResult()方法执行了,用户就可以看到camera app的接口了。当用户拍照结束(或者取消操作),用户接口就会返回你的应用程序,你必须截取onActivityResult()方法来接收intent的结果并且继续你的程序的执行。如何去接收完整的intent,可以参考 Receiving camera intent result.

Video capture intent
Video capture intent可以包含下面额外的信息:
1.MediaStore.EXTRA_OUTPUT
这个设置需要一个Uri目标来指定一个路径和文件名决定在哪保存视频。这个设置是可选的,但是强烈推荐使用的。如果你没有指定这个值,camera app会将视频以默认的名字存放在一个默认的地方(由Intent.getData()的返回值决定)。
2.MediaStore.EXTRA_VIDEO_QUALITY
这个值可以为:0:低质量和小尺寸;1:高质量和大尺寸。
3.MediaStore.EXTRA_DURATION_LIMIT :设置这个值来限制长度(单位为秒)在拍摄视频模式。
4.MediaStore.EXTRA_SIZE_LIMIT:设置这个值来限制文件的大小(单位是bytes)
下面的例子解析了如何创建一个image capture intent并执行。方法getOutputMediaFileUri()可以参考下面的样例 Saving Media Files

private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //create new Intent
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);  // create a file to save the video
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  // set the image file name

    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

    // start the Video Capture Intent
    startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}
当startActivityForResult()方法执行了,用户就可以看到camera app的接口了。当用户拍照结束(或者取消操作),用户接口就会返回你的应用程序,你必须截取onActivityResult()方法来接收intent的结果并且继续你的程序的执行。如何去接收完整的intent,可以参考下面那个部分

六、Receiving camera intent result
一旦你已经构造并执行了图像或视频摄像头的intent,你的应用程序必须被配置接收intent的结果。本节将向您介绍如何拦截来自camera intent的回调,从而使您的应用程序可以做进一步的处理捕获的图像或视频工作。
为了接收来自intent的结果,你必须在启动intent的activity中复写activity方法onActivityResult()。下面例子展示了如何复写onActivityResult()来截取image camera intent或ideo camera intent。

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }

    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Video captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Video saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the video capture
        } else {
            // Video capture failed, advise user
        }
    }
}
一旦您的activity获得成功的结果,拍摄的图像或视频可在你的应用程序访问的指定位置。

七、Buiding a Camera App
有些开发者可能需要一个摄像头的用户接口来定制他们的应用程序的外观或提供特殊功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值