博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android--调用系统照相机拍照与摄像
阅读量:6276 次
发布时间:2019-06-22

本文共 8113 字,大约阅读时间需要 27 分钟。

系统现有相机应用的调用

  对于如何调用系统现有应用,之前就有讲解,这里简单再说一下。在开发的应用中调用系统现有应用,需要使用Intent指定开启的应用的Action和Category,然后通过startActivity(Intent)或者startActivityForResult(Intent,int)开启指定的Activity,如果使用startActivityForResult()方法开启并需要返回值,再重写onActivityResult(int,int,Intent)即可。

  先来看看系统现有相机应用的AndroidManifest.xml清单文件定义的Activity:

1         
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
30
31
32
33
34
35
36
37
38

 

  它定义了两个Activity,com.android.camera.Camera表示照相机,com.android.camera.VideoCamera表示摄像机。从字面意思可以看出,为了捕获系统相机返回的数据,一般需要使用一下两个Action即可开启照相机与摄像机:

  • android.media.action.IMAGE_CAPTURE:Intent的Action类型,从现有的相机应用中请求一张图片。
  • android.media.action.VIDEO_CAPTURE:Intent的Action类型,从现有的相机应用中请求一段视频。

  上面两个参数,均在MediaStore类中以静态常量的形式定义好了,分别是:MediaStore.ACTION_IMAGE_CAPTURE(相机)MediaStore.ACTION_VIDEO_CAPTURE(摄像机)。

 

系统现有相机拍摄照片

  上面介绍到,开启系统现有相机应用拍摄照片,需要用的MediaStore.ACTION_IMAGE_CAPTURE作为Intent的action开启Activity即可。但是在使用系统现有相机用用的时候,默认会把图片保存到系统图库的目录下,如果需要指定图片文件的保存路径,需要额外在Intent中设置。

  设置系统现有相机应用的拍摄照片的保存路径,需要用Intent.putExtra()方法通过MediaStore.EXTRA_OUTPUT去设置Intent的额外数据,这里传递的是一个Uri参数,可以是一个文件路径的Uri。

1             Intent intent=new Intent(); 2             // 指定开启系统相机的Action 3             intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); 4             intent.addCategory(Intent.CATEGORY_DEFAULT); 5             // 根据文件地址创建文件 6             File file=new File(FILE_PATH); 7             // 把文件地址转换成Uri格式 8             Uri uri=Uri.fromFile(file); 9             // 设置系统相机拍摄照片完成后图片文件的存放地址10             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

 

获取系统现有相机拍摄的图片

  在新开启的Activity中,如果需要获取它的返回值,则需要使用startActivityForResult(Intent,int)方法开启Activity,并重写onActivityResult(int,int,Intent)获取系统相机的返回数据,那么我们只需要在onActivityResult()中获取到返回值即可。

  系统相机拍摄的照片,如果不指定路径,会保存在系统默认文件夹下,可以使用Intent.getExtra()方法得到,得到的是一个Uri地址,表示了一个内容提供者的地址。如果通过MediaStore.EXTRA_OUTPUT指定了保存路径,那么通过Intent.getExtra()得到的将是一个空地址,但是既然是我们指定的地址,那么也不愁找不到它了。

 

系统现有相机拍摄图片Demo

  上面讲解了如何在开发的应用中使用系统相机拍摄照片并获得它所涉及到的内容,下面通过一个简单的Demo演示一下。在Demo中,有两个Button分别以指定路径的方式和不指定路径的方式启动系统相机,并获取返回值显示到ImageView中,Demo中注释比较详细,这里不再累述了。

  布局代码:activity_syscamera.xml

 
View Code

  实现代码:SysCameraActivity.java

