直接上代码:
TestActivity.java
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
public class TestActivity extends Activity implements OnClickListener {
/** 需要被更换的头像 */
private ImageView mAvatar;
/** 剪切后的map对象 */
private Bitmap mBitmap;
/** 头像文件 **/
private File mFinalPicFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
}
private void initView() {
mAvatar = (ImageView) findViewById(R.id.iv);
mAvatar.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv:
GetPicUtil.getImgFromLocal(this, 10000);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (10000 == requestCode) {
// 从本地选择图片
// 看完相册后,将点击的图片uri传给剪切板
if (data != null) {
Uri imgUrl = data.getData();
zoomPhoto(imgUrl, requestCode);
}
}
if (11000 == requestCode) {
if (data != null) {
Bundle bundle_2 = data.getExtras();
mBitmap = (Bitmap) bundle_2.get("data");
saveImage(mBitmap, getFinalPicFile());
// 从截取相册头像返回
// 判断文件长度不为0,用户执行了截取图片操作
if (mFinalPicFile.length() != 0f) {
// 在截取好的本地图片上传到服务器上
// updateUserAvatar(mFinalPicFile);
Bitmap bm = BitmapFactory.decodeFile(mFinalPicFile
.getPath());
mAvatar.setImageBitmap(bm);
}
}
}
}
/**
* 裁剪图片
*
* @param uri
* @param num_position
*/
private void zoomPhoto(Uri uri, int num_position) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("scale", true); // 设置是否允许拉伸
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 256);
intent.putExtra("outputY", 256);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());// 设置输出格式
intent.putExtra("return-data", true);
// 这里必须要加1000
startActivityForResult(intent, num_position + 1000);
}
/**
* 获取剪切后图片的缓存路径
*
* @return
*/
private File getFinalPicFile() {
// 临时文件名
String temp = GetPicUtil.getPhotoFileName();
/**
* files下pictures的路径,String为文件夹名
*
* 即:/mnt/sdcard/Android/data/'包名'/files/Pictures/'String'
*/
File dirFile = new File(
this.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
"avatar");
if (!dirFile.exists()) {
if (!dirFile.mkdir())
try {
throw new Exception("目录不存在,创建失败!");
} catch (Exception e) {
e.printStackTrace();
}
}
// 默认在sdcard根目录下 可以自定义目录
mFinalPicFile = new File(dirFile.getPath() + File.separator + temp);
// 出错点,输出流的真实输出文件,也要进行判断路径,不存在时,要进行创建。
if (!mFinalPicFile.exists()) {
try {
mFinalPicFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
return mFinalPicFile;
}
/**
* 缓存图片
*
* @param bmp
* @param file
*/
private void saveImage(Bitmap bmp, File file) {
file.mkdirs();
try {
FileOutputStream out = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
if (!file.exists()) {
Toast.makeText(TestActivity.this, "文件路径出错", Toast.LENGTH_SHORT)
.show();
}
MediaScannerConnection.scanFile(this,
new String[] { file.getAbsolutePath() }, null, null);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
GetPicUtil.java
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
/**
* 图片获取工具类
*
* @author Administrator
*
*/
public class GetPicUtil
{
public static File mPhotoFile;
public static String imageBasePath;
public static void fromTakeAPhoto(Activity activity, int CAMERA_WITH_DATA)
{
try
{
// 临时文件名
String temp = getPhotoFileName();
// 这里获得路径是项目在手机上安卓目录下,项目名下,files下pictures的路径,String为文件夹名
File dirFile = new File(
activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
"qtx");
if (!dirFile.exists())
{
if (!dirFile.mkdir())
try
{
throw new Exception("目录不存在,创建失败!");
} catch (Exception e)
{
e.printStackTrace();
}
}
// 默认在sdcard根目录下 可以自定义目录
mPhotoFile = new File(dirFile.getPath() + File.separator + temp);
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(mPhotoFile));
activity.startActivityForResult(cameraIntent, CAMERA_WITH_DATA + 1);
} catch (ActivityNotFoundException e)
{
e.printStackTrace();
}
}
// 获取拍照获取图片名
@SuppressLint("SimpleDateFormat")
public static String getPhotoFileName()
{
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat(
"'IMG'_yyyyMMdd_HHmmss");
return dateFormat.format(date) + ".jpg";
}
/**
* 获取本地图片
*
* @param activity
* @param requestCode
*/
public static void getImgFromLocal(Activity activity, int requestCode)
{
Intent localIntent = new Intent();
localIntent.setAction(Intent.ACTION_PICK);
localIntent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
activity.startActivityForResult(localIntent, requestCode);
}
}