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
如果有幫助歡迎點贊哦~~
有問題請在評論區留言