您的位置:首页 > 移动开发 > Android开发

Android拍照

2016-04-23 19:03 483 查看
Android中的拍照常用的有两种:

拍照获取缩略图

private static final int ACTION_TAKE_PHOTO_S = 2;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, ACTION_TAKE_PHOTO_S);

}

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==ACTION_TAKE_PHOTO_S&&resultCode==RESULT_OK){
Bundle extras = data.getExtras();
mImageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(mImageBitmap);

}
}


拍照获取原图

private static final int ACTION_TAKE_PHOTO_B = 1;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//TODO f是拍照后照片保存的文件
File f = null;
//TODO 保存文件名,拍照完成后获取图片要用到
mCurrentPhotoPath = f.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(f));
startActivityForResult(takePictureIntent, ACTION_TAKE_PHOTO_B );

}

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==ACTION_TAKE_PHOTO_S&&resultCode==RESULT_OK){
//TODO 到这里拍摄的图片已经保存到指定的文件中了
}
}


对于图片的缩放,可以参考

/article/8178013.html

对拍照逻辑的封装

package com.example.android.photobyintent;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ExifInterface;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;

@TargetApi(Build.VERSION_CODES.ECLAIR)
public class CameraUtil {
private static final String JPEG_FILE_PREFIX = "IMG_";
private static final String JPEG_FILE_SUFFIX = ".jpg";
private static final String CAMERA_DIR = "/dcim/";

/**该方法需要在onActivityResult进行处理
* @return filePath
*/
public static String takePictureIntent(Context packageContext,
int requestCode) {
String imgFilePath = null;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(packageContext
.getPackageManager()) == null) {
Toast.makeText(packageContext, "抱歉您没有相机APP,无法拍照~",
Toast.LENGTH_LONG).show();
} else {
File f = null;
try {
f = setUpPhotoFile(packageContext);
imgFilePath = f.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(f));
} catch (IOException e) {
e.printStackTrace();
f = null;
}
((Activity) packageContext).startActivityForResult(
takePictureIntent, requestCode);
}
return imgFilePath;
}

@TargetApi(Build.VERSION_CODES.FROYO)
private static File setUpPhotoFile(Context context) throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.CHINA)
.format(new Date());
String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
File albumF = null;

if (Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageState())) {

String albumName = context.getString(R.string.app_name);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
albumF = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
albumName);
} else {
albumF = new File(Environment.getExternalStorageDirectory()
+ CAMERA_DIR + albumName);
}
if (albumF != null) {
if (!albumF.mkdirs()) {
if (!albumF.exists()) {
Log.d("CameraSample", "failed to create directory");
return null;
}
}
}

} else {
Log.v(context.getString(R.string.app_name),
"External storage is not mounted READ/WRITE.");
}

File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX,
albumF);
return imageF;
}

/**
将图片加入图库
*/
public static void img2Galley(Context context, String imgPath) {
Intent mediaScanIntent = new Intent(
"android.intent.action.MEDIA_SCANNER_SCAN_FILE");
File f = new File(imgPath);
if (f != null) {
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
context.sendBroadcast(mediaScanIntent);
}
}

@TargetApi(Build.VERSION_CODES.ECLAIR)
public static Bitmap getThumbnail(String filePath) {
Bitmap thumbBitmap = null;

ExifInterface exif;
try {
exif = new ExifInterface(filePath);
byte[] imageData = exif.getThumbnail();
thumbBitmap = BitmapFactory.decodeByteArray(imageData, 0,
imageData.length);
} catch (IOException e) {
e.printStackTrace();
}
return thumbBitmap;
}

}


封装的这个工具类中,takePictureIntent调用相机拍照,保存原图并返回图片路径。需要在页面的onActivityResult调用 CameraUtil.img2Galley(this, filePath);将图片添加到图库中。

最后需要在Manifest中添加如下参数。

<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


本文主要参考地址:

http://developer.android.com/training/camera/photobasics.html#TaskScalePhoto

Demo下载地址:

http://download.csdn.net/detail/guchuanhang/9500418
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: