Android头像的选择
纲要:使用的图库或拍照上传到阿里云服务器,返回给自己的服务端,然后在加载到客户端。
- 关于这头像的选择网上资料太多了以下纯属个人观点。
1.使用相册和拍照的时候能适用于大部分手机,但是ZTE BA190这款手机在图库选择的时候会出现的异常(加了权限并不能解决问题,有人说是image%3A11577这里特殊处理下,一般都是/,暂时没有尝试),拍照还是可以正常使用,并且绝大部分的手机相册和拍照,传统的选择上传方式都是可以满足的。
关键的代码块 这里是用了ButterKnife这个插件变量的申明就简单些:
代码块
`
//这里我继承了BaseActivity 是自己写的类封装了一点加载的时候的提示框
public class ProfileActivity extends BaseActivity implements View.OnClickListener {
@BindView(R.id.mBack)
ImageView mBack;
//这里是自定义的圆形头像
@BindView(R.id.head)
BoderCircleImageView head;
@BindView(R.id.head_update)
LinearLayout headUpdate;
@BindView(R.id.textName)
TextView textName;
@BindView(R.id.mName)
LinearLayout mName;
@BindView(R.id.man)
TextView man;
@BindView(R.id.woman)
TextView woman;
@BindView(R.id.pwwd)
TextView pwwd;
@BindView(R.id.myQming)
LinearLayout myQming;
@BindView(R.id.bind_phone)
LinearLayout bindPhone;
@BindView(R.id.update_pwd)
LinearLayout updatePwd;
@BindView(R.id.exit_btn)
Button exitBtn;
@BindView(R.id.mPhone)
TextView mPhone;
private ACache mCache;
EditText editTextt;
/**
* 用于上传的头像文件
*/
File file;
File PHOTO_DIR = null;// 拍照的照片存储位置
String mFileName = "temp_cropped.jpg";// 图片名称
String photoPath = "";// 图片保存路径
public static final int PHOTO_ALBUM = 0x10;// 相册返回结果
public static final int PHOTO_CAMERA = 0x11;// 拍照返回结果
public static final int PHOTO_RESULT = 0x12;// 剪切返回结果
/**
* 阿里云图片上传
*/
// 运行sample前需要配置以下字段为有效的值
//文件存储目录
private String endpoint = "后台给你的上传地址";
private static final String testBucket = "后台给你的目录名";
private String accessKeyId = "你自己阿里云的accessKeyId ";
private String accessKeySecret = "你自己阿里云的accessKeySecret ";
private String uploadFilePath;
private String uploadObject;
private OSS oss;
private String str;
String img;
@Override
protected void onCreate(Bundle savedInstanceState) {
StatusTitleUtils.setStatus(R.color.colorGreen, this);//设置状态栏颜色
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_profile);
ButterKnife.bind(this);
// 初始化图片保存路径
photoPath = HttpConfig.PATH;
PHOTO_DIR = new File(photoPath);
// 在onCreate里通过get方式获取缓存实例
mCache = ACache.get(this);
/**
*上传到oss
*/
OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);
ClientConfiguration conf = new ClientConfiguration();
conf.setConnectionTimeout(15 * 1000); // 连接超时,默认15秒
conf.setSocketTimeout(15 * 1000); // socket超时,默认15秒
conf.setMaxConcurrentRequest(5); // 最大并发请求书,默认5个
conf.setMaxErrorRetry(2); // 失败后最大重试次数,默认2次
OSSLog.enableLog();
oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, conf);
//获取会员信息
getUserInforTask();
uploadObject = mCache.getAsString("id");
}
/**
* 获取用户信息任务
*/
void getUserInforTask() {
RequestParams params = new RequestParams(HttpConfig.WIP + "appmember/member/detail");
params.addBodyParameter("id", mCache.getAsString("id"));
new HttpRequest(UserInforEntity.class).post(params, new HttpCallBack() {
@Override
public void update(Object object) {
UserInforEntity entity = (UserInforEntity) object;
if (entity.isSuccess()) {
textName.setText(entity.getData().getNickName());
mPhone.setText(entity.getData().getPhone());
img = entity.getData().getImg();
Log.e("===444====", "" + img);
if (entity.getData().getImg() != "") {
Glide.with(ProfileActivity.this).load(entity.getData().getImg()).diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true).into(head);
ACache.get(ProfileActivity.this).put("AVATAR", entity.getData().getImg());
}
} else {
Toast.makeText(ProfileActivity.this.getApplicationContext(), entity.getMsg(), Toast.LENGTH_SHORT).show();
}
}
});
}
@OnClick({R.id.mBack, R.id.head_update, R.id.mName, R.id.man, R.id.woman, R.id.pwwd, R.id.myQming, R.id.bind_phone, R.id.update_pwd, R.id.exit_btn})
public void onClick(View view) {
switch (view.getId()) {
case R.id.mBack:
finish();
break;
case R.id.head_update:
//你只需要看执行这个方法的后续操作,从拍照或者图库→上传阿里云服务器→自己服务器→客户端显示的过程
ShowPickDialog();
break;
case R.id.mName:
editTextt = new EditText(this);
new AlertDialog.Builder(this).setView(editTextt).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
RequestParams params = new RequestParams(HttpConfig.WIP + "appmember/member/nickName");
String nick_name = editTextt.getText().toString();
params.addBodyParameter("id", mCache.getAsString("id"));
params.addBodyParameter("spId", HttpConfig.SPID);
params.addBodyParameter("nickName", nick_name);
if (nick_name != null && !nick_name.equals("")) {
showLoading("数据请求中...");
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
Log.e("onSuccess", "" + result);
Log.e("id", "" + mCache.getAsString("id"));
Gson gson = new Gson();
BaseEntity baseEntity = gson.fromJson(result, BaseEntity.class);
int httpcode = baseEntity.getHttpCode();
if (httpcode == 200) {
//点击确定
textName.setText(editTextt.getText().toString());
mCache.put("NICKNAME", editTextt.getText().toString());
sendBroadcast();
dissmissLoading();
Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
dissmissLoading();
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
} else {
Toast.makeText(ProfileActivity.this.getApplicationContext(), "昵称不能为空!", Toast.LENGTH_SHORT).show();
}
}
}).show();
break;
case R.id.man:
man.setBackgroundResource(R.drawable.edge_left_down);
woman.setBackgroundResource(R.drawable.edge_center);
pwwd.setBackgroundResource(R.drawable.edge_right_down);
break;
case R.id.woman:
woman.setBackgroundResource(R.color.colorGreen);
man.setBackgroundResource(R.drawable.edge_left);
pwwd.setBackgroundResource(R.drawable.edge_right_down);
break;
case R.id.pwwd:
man.setBackgroundResource(R.drawable.edge_left);
woman.setBackgroundResource(R.drawable.edge_center);
pwwd.setBackgroundResource(R.drawable.edge_right);
break;
case R.id.myQming:
break;
case R.id.bind_phone:
startActivity(new Intent(ProfileActivity.this, UpdatePhoneActivity.class));
break;
case R.id.update_pwd:
startActivity(new Intent(this, ForgetActivity.class));
break;
case R.id.exit_btn:
exitBtn.setEnabled(false);
RequestParams params = new RequestParams(HttpConfig.WIP +
"/appmember/member/logout");
params.addBodyParameter("id", mCache.getAsString("id"));
new HttpRequest(IsExitEntity.class).post(params, new
HttpCallBack() {
@Override
public void update(Object object) {
exitBtn.setEnabled(true);
IsExitEntity entity = (IsExitEntity) object;
if (entity.isSuccess() && entity.isData()) {
//mCache.clear();
mCache.put("id", "");
mCache.put("sn", "");
Log.e("-------", "");
// 清空任务栈(TaskStack)
Intent logoutIntent = new Intent
(ProfileActivity.this, MainActivity.class);
logoutIntent.setFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
logoutIntent.putExtra("outlogin", true);
startActivity(logoutIntent);
finish();
} else {
Toast.makeText
(ProfileActivity.this.getApplicationContext(), entity.getMsg(),
Toast.LENGTH_SHORT)
.show();
}
}
});
break;
}
}
// 传统的设置头像的方法
private void ShowPickDialog() {
new AlertDialog.Builder(this).setTitle("设置头像").setNegativeButton("相册", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
try {
Intent intent2 = new Intent(Intent.ACTION_GET_CONTENT, null);
intent2.setType("image/*");
startActivityForResult(intent2, PHOTO_ALBUM);
} catch (ActivityNotFoundException e) {
Toast.makeText(ProfileActivity.this.getApplicationContext(), "没有找到相册!", Toast.LENGTH_SHORT).show();
}
}
}).setPositiveButton("拍照", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
File file = new File(PHOTO_DIR, "temp.png");
if (file.exists()) {
file.delete();
}
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(PHOTO_DIR, "temp.png")));
try {
startActivityForResult(intent, PHOTO_CAMERA);
} catch (Exception e) {
Toast.makeText(ProfileActivity.this.getApplicationContext(), "请打开相机权限!", Toast.LENGTH_SHORT).show();
}
}
}).show();
}
/**
* 调用系统图片编辑进行裁剪
*/
private void startPhotoCrop(Uri uri) {
mFileName = System.currentTimeMillis() + ".png";
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("scale", true);
uploadFilePath = photoPath + mFileName;
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(photoPath, mFileName)));
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, PHOTO_RESULT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
// 如果是直接从相册获取
case PHOTO_ALBUM:
// 调用系统剪裁
if (data != null) {
startPhotoCrop(data.getData());
}
break;
// 如果是调用相机拍照时
case PHOTO_CAMERA:
// 调用系统剪裁
startPhotoCrop(Uri.fromFile(new File(photoPath, "temp.png")));
break;
// 取得裁剪后的图片
case PHOTO_RESULT:
//图片保存路径加命名
file = new File(photoPath + mFileName);
if (file.exists()) {
beginupload();
}
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
public void beginupload() {
showLoading("数据请求中...");
// 构造上传请求
PutObjectRequest put = new PutObjectRequest(testBucket, "appdata/" + uploadObject + ".png", uploadFilePath);
// 异步上传时可以设置进度回调
put.setProgressCallback(new OSSProgressCallback<PutObjectRequest>() {
@Override
public void onProgress(PutObjectRequest request, long currentSize, long totalSize) {
Log.e("----11-----", "");
Log.e("PutObject", "currentSize: " + currentSize + " totalSize: " + totalSize);
}
});
OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
@Override
public void onSuccess(PutObjectRequest request, PutObjectResult result) {
Log.e("PutObject", "UploadSuccess");
Log.e("ETag", result.getETag());
Log.e("RequestId", result.getRequestId());
begindownload();
}
@Override
public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
dissmissLoading();
// 请求异常
if (clientExcepion != null) {
// 本地异常如网络异常等
clientExcepion.printStackTrace();
}
if (serviceException != null) {
// 服务异常
Log.e("ErrorCode", serviceException.getErrorCode());
Log.e("RequestId", serviceException.getRequestId());
Log.e("HostId", serviceException.getHostId());
Log.e("RawMessage", serviceException.getRawMessage());
}
}
});
}
private void begindownload() {
new Thread(new Runnable() {
@Override
public void run() {
str = oss.presignPublicObjectURL(testBucket, "appdata/" + uploadObject + ".png");
Log.e("=========aaa=======", "" + str);
RequestParams params = new RequestParams(HttpConfig.WIP + "appmember/member/img");
params.addBodyParameter("id", uploadObject);
params.addBodyParameter("img", str);
params.addBodyParameter("spId", HttpConfig.SPID);
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
dissmissLoading();
Log.e("----sssss----", "" + result);
Gson gson = new Gson();
BaseEntity baseEntity = gson.fromJson(result, BaseEntity.class);
int httpcode = baseEntity.getHttpCode();
if (httpcode == 200) {
getUserInforTask();
sendBroadcast();
Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(ProfileActivity.this.getApplicationContext(), baseEntity.getMsg(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
ex.printStackTrace();
dissmissLoading();
Toast.makeText(ProfileActivity.this.getApplicationContext(), "上传失败!", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(CancelledException cex) {
dissmissLoading();
}
@Override
public void onFinished() {
}
});
}
}).start();
}
void sendBroadcast() {
//修改信息后发送广播
Intent intent = new Intent();
intent.setAction("com.znh.modifyUserInfor");
sendBroadcast(intent);
}
}`
别忘了在application中初始化图片的存储的路径
HttpConfig.PATH = FileUtils.getFilePath(getApplicationContext(), "/文件名/");
/**
* 本地缓存目录
*/
public class HttpConfig {
public static String PATH = "";
}
这里有一部分代码段是不需要的节约时间就全部粘贴进来了,上面有说明你只需要看的部分。
2.当然你必须先去看Tusdk的文档,这里使用TUsdk头像选择图库和拍照的时候就解决了上面出现的异常,代码块和上面的相同只是选择的渠道方式不同而已
这里就给些简单的TuSDK的代码块,你需要在平台申请应用并填写包名,必须打包相对应的应用下面的资源到你的目录中,这里只使用了TuSDK部分的功能。
并且要使用它给你的TusdkUIdefault作为module,这里看文档其实不难。
在application中初始化
//TUsdk
TuSdk.enableDebugLog(true);
// 开发ID (请前往 http://tusdk.com 获取您的 APP 开发秘钥)
this.initPreLoader(this.getApplicationContext(), "你自己的");
代码块
// 使用TUsdk设置头像的方法
private void ShowPickDialog() {
showSample(ProfileActivity.this);
}
/**
* 显示范例
*/
public void showSample(Activity activity) {
if (activity == null)
return;
TuAvatarComponent component = TuSdkGeeV1.avatarCommponent(activity,
new TuSdkComponent.TuSdkComponentDelegate() {
@Override
public void onComponentFinished(TuSdkResult arg0,
Error arg1, TuFragment arg2) {
//TODO 这里有三种方式选择图片
//1.获取图片的 Bitmap 对象,此方式将不保存图片
//2.获取图片的存储路径,此方式会将图片保存在相册中(这里选择的是第二种会保存在相册中)
//3.将图片保存在临时文件中,并获取临时文件
uploadFilePath = arg0.imageSqlInfo.path;// 拿到图片路径
Log.e("图片的路径", uploadFilePath + "");
//图片保存路径加命名
file = new File(uploadFilePath + "");
if (file.exists()) {
beginupload();
}
}
});
component.componentOption().cameraOption()
.setAvPostion(CameraConfigs.CameraFacing.Back);// 默认后置摄像头
// 是否保存到相册
component.componentOption().cameraOption().setSaveToAlbum(false);
// 是否保存到临时文件
component.componentOption().cameraOption().setSaveToTemp(true);
component.componentOption().cameraOption().setSaveToAlbumName("Camera");
// 需要显示的滤镜名称列表 (如果为空将显示所有自定义滤镜, 可选)
String[] filters = {"SkinNature", "SkinPink", "SkinJelly", "SkinNoir",
"SkinRuddy", "SkinPowder", "SkinSugar"};
component.componentOption().cameraOption()
.setFilterGroup(Arrays.asList(filters));
component
// 在组件执行完成后自动关闭组件
.setAutoDismissWhenCompleted(true)
// 显示组件
.showComponent();
}
这里的好处就是只需要调Tusdk的处理事件,其他的后续操作压缩和存储的路径之类的都不用自己写,比较方便同时也解决了上面的问题。
当然出现上面的问题的时候肯定有解决的方法,但是为了赶时间所以选择了Tusdk的方式解决了,希望大家给出的建议和问题的解决方式,Android 4.X部分手机会出现64K问题,按照tusdk处理就能解决。
本文章纯属个人观点,供参考和积累,希望有所帮助!