天天看点

Android实现更换头像功能(适配Android7.0版本)

只要涉及到用户的功能,基本都会使用到用户头像功能。那么切换用户头像,就是一个必做的功能。切换头像的图片源,一般有两个:一个是拍照然后裁剪图片,另一种是从图库中选择图片,然后裁剪图片。所以这里就来实现这两个功能。

1.拍照

直接贴代码

//打开相机拍照,获取头像
private void toTake(){
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    file = new File(PICTURE_FILE_DIR,
            System.currentTimeMillis() + ".jpg");

    if (Build.VERSION.SDK_INT >= 24) {
        ImgUri = FileProvider.getUriForFile(this, AUTHORITY, file);
    } else {
        ImgUri = Uri.fromFile(file);
    }

    intent.putExtra(MediaStore.EXTRA_OUTPUT, ImgUri);
    startActivityForResult(intent, TAKE_PICTURE_REQUEST_CODE);
}
           

TAKE_PICTURE_REQUEST_CODE是一个常量,可以是任何值,用户拍照回调的识别。

注意,打开相机时,需要传uri。如果是Android7.0版本,图片的url就需要使用FileProvider.getUriForFile获取。

2.图库

接下来是打开图库的代码

//打开相册,选择图片
private void openAlbum(){
    Intent intent2 = new Intent("android.intent.action.PICK");
    intent2.setType("image/*");
    startActivityForResult(intent2, ALBUM_REQUEST_CODE);
}
           

注意,ALBUM_REQUEST_CODE是图库的回调值,不要与拍照的回调值一样。

## 3.裁剪图片

```java
//裁剪图片
public void onPhoto(Uri uri, int outputX, int outputY) {
	 Intent intent = null;
	 File saveFile = new File(PICTURE_FILE_DIR+"head.jpg");
	 if (!saveFile.exists()){
	     try {
	         saveFile.createNewFile();          //创建裁剪图片后的保存地址
	     }catch (IOException e){
	         e.printStackTrace();
	     }
	 }
	 Uri mUriSave = Uri.fromFile(saveFile);           //裁剪图片时,mUriSave是要使用Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile。
	
	 intent = new Intent("com.android.camera.action.CROP");
	
	 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {                                       //如果安卓7.0版本以上,要加上这句话
	     intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);                                 //否则拍照后裁剪会报,无法加载图片的异常
	 }
	
	 intent.setDataAndType(uri, "image/*");
	 intent.putExtra("crop", "true");
	 intent.putExtra("aspectX", 1);
	 intent.putExtra("aspectY", 1);
	 intent.putExtra("outputX", outputX);
	 intent.putExtra("outputY", outputY);
	 intent.putExtra("scale", true);
	 intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriSave);  //mUriSave是要使用Uri.fromFile(file)生成的,而不是使用FileProvider.getUriForFile。
	 intent.putExtra("return-data", true);
	 intent.putExtra("circleCrop", true);
	 intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
	 intent.putExtra("noFaceDetection", true); // no face detection
	 startActivityForResult(intent, TAILOR_REQUEST_CODE);
}
           

TAILOR_REQUEST_CODE表示裁剪图片的回调值

这里需要注意两个地方:

1.裁剪图片时,mUriSave是要使用Uri.fromFile(file)生成的,而不能使用FileProvider.getUriForFile。否则会出现,“无法保存裁剪后的图片”提示异常

2.如果是Android7.0等高版本,需要添加这句代码,intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

否则会无法加载图片的异常

4.回调

根据程序的回调来执行接下来的方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode){
        case TAKE_PICTURE_REQUEST_CODE:       //拍照回调
            if (ImgUri != null) {
                onPhoto(ImgUri, 300, 300);
            }
            break;
        case ALBUM_REQUEST_CODE:              //图库选择回调
            if (data != null) {
                Uri uri = data.getData();
                onPhoto(uri, 300, 300);
            }
            break;
        case TAILOR_REQUEST_CODE:             //图片裁剪后回调
            if (data != null) {
                    Bundle extras = data.getExtras();
                    Bitmap bitmap = (Bitmap) extras.get("data");
                    if (bitmap != null) {
                        accountHeadPortraitImage.setImageBitmap(bitmap);
                    }
                }
            break;
    }
}
           

accountHeadPortraitImage为要显示裁剪后图片的ImageView控件。到此,整个程序就完成了。

5.写在最后

加油!

加油!

加油!