一直觉得手机上的照相功能很强大,了解源码之后,就越来越喜欢了,啥也不说了,直接上代码……
Intent intent = new Intent();
intent.setAction("android.media.action.STILL_IMAGE_CAMERA");
startActivity(intent);
布局就是一个简单的GridView,添加的时候千万记住,对照片进行处理,不然会OOM。
publicclass MainActivity extends Activity {
privatestatic final String tag = "MainActivity";
private static final intCAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final intPICK_IMAGE_ACTIVITY_REQUEST_CODE = 200;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//点击打开照相机按钮进行拍照
Button button = (Button) this.findViewById(R.id.open_camera);
button.setOnClickListener(newView.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);
}
});
}
privatestatic String picFileFullName;
// 拍照
public void takePicture() {
Stringstate = 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 voidonActivityResult(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, "拍照失败");
}
} elseif (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, "从相册获取图片失败");
}
}
}
}
privatevoid setImageView(String realPath) {
Bitmapbmp = BitmapFactory.decodeFile(realPath);
intdegree = readPictureDegree(realPath);
Log.e(tag, "rotate:" + degree);
// 创建操作图片是用的matrix对象
Matrixmatrix = new Matrix();
// 旋转图片动作
matrix.postRotate(degree);
}
/**
* This method is used toget real path of file from from uri<br/>
* captured-from-camera
*
* @param contentUri
* @return String
*/
public StringgetRealPathFromURI(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 intreadPictureDegree(String path) {
intdegree = 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();
}
returndegree;
}
publicvoid toast(String msg) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
}
}
public classPictureActivity extends Activity {
private GridView gridview;
private GrideViewAdapter adapter;
private List<Bitmap> tupian = newArrayList<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 = newGrideViewAdapter(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);
}
}
}
}
}
public classGrideViewAdapter 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) {
returntupian.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 = newHolder();
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;
}
}