Android設定頭像,手機拍照或從本地相簿選取圖片作為頭像
??
【Android設定頭像,手機拍照或從本地相簿選取圖片作為頭像】
像、QQ、微博等社交類的APP,通常都有設定頭像的功能,設定頭像通常有兩種方式:
1,讓使用者通過選擇本地相簿之類的圖片庫中已有的映像,裁剪後作為頭像。
2,讓使用者啟動手機的相機拍照,拍完照片後裁剪,然後作為頭像。
我現在寫一個簡單的完整代碼例子,說明如何在Android中實現上述兩個頭像設定功能。
MainActivity.java檔案:
package zhangpgil.photo;import java.io.File;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;public class MainActivity extends ActionBarActivity {/* 頭像檔案 */private static final String IMAGE_FILE_NAME = temp_head_image.jpg;/* 請求識別碼 */private static final int CODE_GALLERY_REQUEST = 0xa0;private static final int CODE_CAMERA_REQUEST = 0xa1;private static final int CODE_RESULT_REQUEST = 0xa2;// 裁剪後圖片的寬(X)和高(Y),480 X 480的正方形。private static int output_X = 480;private static int output_Y = 480;private ImageView headImage = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);headImage = (ImageView) findViewById(R.id.imageView);Button buttonLocal = (Button) findViewById(R.id.buttonLocal);buttonLocal.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {choseHeadImageFromGallery();}});Button buttonCamera = (Button) findViewById(R.id.buttonCamera);buttonCamera.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {choseHeadImageFromCameraCapture();}});}// 從本地相簿選取圖片作為頭像private void choseHeadImageFromGallery() {Intent intentFromGallery = new Intent();// 設定檔案類型intentFromGallery.setType(image/*);intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);}// 啟動手機相機拍攝照片作為頭像private void choseHeadImageFromCameraCapture() {Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 判斷儲存卡是否可用,儲存照片檔案if (hasSdcard()) {intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME)));}startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);}@Overrideprotected void onActivityResult(int requestCode, int resultCode,Intent intent) {// 使用者沒有進行有效設定作業,返回if (resultCode == RESULT_CANCELED) {Toast.makeText(getApplication(), 取消, Toast.LENGTH_LONG).show();return;}switch (requestCode) {case CODE_GALLERY_REQUEST:cropRawPhoto(intent.getData());break;case CODE_CAMERA_REQUEST:if (hasSdcard()) {File tempFile = new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);cropRawPhoto(Uri.fromFile(tempFile));} else {Toast.makeText(getApplication(), 沒有SDCard!, Toast.LENGTH_LONG).show();}break;case CODE_RESULT_REQUEST:if (intent != null) {setImageToHeadView(intent);}break;}super.onActivityResult(requestCode, resultCode, intent);}/** * 裁剪原始的圖片 */public void cropRawPhoto(Uri uri) {Intent intent = new Intent(com.android.camera.action.CROP);intent.setDataAndType(uri, image/*);// 設定裁剪intent.putExtra(crop, true);// aspectX , aspectY :寬高的比例intent.putExtra(aspectX, 1);intent.putExtra(aspectY, 1);// outputX , outputY : 裁剪圖片寬高intent.putExtra(outputX, output_X);intent.putExtra(outputY, output_Y);intent.putExtra(return-data, true);startActivityForResult(intent, CODE_RESULT_REQUEST);}/** * 提取儲存裁剪之後的圖片資料,並設定頭像部分的View */private void setImageToHeadView(Intent intent) {Bundle extras = intent.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable(data);headImage.setImageBitmap(photo);}}/** * 檢查裝置是否存在SDCard的工具方法 */public static boolean hasSdcard() {String state = Environment.getExternalStorageState();if (state.equals(Environment.MEDIA_MOUNTED)) {// 有儲存的SDCardreturn true;} else {return false;}}}