即拿即用-选择头像,可以选择相册,拍照,查看大图,保存到本地
来源:互联网 发布:数据库resource权限 编辑:程序博客网 时间:2024/06/06 07:40
如图所示:
显示图片用的是Glide
选择图片用的是GalleryFinal
查看大图用的是PhotView
圆形图片用的是SelectableRoundedImageView
GitHub地址:https://github.com/mocn26169/Avatar
核心代码:
点击选择图片
@Override public void onClick(View v) { switch (v.getId()) { case R.id.avatar: if (!TextUtils.isEmpty(url)) { new ActionSheetDialog(GalleryFinalActivity.this) .builder() .setCancelable(true) .setCanceledOnTouchOutside(true) .addSheetItem("相册", SheetItemColor.Blue, new OnSheetItemClickListener() { @Override public void onClick(int which) { // GalleryFinal.openGallerySingle(REQUEST_CODE_GALLERY, mOnHanlderResultCallback); //带配置 functionConfig = new FunctionConfig.Builder() .setEnableCamera(false) .setEnableEdit(false) .setEnableCrop(true) .setEnableRotate(true) .setCropSquare(true) .setEnablePreview(true) .build(); GalleryFinal.openGallerySingle(REQUEST_CODE_GALLERY, functionConfig, mOnHanlderResultCallback); } }) .addSheetItem("拍照", SheetItemColor.Blue, new OnSheetItemClickListener() { @Override public void onClick(int which) { GalleryFinal.openCamera(REQUEST_CODE_CAMERA, mOnHanlderResultCallback); } } ) .addSheetItem("查看大图", SheetItemColor.Blue, new OnSheetItemClickListener() { @Override public void onClick(int which) { Intent intent = new Intent(GalleryFinalActivity.this, BrowsePictureActivity.class); intent.putExtra("url", url); startActivity(intent); } } ) .show(); } else { new ActionSheetDialog(GalleryFinalActivity.this) .builder() .setCancelable(true) .setCanceledOnTouchOutside(true) .addSheetItem("相册", SheetItemColor.Blue, new OnSheetItemClickListener() { @Override public void onClick(int which) { } }) .addSheetItem("拍照", SheetItemColor.Blue, new OnSheetItemClickListener() { @Override public void onClick(int which) { GalleryFinal.openCamera(REQUEST_CODE_CAMERA, mOnHanlderResultCallback); } } ) .show(); } break; default: break; } }
回调成功显示图片
private GalleryFinal.OnHanlderResultCallback mOnHanlderResultCallback = new GalleryFinal.OnHanlderResultCallback() { @Override public void onHanlderSuccess(int reqeustCode, List<PhotoInfo> resultList) { if (resultList != null && resultList.size() > 0) { url = resultList.get(0).getPhotoPath(); Log.e("MainActivity", "url=" + url); Glide .with(GalleryFinalActivity.this) .load("file://" + url) .asBitmap()// .load("https://ss0.baidu.com/73t1bjeh1BF3odCf/it/u=2561733620,2304282159&fm=85&s=E71450848ABEFCCE643AA8800300308C")// .centerCrop() .placeholder(R.mipmap.default_placeholder)// .crossFade() .into(avatar); } } @Override public void onHanlderFailure(int requestCode, String errorMsg) { Toast.makeText(GalleryFinalActivity.this, errorMsg, Toast.LENGTH_SHORT).show(); } };}
保存图片到本地
view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { new ActionSheetDialog(BrowsePictureActivity.this) .builder() .setCancelable(true) .setCanceledOnTouchOutside(true) .addSheetItem("保存到手机", SheetItemColor.Blue, new OnSheetItemClickListener() { @Override public void onClick(int which) { onDownLoad(url); } }) .show(); return true; } });
/** * 启动图片下载线程 */ private void onDownLoad(String url) { ProgressUtils.show(BrowsePictureActivity.this, null, "正在保存,请耐心等候......"); DownLoadImageService service = new DownLoadImageService(getApplicationContext(), url, new ImageDownLoadCallBack() { @Override public void onDownLoadSuccess(File file, String url) { } @Override public void onDownLoadSuccess(Bitmap bitmap, String url) { // 在这里执行图片保存方法 Message message = new Message(); message.what = MSG_VISIBLE; message.obj = url; downLoadHandler.sendMessage(message); } @Override public void onDownLoadFailed() { // 图片保存失败 Message message = new Message(); message.what = MSG_ERROR; downLoadHandler.sendMessage(message); } }); //启动图片下载线程 new Thread(service).start(); }
package com.bourne.avatar;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.net.Uri;import android.os.Environment;import com.bumptech.glide.Glide;import com.bumptech.glide.request.target.Target;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/** * 图片下载 */public class DownLoadImageService implements Runnable { private String url; private Context context; private ImageDownLoadCallBack callBack; private File currentFile; public DownLoadImageService(Context context, String url, ImageDownLoadCallBack callBack) { this.url = url; this.callBack = callBack; this.context = context; } @Override public void run() { File file = null; Bitmap bitmap = null; String savePicturePosition = ""; try {// file = Glide.with(context)// .load(url)// .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)// .get(); bitmap = Glide.with(context) .load(url) .asBitmap() .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .get(); if (bitmap != null) { // 在这里执行图片保存方法 savePicturePosition = saveImageToGallery(context, bitmap); } } catch (Exception e) { e.printStackTrace(); } finally {// if (file != null) {// callBack.onDownLoadSuccess(file);// } else {// callBack.onDownLoadFailed();// } if (bitmap != null && currentFile.exists()) { callBack.onDownLoadSuccess(bitmap, savePicturePosition); } else { callBack.onDownLoadFailed(); } } } public String saveImageToGallery(Context context, Bitmap bmp) { String savePicturePosition = null; // 首先保存图片 File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsoluteFile();//注意小米手机必须这样获得public绝对路径 String dirName = "Avatar"; File appDir = new File(file, dirName); if (!appDir.exists()) { appDir.mkdirs(); } String fileName = System.currentTimeMillis() + ".jpg"; currentFile = new File(appDir, fileName); savePicturePosition = currentFile.getAbsolutePath(); FileOutputStream fos = null; try { fos = new FileOutputStream(currentFile); bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } // 其次把文件插入到系统图库// try {// MediaStore.Images.Media.insertImage(context.getContentResolver(),// currentFile.getAbsolutePath(), fileName, null);// } catch (FileNotFoundException e) {// e.printStackTrace();// } // 最后通知图库更新 context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File(currentFile.getPath())))); return savePicturePosition; }}
package com.bourne.avatar;import android.graphics.Bitmap;import java.io.File;public interface ImageDownLoadCallBack { void onDownLoadSuccess(File file,String url); void onDownLoadSuccess(Bitmap bitmap,String url); void onDownLoadFailed();}
一个避免内存泄露的Handler,具体可见《 Android内存优化方案和内存泄露检测分析方法》
private static class DownLoadHandler extends Handler { private WeakReference<BrowsePictureActivity> activityWeakReference; public DownLoadHandler(BrowsePictureActivity activity) { this.activityWeakReference = new WeakReference<BrowsePictureActivity>(activity); } @Override public void handleMessage(Message msg) { ProgressUtils.dissmiss(); BrowsePictureActivity activity = activityWeakReference.get(); if (activity != null) { if (msg.what == MSG_VISIBLE) { new AlertDialog(activity).builder() .setMsg("图片保存成功,路径为" + msg.obj) .setNegativeButton("确定", new View.OnClickListener() { @Override public void onClick(View v) { } }).show();// Toast.makeText(activity, "文件已保存在" + msg.obj, Toast.LENGTH_LONG).show(); } else if (msg.what == MSG_ERROR) { new AlertDialog(activity).builder() .setMsg("图片保存失败" + msg.obj) .setNegativeButton("确定", new View.OnClickListener() { @Override public void onClick(View v) { } }).show();// Toast.makeText(activity, "文件保存失败", Toast.LENGTH_LONG).show(); } } } } @Override protected void onDestroy() { super.onDestroy(); downLoadHandler.removeCallbacksAndMessages(null); }
参考
https://github.com/pengjianbo/GalleryFinal GalleryFinal
https://github.com/bumptech/glide Glide
https://github.com/chrisbanes/PhotoView PhotView
https://github.com/pungrue26/SelectableRoundedImageView SelectableRoundedImageView
0 0
- 即拿即用-选择头像,可以选择相册,拍照,查看大图,保存到本地
- android拍照与相册选择照片并保存本地
- android头像选择(拍照,相册,裁剪)
- 从手机相册或拍照选择头像
- android头像选择(拍照,相册,裁剪)
- 从相册选择图片后保存到本地
- android相册拍照保存图片到本地
- 长按 WebView 页面图片弹出对话框可以选择保存长按的图片到本地相册
- 用户切换头像,可以选择相册和相机,也可以发送到服务器
- Android实现拍照,以及从相册选择图片裁剪功能同时保存在本地
- Android开发--通过相册或拍照选择头像
- Android开发--通过相册或拍照选择头像
- Android开发--通过相册或拍照选择头像
- Android开发--通过相册或拍照选择头像
- 安卓手机拍照,从相册选择,上传头像
- 切换头像,拍照或者相册选择后剪裁
- Android 头像选择(拍照、相册裁剪),含7.0的坑
- Android 项目更换头像(拍照和选择相册)
- 计算数据的相似度:欧几里德、皮尔逊相关度
- 四种分页的写法--4月27号
- 【Git】简单使用方法
- 程序员:像机器一样思考
- 信息的表示和处理(待补充)
- 即拿即用-选择头像,可以选择相册,拍照,查看大图,保存到本地
- spring10
- 端游、手游服务端常用的架构是什么样的?
- 513. Find Bottom Left Tree Value
- Android中的设计模式
- MAC OS查看端口占用情况及杀死进程
- Linux Kernel 学习笔记7:同步与互斥之自旋锁
- Spark源码学习笔记1-SparkContext
- Android 网络调试 tcpip 开启方法以及10061错误解决方法