仿微信修改头像,自定义相册、自定义裁剪

最近因为项目需求需要自定义修改头像时的相册,另外调用系统裁剪经常出现无法裁剪图片的错误,所以裁剪也决定自定义,参照了这两篇文章:

https://blog.csdn.net/lvshaorong/article/details/51263648?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/luo115600/article/details/78459192

上效果图:

文末附上我项目中用到的源码。
一、自定义图库:
主布局:
album_photos_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" >
    <LinearLayout
        android:id="@+id/album_layout_title"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:paddingLeft="10dp"
        android:background="@color/colorAccent"
        android:orientation="horizontal"
        android:gravity="left|center_vertical">
        <ImageView
            android:id="@+id/album_cancel_and_back"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:src="@drawable/arrow_left"/>
        <LinearLayout
            android:id="@+id/show_album_list"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal"
            android:background="@drawable/album_select_bar_style"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:gravity="center">
            <TextView
                android:id="@+id/album_folder_name"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginRight="5dp"
                android:gravity="center"
                android:text="@string/all_photos"
                android:textSize="@dimen/primaty_text_size"/>
            <ImageView
                android:id="@+id/album_folder_name_icon"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:src="@drawable/arrow_up"/>
        </LinearLayout>
    </LinearLayout>

    <GridView
        android:id="@+id/album_photos_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:horizontalSpacing="5dp"
        android:verticalSpacing="5dp"
        android:numColumns="3"
        android:stretchMode="columnWidth"
        android:layout_below="@+id/album_layout_title" />

    <RelativeLayout
        android:id="@+id/album_folder_list_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#aa000000"
        android:layout_below="@+id/album_layout_title"
        android:layout_marginTop="-100dp"
        android:visibility="gone">
        <ListView
            android:id="@+id/album_folder_list_item"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:background="@color/white"/>
    </RelativeLayout>
</RelativeLayout>

tem布局:
album_photos_adapter.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/album_photo_layout"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:background="@color/grey"
    android:descendantFocusability="blocksDescendants">
    <ImageView
        android:id="@+id/album_photo"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:scaleType="centerCrop"
        android:clickable="false" />
</LinearLayout>

主代码:
SelectPhotoActivity.java

package com.xter.comunityserver.Album;

import android.Manifest;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;

