android从相机和相册中获取图片

之前做项目时有用到拍照获取图片这个功能,针对项目抽取出来了主要的代码,其中一些是来自于网上其他朋友的,在此说明!好废话不多说了。。。
activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.simpletakepicture.MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拍照" 
        android:id="@+id/take_picture_btn"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="相册" 
        android:id="@+id/album_choice_btn"
        android:layout_toRightOf="@+id/take_picture_btn"
        />
    <ImageView 
        android:layout_width="200dp"
        android:layout_height="400dp"
        android:layout_centerInParent="true"
        android:id="@+id/image_preview"
        android:src="@drawable/ic_launcher"
        />

</RelativeLayout>

MainActivity

package com.example.simpletakepicture;

import java.io.File;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

/**
 * 
 * @author wangyangzi
 * 拍照获取图片和从相册选择获取图片。不管怎样获取都会封装成一个PhotoInfo对象,包含了图片的sdcard路径,缩略图
 * 为的就是上传到服务器时方便查找,通过File转Base64格式上传。本例子不包含上传功能,部分代码来自网上
 *
 */
public class MainActivity extends ActionBarActivity {

    private Button takePictureBtn;
    private Button albumChoiceBtn;
    private ImageView previewImg;

    private static final int TAKE_PICTURE = 0;
    private static final int CHOOSE_PICTURE = 1;
    private static final int SCALE = 5;
    private static final String tempPhotoDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/wyz/";

    private String photoName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        takePictureBtn = (Button) this.findViewById(R.id.take_picture_btn);
        albumChoiceBtn = (Button) this.findViewById(R.id.album_choice_btn);
        previewImg = (ImageView) this.findViewById(R.id.image_preview);

        //拍照
        takePictureBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String state = Environment.getExternalStorageState();
                if (state.equals(Environment.MEDIA_MOUNTED)) {
                    Intent tpIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File dir = new File(tempPhotoDir);
                    if (!dir.exists()) {
                        dir.mkdirs();
                    }
                    //将图片保存进原始目录
                    photoName = String.valueOf(System.currentTimeMillis());
                    tpIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(tempPhotoDir + photoName + ".png")));
                    startActivityForResult(tpIntent, TAKE_PICTURE);
                }
                else {
                    Toast.makeText(MainActivity.this, "请确认已经插入SD卡", Toast.LENGTH_LONG).show();
                }

            }
        });
        //相册选择
        albumChoiceBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");//相片类型
                startActivityForResult(intent, CHOOSE_PICTURE);
            }
        });
    }

     //获取相机或相册的照片
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        PhotoInfo photoInfo = new PhotoInfo();
        Bitmap bitmap = null;
        String photoPath = "";
        try{
            if(resultCode != RESULT_CANCELED){
                if (requestCode == CHOOSE_PICTURE) {
                    //照片的原始资源地址
                    Uri originalUri = data.getData();
                    //使用ContentProvider通过URI获取原始图片
                    Bitmap photo = MediaStore.Images.Media.getBitmap(getContentResolver(), originalUri);
                    if (photo != null) {
                        //为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始Bitmap占用的内存
                        bitmap = ImageTools.zoomBitmap(photo, photo.getWidth() / SCALE, photo.getHeight() / SCALE);
                        //释放原始图片占用的内存,防止out of memory异常发生
                        photo.recycle();
                        //获取相册图片的SDCard路径
                        photoPath = ImageTools.getRealFilePath(this,originalUri);
                    }
                } else if (requestCode == TAKE_PICTURE ) {
                    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
                    bitmapOptions.inSampleSize = 8;
                    int degree = ImageTools.readPictureDegree(tempPhotoDir + photoName + ".png");
                    bitmap = BitmapFactory.decodeFile(tempPhotoDir + photoName + ".png",bitmapOptions);
                    bitmap = ImageTools.rotaingImageView(degree, bitmap);
                    photoPath = tempPhotoDir + photoName + ".png";
                }
                //构建PhotoInfo对象,此对象可以保存进adapter,用于后续业务处理...
                photoInfo.setThumbnail(bitmap);
                photoInfo.setPhotoSDCardPath(photoPath);
                //预览图片
                previewPhoto(photoInfo);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 预览图片
     * @param photoInfo
     */
    private void previewPhoto(PhotoInfo photoInfo){
        Toast.makeText(this, "获得图片>>" + photoInfo.getPhotoSDCardPath(), Toast.LENGTH_SHORT).show();
        previewImg.setImageBitmap(photoInfo.getThumbnail());
    }

}

ImageTools

package com.example.simpletakepicture;

import java.io.IOException;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri;
import android.provider.MediaStore;

public class ImageTools {
    public static Bitmap zoomBitmap(Bitmap bitmap, int width, int height) {
        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 static int readPictureDegree(String path) {
        int degree = 0;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            int orientation = exifInterface.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION,
                    ExifInterface.ORIENTATION_NORMAL);
            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_90:
                    degree = 90;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    degree = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    degree = 270;
                    break;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return degree;
    }

    public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
        // 旋转图片 动作
        Matrix matrix = new Matrix();
        matrix.postRotate(angle);
        // 创建新的图片
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                bitmap.getWidth(), bitmap.getHeight(), matrix, true);
        return resizedBitmap;
    }

    public static String getRealFilePath(final Context context, final Uri uri) {
        if (null == uri)
            return null;
        final String scheme = uri.getScheme();
        String data = null;
        if (scheme == null)
            data = uri.getPath();
        else if (ContentResolver.SCHEME_FILE.equals(scheme)) {
            data = uri.getPath();
        } else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {
            Cursor cursor = context.getContentResolver().query(uri,
                    new String[] { MediaStore.Images.ImageColumns.DATA }, null,
                    null, null);
            if (null != cursor) {
                if (cursor.moveToFirst()) {
                    int index = cursor
                            .getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                    if (index > -1) {
                        data = cursor.getString(index);
                    }
                }
                cursor.close();
            }
        }
        return data;
    }
}

PhotoInfo

package com.example.simpletakepicture;

import android.graphics.Bitmap;

public class PhotoInfo {
    //图片的真实路径
    private String photoSDCardPath;
    //显示在页面中的缩略图
    private Bitmap thumbnail;

    public Bitmap getThumbnail() {
        return thumbnail;
    }

    public void setThumbnail(Bitmap thumbnail) {
        this.thumbnail = thumbnail;
    }

    public String getPhotoSDCardPath() {
        return photoSDCardPath;
    }

    public void setPhotoSDCardPath(String photoSDCardPath) {
        this.photoSDCardPath = photoSDCardPath;
    }
}

如果对你有用途别忘了点赞哦!没用途也别喷,小弟刚刚开始写博客回馈社会~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值