只用涉及到用户模块的App基本上就会用到头像替换的功能,类似的代码也是信手沾来,百度、GitHub以及各大论坛好博客一大把,随便粘过来就可以用了。但是。。。有坑。在华为荣耀手机上踩坑了,网上看了下问的人不少,没人回答。觉得很有必要写下来,希望能够帮到更多的朋友。
之前我也有写过一篇文章——Android图片上传(头像裁切+原图原样) ,被几个论坛转了不少,很是开心。
今天说的是这个坑,网上有一篇文章说出了问题——解决一下华为手机选取相册照片,选取不到问题,我在断点的时候也按照步骤发现就是这么回事:
笔者在选择了相册中的图片之后要进入图片裁剪的时候出错,(华为)手机提示“此图片无法获取”,经百度后,明白是版本不同导致的URI的问题的问题,原文如下:
4.3或以下,选了图片之后,根据Uri来做处理,很多帖子都有了,我就不详细说了.主要是4.4,如果使用上面pick的原生方法来选图,返回的uri还是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri跟4.3是完全不一样的,4.3返回的是带文件路径的,而4.4返回的却是content://com.android.providers.media.documents/document/image:3951这样的,没有路径,只有图片编号的uri.这就导致接下来无法根据图片路径来裁剪的步骤了.
既然知道了问题所在,那就用代码来说话了,注释里面该有的都有了,按照惯例需要的资源我会在文末给出0积分下载。
另外文中涉及的东西免费赠送:
1、圆形ImageView显示。
2、底部弹出框菜单。
看下效果图
点击头像弹出菜单
框选方形区域,这个界面和手机型号有关,不尽相同,这里是魅族手机的样式。
替换完成,圆形图片显示
package sun.geoffery.picselect;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import sun.geoffery.picselect.utils.SDCardUtils;
import sun.geoffery.picselect.view.BottomPushPopupWindow;
import sun.geoffery.picselect.view.CircleImageView;
/**
* 点击头像替换图片
* 解决华为手机拍照和相册取不到图片的问题
*/
public class MainActivity extends AppCompatActivity {
private BottomPushPopupWindow mPop;
public String TAG = "";
private CircleImageView avatarImg;
private static final String IMAGE_FILE_NAME = "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;
@Override