直接上代碼:
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);
}
}