1 package cn.bgxt.callsystemcamera; 2  3 import java.io.File; 4  5 import android.app.Activity; 6 import android.content.Intent; 7 import android.graphics.Bitmap; 8 import android.graphics.BitmapFactory; 9 import android.net.Uri;10 import android.os.Bundle;11 import android.provider.MediaStore;12 import android.util.Log;13 import android.view.View;14 import android.widget.Button;15 import android.widget.ImageView;16 17 public class SysCameraActivity extends Activity {18     private Button btn_StartCamera, btn_StartCameraInGallery;19     private ImageView iv_CameraImg;20 21     private static final String TAG = "main";22     private static final String FILE_PATH = "/sdcard/syscamera.jpg";23 24     @Override25     protected void onCreate(Bundle savedInstanceState) {26         super.onCreate(savedInstanceState);27         setContentView(R.layout.activity_syscamera);28 29         btn_StartCamera = (Button) findViewById(R.id.btn_StartCamera);30         btn_StartCameraInGallery = (Button) findViewById(R.id.btn_StartCameraInGallery);31         iv_CameraImg = (ImageView) findViewById(R.id.iv_CameraImg);32 33         btn_StartCamera.setOnClickListener(click);34         btn_StartCameraInGallery.setOnClickListener(click);35     }36 37     private View.OnClickListener click = new View.OnClickListener() {38 39         @Override40         public void onClick(View v) {41             42             Intent intent = null;43             switch (v.getId()) {44             // 指定相机拍摄照片保存地址45             case R.id.btn_StartCamera:46                 intent = new Intent();47                 // 指定开启系统相机的Action48                 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);49                 intent.addCategory(Intent.CATEGORY_DEFAULT);50                 // 根据文件地址创建文件51                 File file = new File(FILE_PATH);52                 if (file.exists()) {53                     file.delete();54                 }55                 // 把文件地址转换成Uri格式56                 Uri uri = Uri.fromFile(file);57                 // 设置系统相机拍摄照片完成后图片文件的存放地址58                 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);59                 startActivityForResult(intent, 0);60                 break;61             // 不指定相机拍摄照片保存地址62             case R.id.btn_StartCameraInGallery:63                 intent = new Intent();64                 // 指定开启系统相机的Action65                 intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);66                 intent.addCategory(Intent.CATEGORY_DEFAULT);67                 startActivityForResult(intent, 1);68                 break;69             default:70                 break;71             }72 73         }74     };75 76     @Override77     protected void onActivityResult(int requestCode, int resultCode, Intent data) {78         Log.i(TAG, "系统相机拍照完成,resultCode="+resultCode);79         80         if (requestCode == 0) {81             File file = new File(FILE_PATH);82             Uri uri = Uri.fromFile(file);83             iv_CameraImg.setImageURI(uri);84         } else if (requestCode == 1) {85             Log.i(TAG, "默认content地址:"+data.getData());86             iv_CameraImg.setImageURI(data.getData());87         }88     }89 }

  效果展示:

  这里只是简单的演示了如何调用系统现有的相机应用获取拍摄的图片,没有做图片资源的回收,所以可能会有内存溢出的错误,重新启动应用即可。 

 

系统现有相机拍摄视频

  从系统现有的相机应用中获取拍摄的视频,与获取拍摄的图片过程大致相同,但是它除了可以通过putExtra()设置MediaStore.EXTRA_OUTPUT输出路径外,还可以设置其它值,这里简单介绍一下:

  • MediaStore.EXTRA_OUTPUT:设置媒体文件的保存路径。
  • MediaStore.EXTRA_VIDEO_QUALITY:设置视频录制的质量,0为低质量,1为高质量。
  • MediaStore.EXTRA_DURATION_LIMIT:设置视频最大允许录制的时长,单位为毫秒。
  • MediaStore.EXTRA_SIZE_LIMIT:指定视频最大允许的尺寸,单位为byte。

系统现有相机拍摄视频Demo

  既然和拍摄照片的流程一样,这里就不再累述了,直接上Demo。在Demo中通过一个Button启动一个系统现有相机拍摄视频,最后保存在SD卡上。

  实现代码:

1 package cn.bgxt.callsystemcamera; 2  3 import java.io.File; 4  5 import android.app.Activity; 6 import android.content.Intent; 7 import android.net.Uri; 8 import android.os.Bundle; 9 import android.provider.MediaStore;10 import android.util.Log;11 import android.view.View;12 import android.widget.Button;13 14 public class SysVideoCameraActivity extends Activity {15     private Button btn_StartVideoCamera;16     private static final String FILE_PATH = "/sdcard/sysvideocamera.3gp";17     private static final String TAG="main";18     @Override19     protected void onCreate(Bundle savedInstanceState) {20         super.onCreate(savedInstanceState);21         setContentView(R.layout.activity_sysvideocamera);22 23         btn_StartVideoCamera = (Button) findViewById(R.id.btn_StartVideoCamera);24         btn_StartVideoCamera.setOnClickListener(click);25     }26 27     private View.OnClickListener click = new View.OnClickListener() {28 29         @Override30         public void onClick(View v) {31             Intent intent = new Intent();32             intent.setAction("android.media.action.VIDEO_CAPTURE");33             intent.addCategory("android.intent.category.DEFAULT");34             File file = new File(FILE_PATH);35             if(file.exists()){36                 file.delete();37             }38             Uri uri = Uri.fromFile(file);39             intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);40             startActivityForResult(intent, 0);41         }42     };43     44 45     @Override46     protected void onActivityResult(int requestCode, int resultCode, Intent data) {47         Log.i(TAG, "拍摄完成,resultCode="+requestCode);48     }49 50 }

  效果展示:

 

  

 

总结

  到此就把如何使用系统现有相机应用拍摄照片与视频都讲解清楚了,在非相机相关的项目中,如果需要拍照的话,一般都是调用系统现有的相机应用,而不会直接调用Camera硬件去获取图像。

本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/Android_SystemCamera.html,如需转载请自行联系原作者

你可能感兴趣的文章
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
初识 lex
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
TCP and UDP Small Servers
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Linux的dd命令
查看>>
从服务器下载一个离线包,格式为gz的压缩包,怎么解压呢。
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>
Morris ajax
查看>>
【Docker学习笔记(四)】通过Nginx镜像快速搭建静态网站
查看>>
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
查看>>
<转>云主机配置OpenStack使用spice的方法
查看>>
java jvm GC 各个区内存参数设置
查看>>
[使用帮助] PHPCMS V9内容模块PC标签调用说明
查看>>
关于FreeBSD的CVSROOT的配置
查看>>
基于RBAC权限管理
查看>>