利用android的camera通常有两种方式:利用intent调用系统的camera,或者结合surfaceview实现自己定制的camera。先分别对这两种方法说明如下:

一、使用系统自配的camera,这种方法不需要在配置文件中声明任何权限

package com.bobo.mycamara;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date; import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; public class MainActivity extends Activity {
private Button btn_image;
private Button btn_video;
private Uri image_uri;
private Uri video_uri;
private final int IMAGE_TYPE = 1;
private final int VIDEO_TYPE = 2;
private final int IMAGE_REQUEST_CODE = 100;
private final int VIDEO_REQUEST_CODE = 200;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_image = (Button) this.findViewById(R.id.btn_image_capture);
btn_video = (Button) this.findViewById(R.id.btn_video_capture);
btn_image.setOnClickListener(new ImageCaptureListener());
btn_video.setOnClickListener(new VideoCaptureListener());
img=(ImageView)this.findViewById(R.id.img); } class ImageCaptureListener implements View.OnClickListener { @Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
// 下面的路径选择虽然是可选的,但是建议这么做,否则返回信息会存储在默认路径下(详见api文档)
image_uri = getOutputMediaFileUri(IMAGE_TYPE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, image_uri);
startActivityForResult(intent, IMAGE_REQUEST_CODE); } // 如何将一个路径转换为一个uri
private Uri getOutputMediaFileUri(int TYPE) {
Uri uri = Uri.fromFile(getOutputMediaFile(TYPE));
// 留意一下这个文件路径是按照怎样的规则转换为一个uri的
System.out.println("根据路径转换的uri为:" + uri.toString());
return uri;
} // 创建文件路径
private File getOutputMediaFile(int type) {
File mediaFile = null;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ) {
File mediaDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
+ File.separator + "myCamara");
System.out.println("存储路径目录:" + mediaDir.getAbsolutePath());
if (!mediaDir.exists()) {
if (!mediaDir.mkdirs())
System.out.println("存储路径目录创建失败");
return null;
}
// 利用时间戳作为文件名
String timeStamp = (new SimpleDateFormat("yyyyMMdd_HHmmss"))
.format(new Date());
if (type == IMAGE_TYPE) {
mediaFile = new File(mediaDir.getAbsoluteFile()
+ File.separator + "IMG_" + timeStamp + ".jpg");
System.out.println("文件存储路径为:"+mediaFile.getAbsolutePath());
} else if (type == VIDEO_TYPE) {
mediaFile = new File(mediaFile.getAbsoluteFile()
+ File.separator + "VID_" + timeStamp + ".mp4");
} else {
return null;
}
} return mediaFile;
} } class VideoCaptureListener implements View.OnClickListener {
@Override
public void onClick(View v) { }
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode!=Activity.RESULT_OK){
System.out.println("信息返回错误");
return;
}
switch(requestCode){
case IMAGE_REQUEST_CODE:
//这里貌似是手机型号的问题,如果指定了MediaStore.EXTRA_OUTPUT,就有可能出现返回的intent为空的情况
//但是图像依旧在对应的路径下面,可以使用下面的方法将图片显示在图像控件上面
img.setImageURI(image_uri);
break;
case VIDEO_REQUEST_CODE:
break;
default:
System.out.println("请求码返回错误"); }
} }

其中创建图片存储路径,以及将路径转换为Uri的方法值得掌握,通过日志打印发现:

文件存储路径为:/storage/sdcard0/Pictures/myCamara/IMG_20130620_095430.jpg

根据路径转换的uri为:file:///storage/sdcard0/Pictures/myCamara/IMG_20130620_095430.jpg

但是同时发现,这种按照api文档说明指定MediaStore.EXTRA_OUTPUT之后,返回的intent居然为空。不过文件依旧存在在规定的路径下可以找到,如果不指定该参数,则文件保存在默认的路径中。

其代码如下,数据的返回是通过intent.getextra().get("data")是个birmap类型的数据。

package com.bobo.mycamara;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date; import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; public class MainActivity extends Activity {
private Button btn_image;
private Button btn_video;
private Uri image_uri;
private Uri video_uri;
private final int IMAGE_TYPE = 1;
private final int VIDEO_TYPE = 2;
private final int IMAGE_REQUEST_CODE = 100;
private final int VIDEO_REQUEST_CODE = 200;
private ImageView img; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_image = (Button) this.findViewById(R.id.btn_image_capture);
btn_image.setOnClickListener(new ImageCaptureListener());
img = (ImageView) this.findViewById(R.id.img); } class ImageCaptureListener implements View.OnClickListener { @Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, IMAGE_REQUEST_CODE); }
} @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK) {
System.out.println("信息返回错误");
return;
}
switch (requestCode) {
case IMAGE_REQUEST_CODE:
// 如果不指定Media.outputstra参数,那么返回数据的使用方法如下
Bitmap bitmap = (Bitmap) data.getExtras().get("data");
img.setImageBitmap(bitmap);
break;
case VIDEO_REQUEST_CODE:
break;
default:
System.out.println("请求码返回错误"); }
} }

