电商图片上传

本文主要探讨电商领域中图片上传的实现过程,包括使用的网络工具类、参数拼接方法以及在Activity中的应用。

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".view.activity.MainActivity">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/image_simple"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:src="@mipmap/ic_launcher" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button_photo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="相机" />

        <Button
            android:id="@+id/button_xc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="相册" />

    </LinearLayout>

</LinearLayout>

网络工具类

package luwenjie0428.bw.com.luwenjie0502.model.util;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * @author:
 * @ProjectName: Luwenjie0502
 * @Package: luwenjie0428.bw.com.luwenjie0502.model.util
 * @ClassName: HttpUtil
 * @CreateDate: 2019/5/6 8:45
 * @UpdateDate: 2019/5/6 8:45
 */
public class HttpUtil {

    public final RetrofitResponse response;

    private HttpUtil() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(50, TimeUnit.SECONDS)
                .readTimeout(50, TimeUnit.SECONDS)
                .addInterceptor(new getInterceptor())
                .build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://172.17.8.100/small/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .build();
        response = retrofit.create(RetrofitResponse.class);
    }

    public static HttpUtil getInstance() {
        return getHttpUtilInstance.httpUtil;
    }

    private static class getHttpUtilInstance {
        private static HttpUtil httpUtil = new HttpUtil();
    }

    private static class getInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            Request builder = request.newBuilder()
                    .addHeader("userId", "1026")
                    .addHeader("sessionId", "15571044946071026")
                    .build();
            return chain.proceed(builder);
        }
    }

}

拼参

@Multipart
    @POST("user/verify/v1/modifyHeadPic")
    Observable<ImageBean> getImageData(@Part MultipartBody.Part part);

Activity

package luwenjie0428.bw.com.luwenjie0502.view.activity;

import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.facebook.drawee.view.SimpleDraweeView;

import java.io.File;

import luwenjie0428.bw.com.luwenjie0502.R;
import luwenjie0428.bw.com.luwenjie0502.model.bean.ImageBean;
import luwenjie0428.bw.com.luwenjie0502.presenter.MainPresenter;
import luwenjie0428.bw.com.luwenjie0502.view.interfaces.MainView;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;

public class MainActivity extends BaseActivity implements MainView<ImageBean> {

    private Button button_photo;
    private Button button_xc;
    private SimpleDraweeView image_simple;
    private MainPresenter mainPresenter;
    private File file;
    private static final String PHOTO_FILE_MAME = "header_image.jpg";//临时文件名
    private String path = Environment.getExternalStorageDirectory() + "/header_image.png";

    @Override
    protected int bindlayout() {
        return R.layout.activity_main;
    }

    @Override
    protected void initView() {
        button_photo = findViewById(R.id.button_photo);
        button_xc = findViewById(R.id.button_xc);
        image_simple = findViewById(R.id.image_simple);
    }

    @Override
    protected void initData() {
        mainPresenter = new MainPresenter();
        mainPresenter.setView(this);
    }

    @Override
    protected void bindEvent() {
        button_photo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //打开相机
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                if (hasSdcard()) {//判断SD卡是否可用
                    file = new File(Environment.getExternalStorageDirectory(), PHOTO_FILE_MAME);
                    //存放到内存中
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path)));

                }
                startActivityForResult(intent, 1);
            }
        });
        button_xc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                startActivityForResult(intent, 2);
            }
        });
    }

    //裁剪图片
    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, 3);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 1 && resultCode == RESULT_OK) {//相机返回的数据
            if (hasSdcard()) {
                crop(Uri.fromFile(new File(path)));
            } else {
                Toast.makeText(MainActivity.this, "未找到存储啦,无法存储照片", Toast.LENGTH_SHORT).show();
            }
        } else if (requestCode == 2 && resultCode == RESULT_OK) {//相册返回的数据
            //得到图片的全路径
            if (data != null) {
                Uri uri = data.getData();
                crop(uri);
            }
        } else if (requestCode == 3 && resultCode == RESULT_OK) {//剪切回来的照片数据
            if (data != null) {
                Bitmap bitmap = data.getParcelableExtra("data");
                //将bitmap转换为uri
                Uri uri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null, null));

                String[] proj = {MediaStore.Images.Media.DATA};

                Cursor actualimagecursor = 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);

                    mainPresenter.getImageBean(part);
                } else {
                    Toast.makeText(MainActivity.this, "请选择文件", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

    //判断SD卡是否挂载
    public boolean hasSdcard() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            return true;
        } else {
            return false;
        }
    }


    @Override
    public void onSuccess(ImageBean imageBean) {
        if (imageBean.getStatus().equals("0000")) {
            Toast.makeText(MainActivity.this, imageBean.getMessage(), Toast.LENGTH_SHORT).show();
            String headPath = imageBean.getHeadPath();
            image_simple.setImageURI(headPath);
        }

    }

    @Override
    public void onErr(String err) {

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值