zoukankan      html  css  js  c++  java
  • 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>

  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6930815.html
Copyright © 2011-2022 走看看