項目需求討論-Retrofit中文提交及上傳頭像功能

又到了具體項目需求討論時間砸抛,還是老規(guī)矩,如果哪里不對树枫,希望大家指出來直焙,謝謝了。哈哈砂轻。

現(xiàn)在大家項目中一般標配是Rxjava+Retrofit+MVP了吧奔誓。反正我現(xiàn)在的項目都是用這個套路。(啥I浴厨喂!你這三個都不知道,那可以學(xué)習(xí)了L遐恕!臼婆!)其中網(wǎng)絡(luò)訪問的部分都是用Retrofit抒痒。一般的都是普通的post和get請求。

Retrofit的基本使用我不會再寫很多颁褂,因為網(wǎng)上的優(yōu)秀的文章太多了故响。我直接引用別人的:
Retrofit 入門基礎(chǔ)
Retrofit 用法詳解


我們項目中用Retrofit進行post和get的時候

比如:

登錄:

@POST("login/XXXXX.do")
Observable<HttpResult<LoginBean>> doLogin(@Query("username")String username, @Query("password")String password);

獲取列表:

@GET("accountManage/XXXXXX.do")
Observable<HttpResult<List<TransferExamItemBean>>> transferExamList(@Query("OrderID")String OrderID);

ok.都沒啥問題傀广,我主要談下我開發(fā)中做到的二個小需求。

需求一:上傳中文

那天彩届。我要做一個需求伪冰,就是進行一個轉(zhuǎn)賬(轉(zhuǎn)給這個賬號下已經(jīng)添加的聯(lián)系人)

那不是跟登錄的post類似么。把這些參數(shù)都提交過去給服務(wù)器樟蠕,然后告訴我提交成功與否就OK了贮聂。然后我就大手一揮,寫下:

@POST("accountManage/XXXXXXX.do")
Observable<HttpResult<TransferCardBean>> transferToCard(@Query("toName")String toName,.........)

然后填了相關(guān)的信息寨辩,按了提交發(fā)送給了后臺吓懈。這時候并沒有出現(xiàn)我想要的提交成功提示。但是我網(wǎng)絡(luò)提交的確是成功了靡狞。我叫后臺幫我看下Log信息耻警,后臺給的答案是:你這個真實姓名穿了亂碼過來。因為是亂碼甸怕,在這個人的聯(lián)系人下就找不到這個人甘穿,就轉(zhuǎn)不了錢了。梢杭。温兼。What!!!

后來才知道,這樣寫是不對的式曲。當參數(shù)是有中文的時候妨托,而是應(yīng)該以表單的形式提交。于是又大手一揮寫下了:

@FormUrlEncoded
@POST("accountManage/XXXXXXX.do")
Observable<HttpResult<TransferCardBean>> transferToCard(@Field("toName") String toName,..................);

這個需求就解決了吝羞。

需求二:個人中心要添加更改頭像

一般來說分為三步:

  1. 上傳頭像都是調(diào)用系統(tǒng)的相機或者直接選擇手機已經(jīng)有的圖片
  2. 進行圖片裁剪
  3. 上傳圖片到服務(wù)器兰伤,并把本地的頭像替換

我們一步步來處理:

第一步:
我們既然要選擇相機或者是選擇手機里面的圖片,那肯定先要有個彈框讓我們進行選擇钧排,想要哪種方式:

public void showChoosePicDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("添加圖片");
    String[] items = { "選擇本地照片", "拍照" };
    builder.setNegativeButton("取消", null);
    builder.setItems(items, new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch (which) {
                case CHOOSE_PICTURE: // 選擇本地照片
                    Intent openAlbumIntent = new Intent(
                            Intent.ACTION_GET_CONTENT);
                    openAlbumIntent.setType("image/*");
                    //用startActivityForResult方法敦腔,待會兒重寫onActivityResult()方法,拿到圖片做裁剪操作
                    startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);
                    break;
                case TAKE_PICTURE: // 拍照
                    Intent openCameraIntent = new Intent(
                            MediaStore.ACTION_IMAGE_CAPTURE);
                    tempUri = Uri.fromFile(new File(Environment
                            .getExternalStorageDirectory(), "temp_image.jpg"));
                    // 將拍照所得的相片保存到SD卡根目錄
                    openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
                    startActivityForResult(openCameraIntent, TAKE_PICTURE);
                    break;
            }
        }
    });
    builder.show();
}

第二步:

因為上面調(diào)用系統(tǒng)的功能恨溜,都是調(diào)用的startActivityForResult符衔,所以我們要復(fù)寫onActivityResult方法,當成功返回后糟袁,進行圖片的裁剪判族。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case TAKE_PICTURE:
                cutImage(tempUri); // 對圖片進行裁剪處理
                break;
            case CHOOSE_PICTURE:
                cutImage(data.getData()); // 對圖片進行裁剪處理
                break;
            case CROP_SMALL_PICTURE:
                if (data != null) {
                    setImageToView(data); // 讓剛才選擇裁剪得到的圖片顯示在界面上
                }
                break;
        }
    }
}

具體的裁剪圖片方法及保存裁剪圖片的方法:

/**
 * 裁剪圖片方法實現(xiàn)
 */