import com.xter.comunityserver.BaseActivity;
import com.xter.comunityserver.R;
import com.xter.comunityserver.Util.PermissionsUtils;
import com.xter.comunityserver.Util.PictureUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class SelectPhotoActivity extends BaseActivity implements SelectPhotoAdapter.CallBackActivity,OnClickListener{
    private static String TAG = "SelectPhotoActivity";
    SelectPhotoAdapter allPhotoAdapter =  null;
    ImageView album_cancel_and_back;//左上角返回键
    LinearLayout show_album_list;//展开相册列表
    TextView album_folder_name;//当前相册名
    ImageView album_folder_name_icon;//展开箭头图标
    GridView album_photos_view;//当前界面所有的照片
    RelativeLayout album_folder_list_layout;//图片文件夹视图
    ListView album_folder_list_item;//文件列表中的子项

    private AlbumListAdapter albumListAdapter;
    private List<AlbumBean> albumList = new ArrayList<>();//相册列表
    boolean isShowAlbum;//相册列表是展开的还是关闭的

    //头像图片路径
    String pictureFile = Environment.getExternalStorageDirectory()+"/Pictures/";//此处的Pictures对应与provider_paths下的path,是为了保证fileprovider的路径一致
    public String cameraPhotoUrl;//拍照完的照片名
    private File photoFile;//存储拍照照片的文件
    public static final int REQ_CAMARA = 1000;//相机请求码
    private final int CLIP_PHOTO_BY_SELF_REQUEST_CODE = 3;//自定义裁剪界面请求码
    private File headIconFile = null;// 相册或者拍照保存的文件
    private File headClipFile = null;// 裁剪后的头像
    private String headFileNameStr = "headIcon.jpg";
    private String clipFileNameStr = "clipIcon.jpg";
    private String headFileSuffix = ".jpg";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.album_photos_layout);
    }

    private void initView(){
        album_photos_view = findViewById(R.id.album_photos_view);
        allPhotoAdapter = new SelectPhotoAdapter(this, new ArrayList<SelectPhotoAdapter.SelectPhotoEntity>());
        album_photos_view.setAdapter(allPhotoAdapter);
        album_cancel_and_back = findViewById(R.id.album_cancel_and_back);
        show_album_list = findViewById(R.id.show_album_list);
        album_folder_name = findViewById(R.id.album_folder_name);
        album_folder_name_icon = findViewById(R.id.album_folder_name_icon);
        album_folder_list_layout = findViewById(R.id.album_folder_list_layout);
        album_folder_list_item = findViewById(R.id.album_folder_list_item);
        headClipFile = new File(pictureFile, clipFileNameStr);

        //图片点击事件
        album_photos_view.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(position == 0){
                    cameraPhotoUrl = System.currentTimeMillis() + "temp.jpg";//相机拍完之后的命名
                    try {
                        SharedPreferences camerasp = getSharedPreferences("Camera", Context.MODE_PRIVATE);
                        if (camerasp != null) {
                            SharedPreferences.Editor editor = camerasp.edit();
                            editor.putString("photoUrl", cameraPhotoUrl);
                            editor.apply();
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }

                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    photoFile = new File(pictureFile, cameraPhotoUrl);
                    Uri uri;
                    if(Build.VERSION.SDK_INT >= 24) {
                        uri = FileProvider.getUriForFile(
                                SelectPhotoActivity.this,
                                getPackageName() + ".fileprovider",
                                photoFile);
                    }else {
                        uri = Uri.fromFile(photoFile);
                    }
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                    startActivityForResult(intent, REQ_CAMARA);
                }else {
                    SelectPhotoAdapter.SelectPhotoEntity entity = allPhotoAdapter.allPhotoList.get(position-1);
                    clipPhotoBySelf(entity.url);
                }
            }
        });

        //选择相册的布局
        album_folder_list_layout.setOnClickListener(this);//外层

        //绑定点击
        album_cancel_and_back.setOnClickListener(this);
        show_album_list.setOnClickListener(this);

        getpermissions();
    }

    /**
     * 进入程序后检查权限
     */
    public void getpermissions(){
        String[] permissions = new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.READ_PHONE_STATE,Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA};
        PermissionsUtils.getInstance().chekPermissions(this, permissions, permissionsResult);
    }
    //创建监听权限的接口对象
    PermissionsUtils.IPermissionsResult permissionsResult = new PermissionsUtils.IPermissionsResult() {
        @Override
        public void passPermissons() {
            showPhoto();
        }
        @Override
        public void forbitPermissons() {
            finish();
        }
    };
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //就多一个参数this
        PermissionsUtils.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
    }

    private void showPhoto(){
        //扫描手机上所有的图片
        SelectPhotoAdapter.getPhotoFromLocalStorage(SelectPhotoActivity.this, new SelectPhotoAdapter.LookUpPhotosCallback() {
            @Override
            public void onSuccess(ArrayList<SelectPhotoAdapter.SelectPhotoEntity> photoArrayList) {
                if(photoArrayList == null || photoArrayList.size() ==0)return;
                allPhotoAdapter.allPhotoList.clear();
                allPhotoAdapter.allPhotoList.addAll(photoArrayList);
                allPhotoAdapter.notifyDataSetChanged();
                //添加一个默认的相册用来存放所有图片
                AlbumBean defaultAlbum = new AlbumBean();
                defaultAlbum.albumFolder = Environment.getExternalStorageDirectory();
                defaultAlbum.topImagePath = photoArrayList.get(0).url;
                defaultAlbum.imageCounts = photoArrayList.size();
                defaultAlbum.folderName = "所有图片";
                albumList.add(0,defaultAlbum);
                if(albumListAdapter != null){//这个回调优先于查找相册回调
                    Log.i(TAG,"图片落后回调");
                    albumListAdapter.notifyDataSetChanged();
                }
            }
        });
        //查找并设置手机上的所有相册
        AlbumBean.getAllAlbumFromLocalStorage(SelectPhotoActivity.this, new AlbumBean.AlbumListCallback() {
            @Override
            public void onSuccess(ArrayList<AlbumBean> result) {
                albumList.addAll(result);
                albumListAdapter = new AlbumListAdapter(SelectPhotoActivity.this,albumList);
                album_folder_list_item.setAdapter(albumListAdapter);
            }
        });

        album_folder_list_item.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(albumList!=null && position < albumList.size() && albumList.get(position) != null){//满足条件才能set
                    album_folder_name.setText(albumList.get(position).folderName);
                }
                isShowAlbum=false;
                hideAlbum();
                AlbumBean.getAlbumPhotosFromLocalStorage(SelectPhotoActivity.this, albumList.get(position), new AlbumBean.AlbumPhotosCallback() {
                    @Override
                    public void onSuccess(ArrayList<SelectPhotoAdapter.SelectPhotoEntity> photos) {
                        allPhotoAdapter.allPhotoList.clear();//因为是ArrayAdapter,所以引用不能重置
                        allPhotoAdapter.allPhotoList.addAll(photos);
                        allPhotoAdapter.notifyDataSetChanged();
                    }
                });
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        if(album_folder_list_item == null)
            initView();
    }

    @Override
    public void updateSelectActivityViewUI() {

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent dataIntent) {
        super.onActivityResult(requestCode, resultCode, dataIntent);
        switch (requestCode) {
            case SelectPhotoAdapter.REQ_CAMARA: {//1000如果是相机发来的
                if (RESULT_OK == resultCode) {//系统默认值
                    String cameraPhotoUrl = "temp.jpg";
                    try {
                        SharedPreferences camerasp = getSharedPreferences("Camera", Context.MODE_PRIVATE);
                        if (camerasp != null) {
                            cameraPhotoUrl = camerasp.getString("photoUrl", "temp.jpg");//得到之前在adapter里存好的文件名
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                    File file = new File(pictureFile, cameraPhotoUrl);//这个文件指针指向拍好的图片文件
                    final String imageFilePath = file.getAbsolutePath();
                    clipPhotoBySelf(imageFilePath);
                    break;
                }
            }
            case CLIP_PHOTO_BY_SELF_REQUEST_CODE:
                if (RESULT_OK == resultCode){
                    //将裁剪后的图片保存到本地
                    final String clipFilePath = headClipFile.getAbsolutePath();
                    Log.e(TAG,"要裁剪的图片地址"+headClipFile);
                    headClipFile = new File(clipFilePath);
                    String clipUrl = null;
                    ContentResolver cr = SelectPhotoActivity.this.getContentResolver();
                    clipUrl =PictureUtils.insertImage(this, cr, headClipFile, true);//返回值为要发送图片的url
                    Uri uri = Uri.parse(clipUrl);
                    //将裁剪得的照片的url字符串传回去
                    Intent intent = new Intent();
                    intent.putExtra("selectPhotos",uri);//把获取到图片交给别的Activity
                    setResult(RESULT_OK, intent);
                    finish();
                    break;
                }else
                    break;

        }
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.album_cancel_and_back:
                finish();
                break;
            case R.id.show_album_list:
                if(isShowAlbum)
                    hideAlbum();//现在是展示album的状态
                else
                    showAlbum();//现在是关闭(正常)状态
                break;
            case R.id.album_folder_list_layout:
                hideAlbum();
                break;
        }
    }

    /**
     * 隐藏相册选择页
     */
    void hideAlbum(){
        if(Build.VERSION.SDK_INT >=11) {
            ObjectAnimator animator1 = ObjectAnimator.ofFloat(album_folder_list_layout, "alpha", 1.0f, 0.0f);
            ObjectAnimator animator2 = ObjectAnimator.ofFloat(album_folder_name_icon, "rotationX", 180f, 360f);
            ObjectAnimator animator3 = ObjectAnimator.ofFloat(album_folder_list_layout, "translationY", -dp2Px(100));
            AnimatorSet set = new AnimatorSet();
            set.setDuration(300).playTogether(animator1, animator2, animator3);
            set.start();
            set.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    album_folder_list_layout.setVisibility(View.GONE);
                }
            });
        }else {
            album_folder_list_layout.setVisibility(View.GONE);
        }
        isShowAlbum=false;
    }

    /**
     * 显示相册选择页
     */
    void showAlbum(){
        if(Build.VERSION.SDK_INT>=11) {
            album_folder_list_layout.setVisibility(View.VISIBLE);//一定要显示,才能执行动画操作
            ObjectAnimator animator1 = ObjectAnimator.ofFloat(album_folder_list_layout, "alpha", 0.0f, 1.0f);
            ObjectAnimator animator2 = ObjectAnimator.ofFloat(album_folder_name_icon, "rotationX", 0f, 180f);
            ObjectAnimator animator3 = ObjectAnimator.ofFloat(album_folder_list_layout, "translationY", dp2Px(100));
            AnimatorSet set = new AnimatorSet();
            set.setDuration(300).playTogether(animator1, animator2, animator3);
            set.start();
        }else {
            album_folder_list_layout.setVisibility(View.VISIBLE);//一定要显示,才能执行动画操作
        }
        isShowAlbum=true;
    }

    public int dp2Px(int dp) {
        try {
            DisplayMetrics metric = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metric);
            return (int) (dp * metric.density + 0.5f);
        } catch (Exception e) {
            e.printStackTrace();
            return dp;
        }
    }

    /**
     * 调用自定义切图方法
     *
     * @param filePath
     */
    protected void clipPhotoBySelf(String filePath) {
        Log.i(TAG, "通过自定义方式去剪辑这个照片");
        //进入裁剪页面,此处用的是自定义的裁剪页面而不是调用系统裁剪
        Intent intent = new Intent(SelectPhotoActivity.this, ClipPictureActivity.class);
        intent.putExtra(ClipPictureActivity.IMAGE_PATH_ORIGINAL, filePath);
        intent.putExtra(ClipPictureActivity.IMAGE_PATH_AFTER_CROP,
                headClipFile.getAbsolutePath());

        startActivityForResult(intent, CLIP_PHOTO_BY_SELF_REQUEST_CODE);

    }

}

