Android--调用系统照相机拍照与摄像

简介:

系统现有相机应用的调用

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

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

复制代码
 1         <activity
 2             android:name="com.android.camera.Camera"
 3             android:clearTaskOnLaunch="true"
 4             android:configChanges="orientation|keyboardHidden"
 5             android:screenOrientation="landscape"
 6             android:taskAffinity="android.task.camera"
 7             android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" >
 8             <intent-filter>
 9                 <action android:name="android.intent.action.MAIN" />
10                 <categroy android:name="android.intent.category.DEFAULT" />
11                 <categroy android:name="android.intent.category.LAUNCHER" />
12             </intent-filter>
13             <intent-filter>
14                 <action android:name="android.media.action.IMAGE_CAPTURE" />
15                 <categroy android:name="android.intent.category.DEFAULT" />
16             </intent-filter>
17             <intent-filter>
18                 <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
19                 <categroy android:name="android.intent.category.DEFAULT" />
20             </intent-filter>
21         </activity>
22         <activity
23             android:name="com.android.camera.VideoCamera"
24             android:clearTaskOnLaunch="true"
25             android:configChanges="origientation|keyboardHidden"
26             android:label="@string/video_camera_label"
27             android:screenOrientation="landscape"
28             android:taskAffinity="android.task.camcorder"
29             android:theme="@android:style/theme.Black.NoTitleBar.Fullscreen" >
30             <intent-filter>
31                 <action android:name="android.media.action.VIDEO_CAMERA" />
32                 <categroy android:name="android.intent.category.DEFAULT" />
33             </intent-filter>
34             <intent-filter>
35                 <action android:name="android.media.action.VIDEO_CAPTURE" />
36                 <categroy android:name="android.intent.category.DEFAULT" />
37             </intent-filter>
38         </activity>
复制代码

 

  它定义了两个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     @Override
25     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         @Override
40         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                 // 指定开启系统相机的Action
48                 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                 // 指定开启系统相机的Action
65                 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     @Override
77     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     @Override
19     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         @Override
30         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     @Override
46     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,如需转载请自行联系原作者


相关文章
|
24天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
搜索推荐 Android开发 iOS开发
探析安卓与iOS系统的优劣
【2月更文挑战第7天】安卓与iOS是当今手机市场上最主流的两款操作系统,各有优劣。本文将从用户体验、开放程度、生态系统等方面对两者进行深入探析,以期帮助读者更好地了解它们的特点。
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
35 4
|
18天前
|
机器学习/深度学习 人工智能 搜索推荐
探索安卓应用中的新趋势:人工智能驱动的智能推荐系统
传统的应用推荐系统已经无法满足用户日益增长的个性化需求。本文将探讨如何通过引入人工智能技术,构建智能推荐系统,为用户提供更加精准、个性化的应用推荐体验,进而提升应用的用户满意度和留存率。
17 0
|
1月前
|
搜索推荐 测试技术 定位技术
基于Android的自助导游系统的设计与实现(论文+源码)_kaic
基于Android的自助导游系统的设计与实现(论文+源码)_kaic
|
1月前
|
搜索推荐 安全 Android开发
安卓与iOS系统的用户体验比较
【2月更文挑战第11天】 在当今移动设备市场上,安卓和iOS系统一直是两大主流操作系统。本文将从用户界面设计、应用生态、系统定制性等方面对安卓和iOS系统进行比较分析,旨在探讨两者的优势和劣势,为用户选择合适的操作系统提供参考。
|
2月前
|
人工智能 vr&ar Android开发
探索安卓与iOS系统的发展趋势
【2月更文挑战第9天】 过去,人们对于安卓和iOS系统的争论主要集中在性能、用户体验和生态系统的比较上。然而,随着移动互联网的快速发展,两大操作系统在人工智能、物联网、安全性等方面的发展趋势也备受关注。本文将探讨安卓与iOS系统在技术发展方面的差异以及未来的发展趋势。
|
2月前
|
搜索推荐 Android开发 iOS开发
探讨安卓与iOS系统的用户体验差异
【2月更文挑战第7天】 在当今移动互联网时代,安卓和iOS系统是最受欢迎的手机操作系统。本文将从用户界面设计、应用生态系统、定制性能等方面探讨安卓与iOS系统的用户体验差异,为读者提供更深入的了解。
|
2月前
|
安全 开发工具 Android开发
安卓与iOS系统的优缺点比较
【2月更文挑战第6天】 安卓和iOS是目前市场上最流行的两种操作系统。虽然它们都拥有自己的独特之处,但它们也有一些共同之处。本文将探讨这两种操作系统的优缺点,并对它们进行比较。