protected void cutImage(Uri uri) {
    if (uri == null) {
        Log.i("dyp", "The uri is not exist.");
    }
    tempUri = uri;
    Intent intent = new Intent("com.android.camera.action.CROP");
    //com.android.camera.action.CROP這個action是用來裁剪圖片用的
    intent.setDataAndType(uri, "image/*");
    // 設(shè)置裁剪
    intent.putExtra("crop", "true");
    // aspectX aspectY 是寬高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 是裁剪圖片寬高
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CROP_SMALL_PICTURE);
}
/**
 * 保存裁剪之后的圖片數(shù)據(jù)
 */
protected void setImageToView(Intent data) {
    Bundle extras = data.getExtras();
    if (extras != null) {
        mBitmap = extras.getParcelable("data");
        mBitmap = CommonUtil.toRoundBitmap(mBitmap, tempUri);//因項目需求,把圖片轉(zhuǎn)成圓形
        headPic.setImageBitmap(mBitmap);//頭像設(shè)置為新的圖片
        uploadPic(mBitmap);//上傳圖片到服務(wù)器
    }
}

這里調(diào)用系統(tǒng)圖片選擇器遇到的坑项戴,大家可以看下這篇文章形帮,寫的很好哈。。辩撑。Android 調(diào)用系統(tǒng)功能實現(xiàn)圖片選擇器界斜,你可能會遇到的問題匯總

第三步:

private void uploadPic(Bitmap bitmap) {
       
    // ... 可以在這里把Bitmap轉(zhuǎn)換成file,然后得到file的url合冀,做文件上傳操作
    // 注意這里得到的圖片已經(jīng)是圓形圖片了
    // bitmap是沒有做個圓形處理的各薇,但已經(jīng)被裁剪了

    String imagePath = CommonUtil.savePhoto(bitmap, Environment
            .getExternalStorageDirectory().getAbsolutePath(), String
            .valueOf(System.currentTimeMillis()));
    Log.e("imagePath", imagePath+"");
    if(imagePath != null){
        File file = new File(imagePath);
        presenter.uploadHeadPic(((AppContext) getActivity().getApplication()).getBean().getCompanyCode(),file);//這里是P層把圖片上傳到服務(wù)器。
    }
}

我為了大家看懂君躺,我把完整的p層代碼及M層代碼等都貼出來:

P層代碼:

@Override
public void uploadHeadPic(String companyCode, File file) {
    model.uploadHeadPic(companyCode,file)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<HttpResult<Object>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(HttpResult<Object> objectHttpResult) {
                        
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });
}

M層代碼:

@Override
public Observable<HttpResult<Object>> uploadHeadPic(String companyCode, File file) {
    
    RequestBody requestFile =
            RequestBody.create(MediaType.parse("multipart/form-data"), file);

    // MultipartBody.Part is used to send also the actual file name
    MultipartBody.Part MultipartFile =
            MultipartBody.Part.createFormData("picture", file.getName(), requestFile);

    return ((PersonCenterApi) getApiInstance(PersonCenterApi.class)).uploadFile(companyCode,MultipartFile);
}

PersonCenterApi代碼:

//上傳頭像
@POST("accountManage/companyHead.do")
@Multipart
Observable<HttpResult<Object>> uploadFile(@Part MultipartBody.Part MultipartFile);

然后就成功上傳圖片了峭判。這里我是上傳服務(wù)器前,就先把獲得的新圖片賦給了本地的ImageView晰洒,也可以上傳服務(wù)器朝抖,然后后臺返回成功信息后再去操作,把界面上的ImageView設(shè)置為新的圖片谍珊。治宣。這里大家根據(jù)不同要求改。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砌滞,一起剝皮案震驚了整個濱河市侮邀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贝润,老刑警劉巖绊茧,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異打掘,居然都是意外死亡华畏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門尊蚁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亡笑,“玉大人,你說我怎么就攤上這事横朋÷匚冢” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵琴锭,是天一觀的道長晰甚。 經(jīng)常有香客問我,道長决帖,這世上最難降的妖魔是什么厕九? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮地回,結(jié)果婚禮上扁远,老公的妹妹穿的比我還像新娘腺阳。我一直安慰自己,他們只是感情好穿香,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绎速,像睡著了一般皮获。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纹冤,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天洒宝,我揣著相機與錄音,去河邊找鬼萌京。 笑死雁歌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的知残。 我是一名探鬼主播靠瞎,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼求妹!你這毒婦竟也來了乏盐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤制恍,失蹤者是張志新(化名)和其女友劉穎父能,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净神,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡何吝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹃唯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爱榕。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俯渤,靈堂內(nèi)的尸體忽然破棺而出呆细,到底是詐尸還是另有隱情,我是刑警寧澤八匠,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布絮爷,位于F島的核電站,受9級特大地震影響梨树,放射性物質(zhì)發(fā)生泄漏坑夯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一抡四、第九天 我趴在偏房一處隱蔽的房頂上張望柜蜈。 院中可真熱鬧仗谆,春花似錦、人聲如沸淑履。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秘噪。三九已至狸吞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間指煎,已是汗流浹背蹋偏。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留至壤,地道東北人威始。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像像街,于是被迫代替她去往敵國和親黎棠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫镰绎、插件葫掉、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 有的小孩被一塊石頭絆倒,他會哭泣抱怨石頭跟狱,他把自己絆倒受痛歸因于石頭俭厚,但成人不會,成人會起身驶臊,然后心里告誡自己挪挤,下...
    像般若閱讀 200評論 0 0
  • 近期應(yīng)周圍朋友們和公號粉們的需求扛门,爽媽將會在爽媽英語課堂里進行一次專屬的英語啟蒙講座,主要針對的是0到6歲纵寝,確切的...
    爽媽閱讀 625評論 0 1