Retrofit網絡請求接口上傳頭像

一、權限


<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 二、拼接接口

@Multipart
    @POST("small/user/verify/v1/modifyHeadPic")
    Observable<ImageBean> getimage(@Header("userId")String userId,             
    @Header("sessionId")String sessionId,@Part MultipartBody.Part part);

三、Presenter層請求數據

public class HeaderPresenter extends BasePresenter<IShowView> {
    public void getheader(MultipartBody.Part part){
        Apinterface api = RetrofitUtil.getInstance().create(Apinterface.class);
        api.getimage("2195", "15569761189202195", part).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ImageBean>() {
                    @Override
                    public void accept(ImageBean imageBean) throws Exception {
                        getView().onSuccess(imageBean);
                    }
                });
    }
}

四、xml

1.主頁面

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#ffffff">
 
    <TextView
        android:id="@+id/zi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我的資料"
        android:textColor="#666666"
        android:textSize="@dimen/sp_16"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="@dimen/dp_40"
        />
    <RelativeLayout
        android:id="@+id/dat_rela"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/zi"
        android:layout_marginTop="@dimen/dp_20"
        android:layout_marginLeft="@dimen/dp_20"
        android:layout_marginRight="@dimen/dp_20"
        android:padding="@dimen/dp_20"
        android:background="@drawable/update_address_radius"
        android:focusable="true"
        android:focusableInTouchMode="true"
        >
        <TextView
            android:id="@+id/data_touxiang"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的頭像"
            android:textSize="@dimen/sp_14"
            android:textColor="#666666"
            />
        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/data_image_header"
            android:layout_width="@dimen/dp_30"
            android:layout_height="@dimen/dp_30"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="@dimen/dp_3"
            />
        <View
            android:id="@+id/xian1"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_1"
            android:background="#f2f2f2"
            android:layout_below="@id/data_touxiang"
            android:layout_marginTop="@dimen/dp_10"
            />
        <TextView
            android:id="@+id/data_nicheng"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的暱稱"
            android:textSize="@dimen/sp_14"
            android:textColor="#666666"
            android:layout_below="@id/xian1"
            android:layout_marginTop="@dimen/dp_10"
            />
        <TextView
            android:id="@+id/data_text_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="倒影"
            android:textSize="@dimen/sp_12"
            android:textColor="#999999"
            android:layout_alignParentRight="true"
            android:layout_alignBottom="@id/data_nicheng"
            android:layout_marginBottom="@dimen/dp_1"
            />
        <View
            android:id="@+id/xian2"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_1"
            android:background="#f2f2f2"
            android:layout_below="@id/data_nicheng"
            android:layout_marginTop="@dimen/dp_10"
            />
        <TextView
            android:id="@+id/data_mima"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="我的密碼"
            android:textSize="@dimen/sp_14"
            android:textColor="#666666"
            android:layout_below="@id/xian2"
            android:layout_marginTop="@dimen/dp_10"
            />
        <TextView
            android:id="@+id/data_text_pass"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="倒影"
            android:textSize="@dimen/sp_12"
            android:textColor="#999999"
            android:layout_alignParentRight="true"
            android:layout_alignBottom="@id/data_mima"
            android:password="true"
            android:layout_marginBottom="@dimen/dp_1"
            />
 
        <View
            android:id="@+id/xian3"
            android:layout_width="match_parent"
            android:layout_height="@dimen/dp_1"
            android:background="#f2f2f2"
            android:layout_below="@id/data_mima"
            android:layout_marginTop="@dimen/dp_10"
            />
    </RelativeLayout>
</android.support.constraint.ConstraintLayout>

2.Popwindow彈框

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/dp_10"
    android:orientation="vertical">
    <Button
        android:id="@+id/takePhoto"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:background="#FFFFFF"
        android:gravity="center"
        android:text="拍照"
        android:textColor="@color/color_text"
        android:textSize="@dimen/text_size"/>
 
    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_1"
        android:background="#9e9e9e"/>
 
    <Button
        android:id="@+id/choosePhoto"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:background="#FFFFFF"
        android:gravity="center"
        android:text="從相冊中選擇"
        android:textColor="@color/color_text"
        android:textSize="@dimen/text_size"/>
    <Button
        android:id="@+id/cancle_login"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:background="#FFFFFF"
        android:gravity="center"
        android:text="退出登錄"
        android:textColor="@color/color_text"
        android:textSize="@dimen/text_size"/>
    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_45"
        android:layout_marginTop="@dimen/dp_8"
        android:background="#FFFFFF"
        android:gravity="center"
        android:text="取消"
        android:textColor="@color/color_text"
        android:textSize="@dimen/text_size"/>
</LinearLayout>

五、主頁面

public class MineFragment extends Fragment implements View.OnClickListener,IShowView<ImageBean> {
 
