照相机照相、保存图片到本地文件、点击按钮显示图片到界面上
来源:互联网 发布:色情直播软件用猫粮 编辑:程序博客网 时间: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>
- 照相机照相、保存图片到本地文件、点击按钮显示图片到界面上
- 图片异步压缩保存到本地文件PhotoCompress
- Android将图片保存到本地文件
- 捕获Camera并保存图片到本地(照相功能) -samhy
- 调用照相机与图片库并实现保存图片到图片库
- 图片的倾斜,点击按钮和鼠标移动到图片上
- 鼠标移动到图片出现按钮,点击删除图片
- 保存图片到SQL Server并显示
- 获取指定窗口界面到图片 同时 保存到剪切板
- 使用AsyncTask完成点击按钮下载图片到ImageView控件上
- C#保存图片到数据库,读取图片显示
- struts2保存图片到数据库,从数据库显示图片
- 图片上传并保存到数据库以及显示图片
- 预览显示图片and上传图片保存到image里
- 保存图片到数据库
- 保存图片到数据库
- 保存图片到数据库
- 保存图片到数据库
- IEEE中的浮点编码计算
- 设计模式之六大原则——迪米特法则(LoD,LKP)
- android studio新建project的时候connect refused:connect或者卡在building project...或Refreshing
- HashTable剖析
- CCTF 2016 WriteUp(部分)
- 照相机照相、保存图片到本地文件、点击按钮显示图片到界面上
- Node.js 基础命令
- iOS :undefined symbols for architecture x86_64错误解决方案
- OkHttp使用教程
- 简单技能之程序调试入门
- C++字符串
- HDU2181重温世界杯DP(环的和不为0的最大长度)
- 笔记(Spring管理Hibernate)
- 记录linux软件源代理服务器设置方法