AndroidCamera开发学习笔记01

概述

  • Android框架支持设备的相机拍照录像功能
    • 可以直接调用系统的Camera应用来拍照或录像
    • 也可以利用Adroid系统提供的API开发Camera应用来实现拍照和录像的功能

注意事项

  • 需要硬件支持
  • 建议优先使用系统相机应用,也可以自己开发一个相机应用
  • 拍摄的照片和视频是否对其他应用可见
  • 应用被卸载以后,是否保留拍摄的照片和视频文件

基础知识

  • Camera:提供基础API使用设备的相机,并为应用提供拍照和录像的API
  • SurfaceView:用于显示相机的预览数据
  • MediaRecord:提供录像相关的API
  • Intent:
    • 使用MediaStore.ACTION_IMAGE_CAPTURE进行快速拍照
    • 使用MediaStore.ACTION_VIDEO_CAPTURE进行快速录像。

权限声明

  • Camera Permession

    • 在开发相机应用前,需要在Manifest中申请如下权限才可以使用相机
    • 如果使用Intent发送快速拍照请求,则无需申请该权限
  • Storage Permession

    • 如果应用保存保持照片或视频到设备存储中,需要指定文件的写权限
  • Audio Recording Permession

    • 必须申请录音权限才能使用相机进行录像
  • Location Permession

    • 如果应用需要拍摄的照片记录地理位置,需要申请定位权限

使用已存在的相机应用拍摄

  • 在应用中可以通过发送一个Intent到系统相机应用来实现一个快速拍照或录像的功能
    • ​创建Intent请求用来拍照或录像,有关的Intent类型如下:
      • MediaStore.ACTION_IMAGE_CAPTURE - 该Intent action 类型用于请求系统相机拍照。
      • MediaStore.ACTION_VIDEO_CAPTURE - 该Intent action 类型用于请求系统相机录像。
    • ​调用Activity的startActivityForResult()方法来发送Camera Intent请求拍照或者录像,当发送Intent以后,当前应用会跳转到系统相机app界面,让用户进行拍照或录像
    • 在Activity中实现onActivityResult()方法来接收系统相机的拍摄结果,该方法在用户完成拍照或者录像以后由系统调用

使用Intent拍照

  • 发送Intent拍照携带的外部数据的信息如下:
    • MediaStore.EXTRA_OUTPUT
    • 这个关键字用于创建一个Uri对象来指定一个路径和文件名保存照片。当然,这个设置是可选的,不过强烈推荐使用该方法来保存照片。如果你没有在指定该关键字的值,系统的camera应用会将照片以默认的名字保存在一个默认的地方,当你指定了该关键字的值,数据以Intent.getData()方法返回Uri对象。
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() 方法以后,用户可以看到系统相机的拍照界面。在用户拍照结束以后(或者取消拍照),系统相机会把照片数据返回给你的应用,当然你必须在自己的应用中实现onActivityResult()方法来接收照片数据。

使用Intent录像

  • 发送Intent录像携带的外部数据extra的信息如下:
    • ​MediaStore.EXTRA_OUTPUT
      • 该关键字和拍照使用的关键字一样,意思就是制定一个路径和文件名来构建一个U日对象来保存录像结果,同样录像结果会以Intent.getData()的方法返回Uri对象。
    • ​MediaStore.EXTRA_VIDEO_QUALITY
      • 该关键字用于指定拍摄的录像质量,参数0表示低质量,参数1表示高质量。
    • MediaStore.EXTRA_DURATION_LIMIT
      • 该关键之用于指定拍摄的录像的时间限制,单位是秒。
    • MediaStore.EXTRA_SIZE_LIMIT
      • 该关键字用于指定拍摄的录像文件大小限制,单位值byte。
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() 方法以后,用户可以看到系统相机的拍照界面。在用户录像结束以后(或者取消录像),系统相机会把视频数据返回给你的应用,当然你必须在自己的应用中实现onActivityResult()方法来接收视频数据。更多有关如何在自己的应用接收拍照结果的信息请参考接收相机返回的数据。

接收相机返回的数据

  • 为了接收Intent的结果数据,你必须重写activity的onActivityResult()方法。接下来的代码将演示如何实现onActiviytResult()方法来接收照片或者视频数据。
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:
" +
                     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:
" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the video capture
        } else {
            // Video capture failed, advise user
        }
    }
}

一旦你的activity成功接收返回结果,相机拍摄的照片或者视频是一个指向你应用可以访问的路径。也就是getOutputMediaFileUri()方法返回的Uri文件地址。

原文地址:https://www.cnblogs.com/coderwjq/p/6914026.html