    @BindView(R.id.zi)
    TextView zi;
    @BindView(R.id.data_touxiang)
    TextView dataTouxiang;
    @BindView(R.id.data_image_header)
    SimpleDraweeView dataImageHeader;
    @BindView(R.id.xian1)
    View xian1;
    @BindView(R.id.data_nicheng)
    TextView dataNicheng;
    @BindView(R.id.data_text_name)
    TextView dataTextName;
    @BindView(R.id.xian2)
    View xian2;
    @BindView(R.id.data_mima)
    TextView dataMima;
    @BindView(R.id.data_text_pass)
    TextView dataTextPass;
    @BindView(R.id.xian3)
    View xian3;
    @BindView(R.id.dat_rela)
    RelativeLayout datRela;
    private View view;
    private Unbinder bind;
    private Dialog dialog;
    private File file;
    private static final int PHOTO_REQUEST_CAREMA=1;//拍照
    private static final int PHOTO_REQUEST_GALLERY=2;//從相冊中選擇
    private static final int PHOTO_REQUEST_CUT=3;//裁剪之後
    private static final String PHOTO_FILE_MAME="header_image.jpg";//臨時文件名
    private String path=Environment.getExternalStorageDirectory()+"/header_image.png";
    private HeaderPresenter headerPresenter;
 
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.mine, null);
        bind = ButterKnife.bind(this, view);
        initView();
        return view;
    }
 
    private void initView() {
        dataImageHeader.setOnClickListener(this);
        headerPresenter = new HeaderPresenter();
        headerPresenter.setView(this);
        dataImageHeader.setImageURI(Uri.parse("res://com.onenice.www/" + R.mipmap.touxiang_wdf));
    }
 
    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id){
            case R.id.data_image_header:
                show();
                break;
            case R.id.takePhoto:
                //打開相機
                Intent intent_takePhoto=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (hasSdcard()){//判斷SD卡是否可用
                    file=new File(Environment.getExternalStorageDirectory(),PHOTO_FILE_MAME);
                    //存放到內存中
                    intent_takePhoto.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path)));
 
                }
                startActivityForResult(intent_takePhoto, PHOTO_REQUEST_CAREMA);
 
                dialog.dismiss();
                break;
            case R.id.choosePhoto:
                Intent intent_choosePhoto=new Intent(Intent.ACTION_PICK);
                intent_choosePhoto.setType("image/*");
                startActivityForResult(intent_choosePhoto,PHOTO_REQUEST_GALLERY);
 
                dialog.dismiss();
                break;
            case R.id.btn_cancel:
                dialog.dismiss();
                break;
            case R.id.cancle_login:
                break;
        }
    }
 
    private void show() {
        dialog = new Dialog(getActivity(), R.style.ActionSheetDialogStyle);
        //填充對話框的佈局
        View inflate = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_layout, null);
        //初始化控件
        inflate.findViewById(R.id.choosePhoto).setOnClickListener(this);
        inflate.findViewById(R.id.takePhoto).setOnClickListener(this);
        inflate.findViewById(R.id.btn_cancel).setOnClickListener(this);
        inflate.findViewById(R.id.cancle_login).setOnClickListener(this);
        //將佈局設置給Dialog
        dialog.setContentView(inflate);
        //獲取當前Activity所在的窗體
        Window dialogWindow = dialog.getWindow();
        if(dialogWindow == null){
            return;
        }
        //設置Dialog從窗體底部彈出
        dialogWindow.setGravity(Gravity.BOTTOM);
        //獲得窗體的屬性
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.y = 20;//設置Dialog距離底部的距離
        //將屬性設置給窗體
        dialogWindow.setAttributes(lp);
        dialog.show();//顯示對話框
    }
 
    //裁剪圖片
    private void crop(Uri uri){
        Intent intent=new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri,"image/*");
        //支持裁剪
        intent.putExtra("CROP",true);
        //裁剪的比例
        intent.putExtra("aspectX",1);
        intent.putExtra("aspectY",1);
        //裁剪後輸出圖片的尺寸大小
        intent.putExtra("outputX",250);
        intent.putExtra("outputY",250);
        //將圖片返回給data
        intent.putExtra("return-data",true);
        startActivityForResult(intent,PHOTO_REQUEST_CUT);
    }
 
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode==PHOTO_REQUEST_CAREMA&&resultCode==getActivity().RESULT_OK){//相機返回的數據
            if (hasSdcard()){
                crop(Uri.fromFile(new File(path)));
            }else{
                Toast.makeText(getActivity(), "未找到存儲啦,無法存儲照片", Toast.LENGTH_SHORT).show();
            }
        }else if (requestCode==PHOTO_REQUEST_GALLERY&&resultCode==getActivity().RESULT_OK){//相冊返回的數據
            //得到圖片的全路徑
            if (data!=null){
                Uri uri = data.getData();
                crop(uri);
            }
        }else if(requestCode==PHOTO_REQUEST_CUT&&resultCode==getActivity().RESULT_OK){//剪切回來的照片數據
            if (data!=null){
                Bitmap bitmap = data.getParcelableExtra("data");
                //將bitmap轉換爲uri
                Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, null,null));
 
                String[] proj = { MediaStore.Images.Media.DATA };
 
                Cursor actualimagecursor = getActivity().managedQuery(uri,proj,null,null,null);
 
                int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
 
                actualimagecursor.moveToFirst();
 
                String img_path = actualimagecursor.getString(actual_image_column_index);
 
                File file = new File(img_path);
 
                //判斷file文件是否存在
                if (file != null && file.exists()){
                    RequestBody requestBody = RequestBody.create(MediaType.parse("image/*"),file.getAbsoluteFile());
                    MultipartBody.Part part = MultipartBody.Part.createFormData("image",file.getName(),requestBody);
 
                    headerPresenter.getheader(part);
                }else {
                    Toast.makeText(getActivity(),"請選擇文件",Toast.LENGTH_SHORT).show();
                }
 
            }
 
        }
 
        super.onActivityResult(requestCode, resultCode, data);
    }
 
    @Override
    public void onSuccess(ImageBean imageBean) {
        Toast.makeText(getActivity(),imageBean.getMessage(),Toast.LENGTH_SHORT).show();
        String headPath = imageBean.getHeadPath();
        dataImageHeader.setImageURI(headPath);
    }
 
    @Override
    public void onFailed(String err) {
 
    }
 
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        bind.unbind();
    }
    //判斷SD卡是否掛載
    public boolean hasSdcard(){
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            return true;
        }else{
            return false;
        }
    }
 
 
}

2.anim_dialog_top_in

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="100%"
    android:toYDelta="0"/>

3.anim_dialog_top_out 

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromYDelta="0"
    android:toYDelta="100%" />

 

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