首页 > 代码库 > 拍照并保存
拍照并保存
注意:
在SD的使用中需要加入以下权限:
<!--在SDCard中创建与删除文件权限 –><uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!--往SDCard写入数据权限 --> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
思路:
1、在SD卡存在可用的前提下拍摄照片。
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)// 获取SD卡状态,并且值为Environment.MEDIA_MOUNTED时进行照片的拍摄。
2、创建放置图片的目录。
private static final File PHOTO_DIR = new File(Environment.getExternalStorageDirectory() + "/DCIM/Camera"); // 图片的存储目录PHOTO_DIR.mkdir();//创建目录
3、设置图片存放路径并命名。即图片文件。
File mCurrentPhotoFile;//图片文件 mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName()); // 用当前时间给取得的图片命名 /** * 创建一个新的图片名 */ private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat format = new SimpleDateFormat("‘IMG‘_yyyyMMdd_HHmmss"); return format.format(date) + ".jpg"; }
4、调用照相机,并且为可获得结果的跳转。
private static final int CAMERA_WITH_DATA = http://www.mamicode.com/0; // 拍照Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//跳转到照相Uri fromFile = Uri.fromFile(mCurrentPhotoFile); // String string = fromFile.toString(); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mCurrentPhotoFile)); startActivityForResult(intent, CAMERA_WITH_DATA);
5、重写onActivityResult方法(处理、显示、保存)。
详情看以下源码:
import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import com.example.test.R;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * Created by Administrator on 2014/9/9. */public class GetPic extends Activity { private static final File PHOTO_DIR = new File( Environment.getExternalStorageDirectory() + "/DCIM/Camera"); // 图片的存储目录 File mCurrentPhotoFile;//图片文件 private static final int CAMERA_WITH_DATA = http://www.mamicode.com/0; // 拍照 private Integer mStepImg = 0; private static final int SCALE = 4;// 照片缩小比例 private List<Bitmap> mBitmaps = new ArrayList<Bitmap>(); private ImageView mImg_pic1, mImg_pic2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.get_pic); mImg_pic1 = (ImageView) findViewById(R.id.view1); mImg_pic2 = (ImageView) findViewById(R.id.view2); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getPicFromCapture(); } }); } private void getPicFromCapture() { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//判断SDCard的状态 PHOTO_DIR.mkdir();//创建目录 mCurrentPhotoFile = new File(PHOTO_DIR, getPhotoFileName()); // 用当前时间给取得的图片命名 Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");//跳转到照相 Uri fromFile = Uri.fromFile(mCurrentPhotoFile); // String string = fromFile.toString(); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mCurrentPhotoFile)); startActivityForResult(intent, CAMERA_WITH_DATA); } else { Log.e("---------", "没有sd卡"); } } /** * 创建一个新的图片名 */ private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat format = new SimpleDateFormat("‘IMG‘_yyyyMMdd_HHmmss"); return format.format(date) + ".jpg"; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) return; switch (requestCode) { case CAMERA_WITH_DATA: {// 照相机程序返回的,再次调用图片剪辑程序去修剪图片 mStepImg++; // Bundle extras = data.getExtras(); // final Bitmap bitmap = (Bitmap) extras.get("data"); // 获取图片、缩小、显示、保存 Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoFile.toString());//根据文件全路径获取图片 final ImgModel imgModel = new ImgModel(); imgModel.path = mCurrentPhotoFile.toString(); // imgModel.bitmap = bitmap; Bitmap newBitmap = zoomBitmap(bitmap, bitmap.getWidth() / SCALE, bitmap.getHeight() / SCALE);//缩放图片 bitmap.recycle();// 由于Bitmap内存占用较大,这里需要回收内存,否则会报out of memory异常 mBitmaps.add(bitmap);//??如果用到缩放前图片 mBitmaps.add(newBitmap); mImg_pic1.setScaleType(ImageView.ScaleType.CENTER_CROP); mImg_pic2.setScaleType(ImageView.ScaleType.CENTER_CROP);//按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) // 生成图片显示在界面上 if (mStepImg == 1) { mImg_pic1.setTag(mStepImg); mImg_pic1.setImageBitmap(newBitmap);// mImg_pic2.setVisibility(View.VISIBLE); } else if (mStepImg == 2) { mImg_pic2.setTag(mStepImg); mImg_pic2.setImageBitmap(newBitmap); } // 将处理过的图片显示在界面上,并保存到本地 savePhotoToSDCard(newBitmap, Environment.getExternalStorageDirectory().getAbsolutePath(), String.valueOf(System.currentTimeMillis())); //Environment.getExternalStorageDirectory().getAbsolutePath()是获取外部存储路径的绝对路径,即SD卡的文件路径 //此处的事件是保存事件 break; } } } public Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {//缩小BitMap int w = bitmap.getWidth(); int h = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidth = ((float) width / w); float scaleHeight = ((float) height / h); matrix.postScale(scaleWidth, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; } /** * 保存图片 */ public void savePhotoToSDCard(Bitmap photoBitmap, String path, String photoName) { if (checkSDCardAvailable()) { File dir = new File(path); if (!dir.exists()) {//dir.exists()判断路径是否存在,不存在则创建 dir.mkdirs(); } File photoFile = new File(path, photoName + ".png"); FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(photoFile); if (photoBitmap != null) { if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) { fileOutputStream.flush();//清除 // fileOutputStream.close(); } } } catch (FileNotFoundException e) { photoFile.delete(); e.printStackTrace(); } catch (IOException e) { photoFile.delete(); e.printStackTrace(); } finally { try { fileOutputStream.close();//关闭 } catch (IOException e) { e.printStackTrace(); } } } } /** * 判断SD卡是否可用 * * @return */ public boolean checkSDCardAvailable() { return android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED); }}
ImgMode.java
/** * Created by Administrator on 2014/9/9. */public class ImgModel { public String path;}
6、保存图片。
拍照并保存
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。