Bmob 圖片的上傳與下載「 最新版 」

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

如果有幫助歡迎點贊哦~~

有問題請在評論區留言

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章