Android拍照
16lz
2022-01-25
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 到这里拍摄的图片已经保存到指定的文件中了 } }
对于图片的缩放,可以参考
http://blog.csdn.net/guchuanhang/article/details/43835585
- 对拍照逻辑的封装
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
更多相关文章
- Android(安卓)Stdio实现点击按钮出现图片
- android之文件的写入与读取
- android截取屏幕图
- Android(安卓)保存浏览记录 SharedPreTools
- 【Android】ImageMap,图片地图
- android 下载文件图片圆形进度条
- android图片异步加载 列表
- android:通过选择相册或者拍照获取照片
- Android(安卓)setBrightness value