知道了如何调用系统相机进行拍照后,调用相机进行摄影的操作大同小异。
如果都规定了路径参数,那么可以知道URI进行调用,如果是默认,还需要通过contentresolver进行数据库的查血。可以参见如下两篇博客:

http://blog.csdn.net/yudajun/article/details/7932593

http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html

这样带来一个问题,如果在其他界面调用相机的拍照结果呢?知道了uri或者文件路径,进一步结合contentresolver总会有方法。

可以参照自己这篇博客:http://www.cnblogs.com/bobodeboke/archive/2013/05/20/3088867.html

二、结合surfaceview实现自己定制的camera。关于这个,将在下篇博客中进行说明。

android intent调用系统camera的更多相关文章

  1. Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。

    源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机 ...

  2. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  3. Android中调用系统所装的软件打开文件(转)

    Android中调用系统所装的软件打开文件(转) 在应用中如何调用系统所装的软件打开一个文件,这是我们经常碰到的问题,下面是我所用到的一种方法,和大家一起分享一下! 这个是打开文件的一个方法: /** ...

  4. 安卓 通过intent调用系统文件管理器打开指定路径目录

    安卓 通过intent调用系统文件管理器打开指定路径目录     转  https://blog.csdn.net/qq_34161388/article/details/78586247 当我们知道 ...

  5. [Android Pro] 调用系统相机和图库,裁剪图片

    private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照 private static final int PHOTO_REQUEST_GA ...

  6. android中调用系统的发送短信、发送邮件、打电话功能

    1 调用发送短信功能: Uri smsToUri = Uri.parse("smsto:");  Intent sendIntent = new Intent(Intent.ACT ...

  7. Android简单调用相机Camera功能,实现打开照相功能

    在最開始接触Android相机功能之前,先来体验一下Android调用系统照相功能吧 核心代码 Intent intent = new Intent(); //调用照相机 intent.setActi ...

  8. Android实例-调用系统APP(XE10+小米2)

    相关资料:群号383675978 实例源码: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, Sys ...

  9. 直接调用系统Camera

    关键思路: 初始化 组件: 创建并启动拍照intent: 使用回调函数onActivityResult()处理图像. 关键代码: 初始化 组件: takePicBtn = (Button) findV ...

随机推荐

  1. linux命令之import

    linux下截屏除了printscreen按键外,还可以用improt命令. 该命令最常用的两种方式: 1.鼠标选择范围截屏:import mypicture.jpg 2.截取全屏:import -w ...

  2. redis windows 安装 下载 常用参数

    下载地址 https://github.com/ServiceStack/redis-windows/tree/master/downloads 安装可视化工具 RedisDesktopManager ...

  3. 剑指offer-字符串的排列-数组-递归-动态规划-python

    题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...

  4. Android 之 悬浮窗口

    1. 创建并设置  WindowManager  类 WindowManager mWindowManager; // 取得系统窗体 mWindowManager = (WindowManager) ...

  5. oracle函数nvl,nvl2的区别,nullif函数,coalesce函数

    在oracle中用nvl和nvl2函数来解决为空的情况,例如,如果奖金为空,则为它指定一个数.也就是nvl(奖金字段,指定的奖金),但是两个的类型要一致. 1)nvl()函数 SQL> sele ...

  6. hadoop的权限控制

    HDFS支持权限控制,但支持较弱.HDFS的设计是基于POSIX模型的,支持按用户.用户组.其他用户的读写执行控制权限.在linux命令行下,可以使用下面的命令修改文件的权限.文件所有者,文件所属组: ...

  7. Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本

    source source /root/.bashrc #让修改后的配置文件在不重启系统的情况下生效.source等同于. 环境变量目录 /etc/profile /etc/profile.d/*.s ...

  8. samba服务及vsftpd服务

    如何配置多个网卡 第一步: 打开设置,选择网络驱动器添加 第二步: ip a 查看网卡是否添加成功 第三步: 打开刚添加的网卡配置文件(注意,你刚添加的网卡是没有配置文件的,需要去复制一份到/etc/ ...

  9. windows 汇编

    int main(){ int a = 1; int c = 2; int b; __asm { MOV EAX, a; MOV EBX, c; ADD EAX, EBX; MOV b, EAX; } ...

  10. linux上开启和分析mysql慢查询日志

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...