zoukankan      html  css  js  c++  java
  • 拍照并保存

    注意:

    在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 = 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 = 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、保存图片。

  • 相关阅读:
    jdbc连接Sql server数据库,并查询数据
    HttpClient,post请求,发送json,并接收数据
    SQL SERVER存储过程一
    HttpClient,get请求,发送并接收数据
    工作中操作数据库实例
    存储过程的实例(公司)
    eclipse发布项目后,项目所在的位置
    SQLSERVER存储过程基本语法
    SAXReader解析
    导包
  • 原文地址:https://www.cnblogs.com/ccddy/p/3966533.html
Copyright © 2011-2022 走看看