Android設置頭像,手機拍照或從本地相冊選取圖片作為頭像

cm54 9年前發布 | 236K 次閱讀 Android 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;

    @Override
    protected 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() {

            @Override
            public void onClick(View v) {
                choseHeadImageFromGallery();
            }
        });

        Button buttonCamera = (Button) findViewById(R.id.buttonCamera);
        buttonCamera.setOnClickListener(new View.OnClickListener() {

            @Override
            public 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);
    }

    @Override
    protected 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)) {
            // 有存儲的SDCard
            return true;
        } else {
            return false;
        }
    }
}


布局文件有三個組件:放置頭像的ImageView,兩個Button,其中一個Button觸發從本地相冊選取圖片作為頭像的操作時間;另外一個Button觸發手機拍攝照片作為頭像的操作事件。activity_main.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <Button
        android:id="@+id/buttonLocal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="本地相冊選取頭像" />

    <Button
        android:id="@+id/buttonCamera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="手機拍照選取頭像" />

</LinearLayout>


 本文由用戶 cm54 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!