1.概述

在大多数应用开发中,我们并不需要自己去写一个自定义的相机拍摄和预览功能,这个时候我们只需要调用系统的摄像头接收它拍摄后为我们返回的数据即可。所以接下来我们会学习一下调用系统相机拍摄照片的简单使用。
调用系统相机并返回数据的方式有两种:1)指定图片保存的路径;2)使用默认的图片保存路径; 下面是两种方式效果截图:
图1 指定图片保存的路径效果 图2 使用默认的图片保存路径效果
![]()
明显两种方式返回的图片不一样大小,图2 图片很小的原因是系统在照片返回的时候对它进行了压缩。
好了接下来是我们调用系统相机的实现步骤。
2.实现
2.1 manifest文件注册权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permisssion.CAMERA"/>
2.2 activity_main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.elimy.camera.MainActivity">
<ImageView
android:src="@mipmap/ic_launcher"
android:id="@+id/pic"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/startCamera"
android:text="调用系统相机"
android:layout_below="@id/pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
2.3 MainActivity.java布局类文件:
package com.example.elimy.camera;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
public static final int REQUEST_TAKE_PHOTO_CODE=1;
public static final int REQUST_TAKE_PHOTTO_CODE2=2;
private ImageView imageView;
Button startbtn;
// /storage/emulated/0/pic
public final static String SAVED_IMAGE_PATH1=Environment.getExternalStorageDirectory().getAbsolutePath()+"/pic";//+"/pic";
// /storage/emulated/0/Pictures
public final static String SAVED_IMAGE_PATH=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();//.getAbsolutePath()+"/pic";//+"/pic";
String photoPath;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("SAVED_IMAGE_PATH1",SAVED_IMAGE_PATH1);
Log.d("SAVED_IMAGE_PATH",SAVED_IMAGE_PATH);
//布局初始化绑定
imageView = (ImageView) findViewById(R.id.pic);
startbtn = (Button) findViewById(R.id.startCamera);
//调用按钮监听
startbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取SD卡安装状态
String state= Environment.getExternalStorageState();
if (state.equals(Environment.MEDIA_MOUNTED)){
//设置图片保存路径
photoPath=SAVED_IMAGE_PATH+"/"+System.currentTimeMillis()+".png";
File imageDir=new File(photoPath);
if(!imageDir.exists()){
try {
//根据一个 文件地址生成一个新的文件用来存照片
imageDir.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
takePhotoByMethod1();
//takePhotoByMethod2();
}else {
Toast.makeText(MainActivity.this,"SD卡未插入",Toast.LENGTH_SHORT).show();
}
}
});
}
/*
* 接收调用相机后返回的数据
* */
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data){
if (requestCode==REQUEST_TAKE_PHOTO_CODE&&resultCode==Activity.RESULT_OK){
File photoFile=new File(photoPath);
if (photoFile.exists()){
//通过图片地址将图片加载到bitmap里面
Bitmap bm= BitmapFactory.decodeFile(photoFile.getAbsolutePath());
//将拍摄的照片显示到界面上
imageView.setVisibility(View.VISIBLE);
imageView.setImageBitmap(bm);
}else {
Toast.makeText(MainActivity.this,"图片文件不存在",Toast.LENGTH_LONG).show();
}
}else if (requestCode==REQUST_TAKE_PHOTTO_CODE2&&resultCode==Activity.RESULT_OK){
Bundle bundle=data.getExtras();
if (bundle!=null){
Bitmap bm= (Bitmap) bundle.get("data");
if (bm!=null){
imageView.setVisibility(View.VISIBLE);
imageView.setImageBitmap(bm);
}
}else {
Toast.makeText(MainActivity.this,"没有压缩的图片数据",Toast.LENGTH_LONG).show();
}
}
}
/*
* 第一种方式调用系统摄像头拍照
* */
private void takePhotoByMethod1(){
//实例化intent,指向摄像头
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//根据路径实例化图片文件
File photoFile=new File(photoPath);
//设置拍照后图片保存到文件中
intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile));
//启动拍照activity并获取返回数据
startActivityForResult(intent,REQUEST_TAKE_PHOTO_CODE);
}
/*
* 第二种方式调用系统摄像头拍照
* */
private void takePhotoByMethod2(){
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,REQUST_TAKE_PHOTTO_CODE2);
}
}
系统相机的调用还是比较简单,唯一要注意的的是第一种方法中的图片保存路径必须设置好,不然会有照片拍摄后无法点击确认返回并保存的问题。