public interface HttpService {
//上傳文件
@Multipart
@POST
Observable<ResponseBody> uploadPic(@Url String url, @HeaderMap Map<String, String> headMap, @Part MultipartBody.Part part);
}
public class HttpUtils {
private String baseUrl = "http://mobile.bwstudent.com";
//上傳
public HttpUtils updatePic(String url, Map<String,String> headMap, File file){
Retrofit retrofit=new Retrofit.Builder().addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.baseUrl(baseUrl).build();
HttpService httpService = retrofit.create(HttpService.class);
MediaType mediaType=MediaType.parse("multipart/form-data;charset=UTF-8");
RequestBody boby=RequestBody.create(mediaType,file);
//第一個 是服務端定義的參數
//第二個 存儲到sd卡文件的名字
//第一個 requestBody對象
MultipartBody.Part part=MultipartBody.Part.createFormData("image",file.getName(),boby);
Observable<ResponseBody> observable = httpService.uploadPic(url, headMap, part);
observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
try {
setCallBack.success(responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
setCallBack.fail(e.getMessage());
}
@Override
public void onComplete() {
}
});
return this;
}
public void result(SetCallBack setCallBack){
this.setCallBack=setCallBack;
}
SetCallBack setCallBack;
public interface SetCallBack{
void success(String data);
void fail(String error);
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button xj;
private Button xc;
private ImageView ImageView1;
private ImageView image;
private Button xiangji,xiangce;
private String url="/small/user/verify/v1/modifyHeadPic";
private String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/img.png";
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView1 = findViewById(R.id.ImageView1);
xj =findViewById(R.id.xj);
xc =findViewById(R.id.xc);
xj.setOnClickListener(this);
xc.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.xj:
Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(path)));
startActivityForResult(intent,100);
break;
case R.id.xc:
Intent intent1=new Intent(Intent.ACTION_PICK);
intent1.setType("image/*");
startActivityForResult(intent1,99);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//相機
if (requestCode==100){
File file = new File(path);
Bitmap bitmap = BitmapFactory.decodeFile(path);
ImageView1.setImageBitmap(bitmap);
//設置上傳進度條
upload(path);
upLoad(file);
}else if (requestCode==99){
Uri data1 = data.getData();
String[] pojo={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(data1, pojo, null, null, null);
if (cursor!=null){
int columnIndexOrThrow = cursor.getColumnIndexOrThrow(pojo[0]);
cursor.moveToFirst();
String picPath = cursor.getString(columnIndexOrThrow);
cursor.close();
File file = new File(picPath);
ImageView1.setImageURI(data1);
//設置上傳進度條
upload(picPath);
upLoad(file);
}
}
}
//上傳頭像
private void upLoad(File file) {
Map<String,String> headMap=new HashMap<>();
headMap.put("userId","1198");
headMap.put("sessionId","15607612684541198");
new HttpUtils().updatePic(url,headMap,file).result(new HttpUtils.SetCallBack() {
@Override
public void success(String data) {
Toast.makeText(MainActivity.this,data,Toast.LENGTH_SHORT).show();
Log.d("aaa",data);
//隱藏進度條
pd.hide();
}
@Override
public void fail(String error) {
Toast.makeText(MainActivity.this,error,Toast.LENGTH_SHORT).show();
Log.d("aaa",error);
}
});
}
//上傳圖片
private void upload(String picPath) {
pd = new ProgressDialog(this);
pd.setMessage("正在上傳");
pd.setCancelable(false);
pd.show();
}
}
<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" />
`
implementation ‘com.squareup.retrofit2:adapter-rxjava2:2.4.0’
implementation ‘io.reactivex.rxjava2:rxandroid:2.1.0’
implementation ‘com.squareup.okhttp3:okhttp:3.10.0’
implementation ‘com.google.code.gson:gson:2.8.5’