Android Bmob 的图片上传与下载
图片上传 | 图片上传后,对象( user )里不要存 Bitmap 否则拖慢加载速度有烂费流量 |
---|---|
上传方法 | 上床图片后放回一个 BmobFile 对象,保存到 User 里 |
下载方法 | 根据所获得 User 的BmobFile 成员信息,调用 .getUrl() 方法获得 Url 进行下载 |
实战项目:
亿签-让签到更简单( 实验室签到系统 ):点击跳转 https://github.com/FishInWater-1999/android-SignInSystem
图片上传部分
注:picPath 为访问相册或相机拍照后,获得的图片路径
/*定义一个Handler,定义延时执行的行为*/
public void chnageImage(){
final String picPath = path;
final BmobFile bmobFile = new BmobFile(imageFactory(picPath));
bmobFile.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if(e==null){
user.setImageFile(bmobFile);
user.update(new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null) {
Toast.makeText(MainActivity.this, "头像已更新", Toast.LENGTH_SHORT).show();
} else {
}
}
});
//bmobFile.getFileUrl()--返回的上传文件的完整地址
new Thread(){
@Override
public void run() {
while ( bitmap == null ){
bitmap = BitmapFactory.decodeFile(picPath);
}
Message message = handler.obtainMessage();
message.obj = 0;
handler.sendMessage(message);
}
}.start();
}else{
Toast.makeText(MainActivity.this, "设置失败,请重新选择", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onProgress(Integer value) {
// 返回的上传进度(百分比)
}
});
}
下载图片
new AvatarLoader(userViewHolder.head_icon, user).load();
这里需要两个封装类
public class AvatarLoader extends ImageLoader{
private User mUser;
public AvatarLoader(ImageView imageView, User user) {
super(imageView);
mUser = user;
}
public void load(){
BmobQuery<User> q=new BmobQuery<>();
q.getObject(mUser.getObjectId(), new QueryListener<User>() {
@Override
public void done(User user, BmobException e) {
if(user.getImageFile()!=null) {
setUrl(user.getImageFile().getUrl());
AvatarLoader.super.load();
}
}
});
}
}
public class ImageLoader extends Handler {
private ImageView mImageView;
private String mUrl;
private Bitmap mBitmap;
public ImageLoader(ImageView imageView, String url) {
mImageView = imageView;
mUrl = url;
}
public ImageLoader(ImageView imageView) {
mImageView = imageView;
}
public void setUrl(String url) {
mUrl = url;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
new Thread(){
@Override
public void run() {
super.run();
try{
URL url=new URL(mUrl);
URLConnection connection=url.openConnection();
connection.connect();
InputStream inputStream=connection.getInputStream();
mBitmap= BitmapFactory.decodeStream(inputStream);
sendEmptyMessage(1);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e){
e.printStackTrace();
}
}
}.start();
}else {
if(mImageView.getMeasuredWidth()==0) {
final ViewTreeObserver vto = mImageView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
vto.removeOnGlobalLayoutListener(this);
adjustViewHeight();
}
});
}else{
adjustViewHeight();
}
}
}
public void load(){
sendEmptyMessage(0);
}
private void adjustViewHeight(){
ViewGroup.LayoutParams params=mImageView.getLayoutParams();
float ratio = (float) mBitmap.getHeight() / mBitmap.getWidth();
params.height = (int) (mImageView.getMeasuredWidth() * ratio);
params.width=mImageView.getMeasuredWidth();
mImageView.setImageBitmap(mBitmap);
}
}
由于拍摄的图片一般较大所以进程需要压缩
/*
压缩路径下的文件
*/
private File imageFactory(String picPath){
BitmapFactory.Options o=new BitmapFactory.Options();
Bitmap bitmap=BitmapFactory.decodeFile(picPath, o);
bitmap=Bitmap.createScaledBitmap(bitmap, 400, 400, false);
File root= getExternalCacheDir();
File pic=new File(root,"test.jpg");
try {
FileOutputStream fos=new FileOutputStream(pic);
bitmap.compress(Bitmap.CompressFormat.JPEG,50,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return pic;
}
使用到这些内容的项目地址:
点击右边跳转:点击跳转 https://github.com/FishInWater-1999/android-SignInSystem
如果有帮助欢迎点赞哦~~
有问题请在评论区留言