Android拍照
2016-04-23 19:03
483 查看
Android中的拍照常用的有两种:
拍照获取缩略图
拍照获取原图
对于图片的缩放,可以参考
/article/8178013.html
对拍照逻辑的封装
封装的这个工具类中,takePictureIntent调用相机拍照,保存原图并返回图片路径。需要在页面的onActivityResult调用 CameraUtil.img2Galley(this, filePath);将图片添加到图库中。
最后需要在Manifest中添加如下参数。
本文主要参考地址:
http://developer.android.com/training/camera/photobasics.html#TaskScalePhoto
Demo下载地址:
http://download.csdn.net/detail/guchuanhang/9500418
拍照获取缩略图
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
相关文章推荐
- Dagger2学习之Hello Dagger
- Android 热补丁动态修复框架小结
- 是时候学习一波Lambda表达式了
- Android应用程序资源的编译和打包过程分析
- 使用Android Studio阅读整个Android源码
- Android事件分发——ViewGroup篇
- 【读书笔记】Android安全机制解析与应用实践之安卓的启动
- Android Studio 经常使用功能介绍
- IDA 远程调试 Android so
- [Android]XworkView使用
- Android 插件化 动态升级
- Android开发艺术探索——第三章View事件体系读书笔记
- 安卓等边三角形
- Android 根据包名,获取应用程序的签名
- Android中的Bitmap
- Y3_01_关于专业技能
- 自定义FlowLayout,支持多种布局优化--android-flowlayout
- Android邮件发送详解
- Android百度地图开发(二):显示地图界面
- Android系统自带样式 @android:style