照相机照相、保存图片到本地文件、点击按钮显示图片到界面上

来源:互联网 发布:色情直播软件用猫粮 编辑:程序博客网 时间:2024/06/03 19:04

效果图

点击打开摄像头调用系统照相机点击打开相册按钮

 

 

目录

 

 

                 点击“打开摄像头”调用系统的照相机,拍照完成把照片存到指定文件里,点击“打开相册”按钮照片显示到一个grideView里

                 记住:一定要把图片进行压缩,否则会出现内存溢出的现象,每次打开相册一定要判断照片是否已经释放,若不释放也会出现内存溢出的现象。

MainActivity.java

 

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
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 android.widget.Toast;

public class MainActivity extends Activity {

    private static final String tag = "MainActivity";
    private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
    private static final int PICK_IMAGE_ACTIVITY_REQUEST_CODE = 200;

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

       //点击打开照相机按钮进行拍照

        Button button = (Button) this.findViewById(R.id.open_camera);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takePicture();
            }
        });

 

        //点击打开相册跳转到一个布局为grideView的界面里

 

        Button pickImageBtn = (Button) this.findViewById(R.id.pick_image);
        pickImageBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, PictureActivity.class);
                startActivity(intent);
            }

        });

    }

    private static String picFileFullName;

    // 拍照
    public void takePicture() {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            File outDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            if (!outDir.exists()) {
                outDir.mkdirs();
            }
            File outFile = new File(outDir, System.currentTimeMillis() + ".jpg");
            picFileFullName = outFile.getAbsolutePath();
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(outFile));
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
            startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
        } else {
            Log.e(tag, "请确认已经插入SD卡");
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Log.e(tag, "获取图片成功,path=" + picFileFullName);
                toast("获取图片成功,path=" + picFileFullName);
                setImageView(picFileFullName);
            } else if (resultCode == RESULT_CANCELED) {
                // 用户取消了图像捕获
            } else {
                // 图像捕获失败,提示用户
                Log.e(tag, "拍照失败");
            }
        } else if (requestCode == PICK_IMAGE_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                if (uri != null) {
                    String realPath = getRealPathFromURI(uri);
                    Log.e(tag, "获取图片成功,path=" + realPath);
                    toast("获取图片成功,path=" + realPath);
                    setImageView(realPath);
                } else {
                    Log.e(tag, "从相册获取图片失败");
                }
            }
        }
    }

    private void setImageView(String realPath) {
        Bitmap bmp = BitmapFactory.decodeFile(realPath);
        int degree = readPictureDegree(realPath);
        Log.e(tag, "rotate:" + degree);
        // 创建操作图片是用的matrix对象
        Matrix matrix = new Matrix();
        // 旋转图片动作
        matrix.postRotate(degree);
    }

    /**
     * This method is used to get real path of file from from uri<br/>
     * captured-from-camera
     *
     * @param contentUri
     * @return String
     */
    public String getRealPathFromURI(Uri contentUri) {
        try {
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = this.managedQuery(contentUri, proj, null, null, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } catch (Exception e) {
            return contentUri.getPath();
        }
    }

    /**
     * 读取照片exif信息中的旋转角度<br/> 
     * @param path
     *            照片路径
     * @return角度
     */
    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 void toast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
}

 

PictureActivity.java

 

 

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import com.example.camerademo.adapter.GrideViewAdapter;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.util.Log;
import android.widget.GridView;

public class PictureActivity extends Activity {
    private GridView gridview;
    private GrideViewAdapter adapter;
    private List<Bitmap> tupian = new ArrayList<Bitmap>();
    String img_path = "/storage/emulated/0/Pictures/";
    File file = new File(img_path);
    Bitmap bitmap;
    Bitmap bitmaps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_picture);
        getAllFiles(file);
        adapter = new GrideViewAdapter(PictureActivity.this, tupian);
        gridview = (GridView) findViewById(R.id.gridview);
        gridview.setAdapter(adapter);
        Log.d("PictureActivity", "图片长度" + tupian.size());
    }

    private void getAllFiles(File root) {
        File files[] = root.listFiles();
        Options opts = new Options();
        opts.outHeight = 200;
        opts.outWidth = 200;
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()) {
                    bitmap = BitmapFactory.decodeFile(files[i].toString(), opts);
                    bitmaps = Bitmap.createScaledBitmap(bitmap, 200, 200, false);
                    // 先判断图片是否已释放了
                    if (!bitmap.isRecycled()) {
                        bitmap.recycle();
                        tupian.add(bitmaps);
                    }
                    Log.d("PictureActivity", "files" + files.length);
                }
            }
        }
    }

}

GrideViewAdapter.java

 

import java.util.List;

import com.example.camerademo.R;
import com.example.camerademo.R.id;
import com.example.camerademo.R.layout;

import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;

public class GrideViewAdapter extends BaseAdapter {
    private final static String TAG = "GrideViewAdapter";
    Context context;
    List<Bitmap> tupian;
    private LayoutInflater inflater = null;
    Uri uri;

    public GrideViewAdapter(Context context, List<Bitmap> tupian) {
        this.context = context;
        this.tupian = tupian;
        Log.d(TAG, "List size:" + tupian.size());
    }

    @Override
    public int getCount() {

        return tupian.size();
    }

    @Override
    public Object getItem(int position) {

        return tupian.get(position);
    }

    @Override
    public long getItemId(int position) {

        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Holder holder;
        if (convertView == null) {
            inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.gride_item, null);
            holder = new Holder();
            holder.im_item = (ImageView) convertView.findViewById(R.id.im_item);
            convertView.setTag(holder);
        } else {
            holder = (Holder) convertView.getTag();
        }
        holder.im_item.setImageBitmap(tupian.get(position));
        return convertView;
    }

    private class Holder {
        ImageView im_item;
    }

}

//下面是布局文件

activity_main

<LinearLayout 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:orientation="vertical" >
 <Button
  android:id="@+id/open_camera"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="打开摄像头" />
 <Button
  android:id="@+id/pick_image"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="打开相册" />
</LinearLayout>

                                                                                  activity_picture

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin" >
 <GridView
  android:id="@+id/gridview"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:columnWidth="90dp"
  android:gravity="center"
  android:horizontalSpacing="10dp"
  android:numColumns="2"
  android:stretchMode="columnWidth"
  android:verticalSpacing="10dp" >
 </GridView>
</LinearLayout>

                                                                                                                                             gride_item

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center_horizontal"
 android:orientation="vertical" >
 <ImageView
  android:id="@+id/im_item"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />
</LinearLayout>

 

0 0
原创粉丝点击