Android頭像更換

直接上代碼:

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);
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章