import java.io.ByteArrayOutputStream;
import java.io.File;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private static final int TAKE_PICTURE = 0;
private static final int FROM_ALBUM = 1;
private static final int CROP_PICTURE = 2;
private ImageView iv;
private String ImageUri =
Environment.getExternalStorageDirectory().getAbsolutePath() + "/photo.jpeg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView)findViewById(R.id.iv);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.take_picture:
// 判断 sd 卡是否存在
if(Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED){
// 创建拍照意图
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 指明图片的保存路径,相机拍照后,裁剪前,会先保存到该路径下;裁剪时,再从该路径加载图片
// 若无这句,则拍照后,图片会放入内存中,从而由于占用内存太大导致无法剪切或者剪切后无法保存
camera.putExtra(MediaStore.EXTRA_OUTPUT, getImageUri());
startActivityForResult(camera, TAKE_PICTURE);
} else {
Toast.makeText(this, "没有 sd 卡", Toast.LENGTH_LONG).show();
}
return true;
case R.id.from_album:
// 创建相册意图
Intent album = new Intent(Intent.ACTION_GET_CONTENT);
// 指明数据为一个 URI
album.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
// 指明 MIME 类型为 image
album.setType("image/*");
startActivityForResult(album, FROM_ALBUM);
return true;
case R.id.cancle:
return true;
}
return false;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK){
switch (requestCode) {
case TAKE_PICTURE:
// 在创建意图时已经指定了保存的 uri 地址,所以可以直接从中
// 获取待裁剪图片
cropImage(getImageUri(),80,80,CROP_PICTURE);
break;
case FROM_ALBUM:
// 从 相册 Activity 中获取图片 uri
Uri uri = data.getData();
cropImage(uri,80,80,CROP_PICTURE);
break;
case CROP_PICTURE:
// 获取剪切后的图片
Bitmap photo = null;
Bundle extra = data.getExtras();
if(extra != null){
photo = (Bitmap)extra.get("data");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);
iv.setImageBitmap(photo);
}
default:
break;
}
}
}
private Uri getImageUri() {
return Uri.fromFile(new File(ImageUri));
}
private void cropImage(Uri uri, int outputX, int outputY, int requestCode) {
// 裁剪图片意图
Intent intent = new Intent("com.android.camera.action.CROP");
// 制定待裁剪的 image 所在路径 uri
intent.setDataAndType(uri, "image/*");
// 意图的 为 crop(裁剪) true
intent.putExtra("crop", "true");
// 裁剪框的比例,1:1
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// 裁剪后,输出图片的尺寸
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
// 图片格式
intent.putExtra("outputFormat", "JPEG");
// 取消人脸识别功能
intent.putExtra("noFaceDetection", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, requestCode);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
// 布局文件很简单,只有一个 RelativeLayout 和 一个 Imageiew
<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=".MainActivity" >
<ImageView
android:id="@+id/iv"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_centerInParent="true"
android:background="#ffffff"/>
</RelativeLayout>
其中 菜单 menu.xml 为
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/take_picture"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/take_picture"/>
<item
android:id="@+id/from_album"
android:orderInCategory="101"
android:showAsAction="always"
android:title="@string/from_album"/>
<item
android:id="@+id/cancle"
android:orderInCategory="102"
android:showAsAction="always"
android:title="@string/cancle"/>
</menu>
// 用到的 strings.xml 文件为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">takePhoto</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="take_picture">拍照</string>
<string name="from_album">相册</string>
<string name="cancle">取消</string>
</resources>