主适配器代码:
SelectPhotoAdapter.java

package com.xter.comunityserver.Album;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.MediaStore;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.xter.comunityserver.R;
import java.io.Serializable;
import java.util.ArrayList;
import android.content.Context;
import static com.xter.comunityserver.Util.ScreenUtils.getScreenWidth;

public class SelectPhotoAdapter extends ArrayAdapter<SelectPhotoAdapter.SelectPhotoEntity>{
    private static String TAG = "SelectPhotoAdapter";
    private Activity mActivity;
    public ArrayList<SelectPhotoEntity> allPhotoList;
    public static final int REQ_CAMARA = 1000;
    private ImageLoader imageLoader;//图片加载器
    private int destWidth, destHeight;
    int screenWidth;

    public SelectPhotoAdapter(Activity activity, ArrayList<SelectPhotoEntity> array) {
        super(activity, R.layout.album_photos_adapter, array);
        this.mActivity = activity;
        this.allPhotoList = array;
        this.imageLoader = new ImageLoader(activity);
        screenWidth = getScreenWidth(activity);
        this.destWidth = (screenWidth - 20) / 3;
        this.destHeight = (screenWidth - 20) / 3;
    }

    @Override
    public int getCount() {
        return allPhotoList.size()+1;//加一是为了那个相机图标
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();

            convertView = LayoutInflater.from(getContext()).inflate(R.layout.album_photos_adapter, parent, false);
            viewHolder.album_photo_layout = (LinearLayout) convertView.findViewById(R.id.album_photo_layout);
            viewHolder.album_photo = (ImageView) convertView.findViewById(R.id.album_photo);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        if (viewHolder.album_photo.getLayoutParams() != null) {
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) viewHolder.album_photo.getLayoutParams();
            lp.width = destWidth;
            lp.height = destHeight;
            viewHolder.album_photo.setLayoutParams(lp);
        }


        if (position == 0) {//第一个位置显示一个小相机
            Log.e(TAG,"点击的位置:"+position);
            imageLoader.setAsyncBitmapFromSD(null,viewHolder.album_photo,0,false,false,false);//防止回调覆盖了imageView原来的bitmap
            viewHolder.album_photo.setImageDrawable(getDrawable(mActivity,R.drawable.album_cameraadd));
        } else if((allPhotoList != null) && (position >= 0) && (allPhotoList.size() >= position) && (allPhotoList.get(position-1) != null)){
            final SelectPhotoEntity photoEntity = allPhotoList.get(position-1);
            final String filePath = photoEntity.url;
            imageLoader.setAsyncBitmapFromSD(filePath,viewHolder.album_photo,screenWidth/3,false,true,true);
            viewHolder.album_photo_layout.setTag(R.id.album_photo_layout,photoEntity);
        }
        return convertView;
    }


    class ViewHolder {
        public LinearLayout album_photo_layout;
        public ImageView album_photo;
    }

    public interface CallBackActivity{
        void updateSelectActivityViewUI();
    }

    public static class SelectPhotoEntity implements Serializable, Parcelable {
        public String url;
        public int isSelect;

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(this.url);
            dest.writeInt(this.isSelect);
        }

        public SelectPhotoEntity() {
        }

        protected SelectPhotoEntity(Parcel in) {
            this.url = in.readString();
            this.isSelect = in.readInt();
        }

        public static final Parcelable.Creator<SelectPhotoEntity> CREATOR = new Parcelable.Creator<SelectPhotoEntity>() {
            @Override
            public SelectPhotoEntity createFromParcel(Parcel source) {
                return new SelectPhotoEntity(source);
            }

            @Override
            public SelectPhotoEntity[] newArray(int size) {
                return new SelectPhotoEntity[size];
            }
        };

        @Override
        public String toString() {
            final StringBuffer sb = new StringBuffer("SelectPhotoEntity{");
            sb.append("url='").append(url).append('\'');
            sb.append(", isSelect=").append(isSelect);
            sb.append('}');
            return sb.toString();
        }

        @Override
        public int hashCode() {//使用hashcode和equals方法防止重复
            if(url != null)return url.hashCode();
            return super.hashCode();
        }

        @Override
        public boolean equals(Object o) {
            if(o instanceof SelectPhotoEntity){
                return o.hashCode() == this.hashCode();
            }
            return super.equals(o);
        }
    }

    public static Drawable getDrawable(Context context, int id) {
        if ((context == null) || (id < 0)) {
            return null;
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            return context.getResources().getDrawable(id, null);
        } else {
            return context.getResources().getDrawable(id);
        }
    }

    /**
     * 从系统相册里面取出图片的uri
     */
    public static void getPhotoFromLocalStorage(final Context context, final LookUpPhotosCallback completeCallback) {
        //在子线程中获取图片
        new MultiTask<Void,Void,ArrayList<SelectPhotoEntity>>(){

            @Override
            protected ArrayList<SelectPhotoEntity> doInBackground(Void... params) {
                ArrayList<SelectPhotoEntity> allPhotoArrayList = new ArrayList<>();

                Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                ContentResolver mContentResolver = context.getContentResolver();//得到内容处理者实例

                String sortOrder = MediaStore.Images.Media.DATE_MODIFIED + " desc";//设置拍摄日期为倒序
                // 只查询jpeg和png的图片
                Cursor mCursor = mContentResolver.query(mImageUri, new String[]{MediaStore.Images.Media.DATA}, MediaStore.Images.Media.MIME_TYPE + "=? or " + MediaStore.Images.Media.MIME_TYPE + "=?", new String[]{"image/jpeg", "image/png"}, sortOrder);
                if (mCursor == null) return
                        allPhotoArrayList;
                int size = mCursor.getCount();
                if (size == 0)
                    return
                            allPhotoArrayList;
                for (int i = 0; i < size; i++) {//遍历全部图片
                    mCursor.moveToPosition(i);
                    String path = mCursor.getString(0);// 获取图片的路径
                    SelectPhotoEntity entity = new SelectPhotoEntity();
                    entity.url = path;//将图片的uri放到对象里去
                    allPhotoArrayList.add(entity);
                }
                mCursor.close();
                return allPhotoArrayList;
            }

            @Override
            protected void onPostExecute(ArrayList<SelectPhotoEntity> photoArrayList) {
                super.onPostExecute(photoArrayList);
                if(photoArrayList == null)return;
                if(completeCallback != null)completeCallback.onSuccess(photoArrayList);
            }
        }.executeDependSDK();
    }

    /**
     * 查询照片成功的回调函数
     */
    public interface LookUpPhotosCallback {
        void onSuccess(ArrayList<SelectPhotoEntity> photoArrayList);
    }
}

所有的工具类代码如图片加载工具都放在源码里了。点击下载源码
最后只需要在设置头像的界面接收相册裁剪返回的参数就可以了:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        if (resultCode != RESULT_OK){
            return;
        }
        if(resultCode == RESULT_OK && resultCode != RESULT_CANCELED){
            switch (requestCode){
                case REQUEST_def_CODE:
                    String path = data.getParcelableExtra("selectPhotos").toString();
                    Bitmap bitmap = PictureUtils.getScalesBitmap(path,this);
                    headimage.setImageBitmap(bitmap);
                    break;
            }
        }
    }

有不明白的地方请联系我:
仿微信修改头像,自定义相册、自定义裁剪_第1张图片

你可能感兴趣的:(Android软件开发菜鸟探索)