compile 'io.reactivex.rxjava2:rxjava:2.0.1' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.squareup.retrofit2:retrofit:2.4.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
<uses-permission android:name="android.permission.INTERNET">uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE">uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">uses-permission> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">uses-permission>
布局就一个按钮
service///
package com.example.uploaderpicture; import java.io.File; import io.reactivex.Flowable; import okhttp3.MultipartBody; import okhttp3.RequestBody; import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Multipart; import retrofit2.http.POST; import retrofit2.http.Part; import retrofit2.http.Path; import retrofit2.http.Query; public interface ApiService { //http://120.27.23.105/file/upload?uid=""& @Multipart @POST("file/upload") Flowableupload(@Query("uid") String description, @Part MultipartBody.Part file); }
bean可以改/
package com.example.uploaderpicture; public class Bean { /** * msg : 天呢!文件不能为空 * code : 1 */ private String msg; private String code; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
Retrifit工具/
package com.example.uploaderpicture; import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class RetrofitUtils { private static volatile RetrofitUtils instance; public static RetrofitUtils getInstance(){ if(instance==null){ synchronized (RetrofitUtils.class){ if(instance==null){ instance=new RetrofitUtils(); } } } return instance; } public Retrofit getNews(){ // http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/1 String baseurl="http://120.27.23.105/"; //日志拦截器 HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor(); interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient okHttpClient=new OkHttpClient.Builder() .addInterceptor(interceptor) .build(); Retrofit retrofit=new Retrofit.Builder() .baseUrl(baseurl) .client(okHttpClient) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); return retrofit; } }
mainactivity//
package com.example.uploaderpicture; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import io.reactivex.subscribers.DisposableSubscriber; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; public class MainActivity extends AppCompatActivity { private RetrofitUtils retrofitUtils; private Button upload; private MultipartBody.Part filepath; private File f1; private String gg; LoadingDialog dialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); upload = findViewById(R.id.upload); //bitmap对象 Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.csgo); //retrofit retrofitUtils = new RetrofitUtils(); //拿到根路径 File df=Environment.getExternalStorageDirectory(); //创建文件路径 加上自己定义的 final String path=df.getPath()+"/yikezhong"; //调用方法创建这个路径 返回一个string的路径 gg = makedir(path); //把他转成file类型 必须指定文件名 f1 = new File(gg +"/head.jpg"); //调用方法传入bitmap 和 file 它来把图片存进去 saveBitmapTofile(bitmap, f1); //将file转成 MultipartBody 用于上传 filepath = MultipartBody.Part.createFormData("file",f1.getName(), RequestBody.create(MediaType.parse("multipart/from-data"), f1)); upload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { uploadFile(); Toast.makeText(MainActivity.this,f1.toString(),Toast.LENGTH_LONG).show(); } }); } private void uploadFile(){ //创建dialog dialog=new LoadingDialog(MainActivity.this); dialog.setCanceledOnTouchOutside(false); dialog.show(); retrofitUtils=RetrofitUtils.getInstance(); retrofitUtils.getNews() .create(ApiService.class) .upload("3406",filepath) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new DisposableSubscriber() { @Override public void onNext(Bean bean) { Log.d("rrr",bean.getMsg().toString()); Toast.makeText(MainActivity.this,bean.getMsg().toString(),Toast.LENGTH_LONG).show(); //dialog消失 dialog.dismiss(); } @Override public void onError(Throwable t) { Log.d("kkk",t.getMessage()); Toast.makeText(MainActivity.this,t.getMessage(),Toast.LENGTH_LONG).show(); dialog.dismiss(); } @Override public void onComplete() { Log.d("yyy","onComplete"); Toast.makeText(MainActivity.this,"onComplete",Toast.LENGTH_LONG).show(); } }); } // public static String getSDPath() { File sdDir = null; boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);// 判断sd卡是否存在 if (sdCardExist) { sdDir = Environment.getExternalStorageDirectory();// 获取跟目录 } return sdDir.toString(); } //这个也是创建文件夹的方法 public static String mkdirs(String path) { String sdcard = getSDPath(); if (path.indexOf(getSDPath()) == -1) { path = sdcard + (path.indexOf("/") == 0 ? "" : "/") + path; } File destDir = new File(path); if (!destDir.exists()) { path = makedir(path); if (path == null) { return null; } } return path; } //根据地址创建文件夹 private static String makedir(String path) { String sdPath = getSDPath(); String[] dirs = path.replace(sdPath, "").split("/"); StringBuffer filePath = new StringBuffer(sdPath); for (String dir : dirs) { if (!"".equals(dir) && !dir.equals(sdPath)) { filePath.append("/").append(dir); File destDir = new File(filePath.toString()); if (!destDir.exists()) { boolean b = destDir.mkdirs(); if (!b) { return null; } } } } return filePath.toString(); } //存储图片 private void saveBitmapTofile(Bitmap bmp,File fg) { try { FileOutputStream out = null; out = new FileOutputStream(fg); bmp.compress(Bitmap.CompressFormat.JPEG,100,out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } }
values->loadingDialogStyle///
xml version="1.0" encoding="utf-8"?> <resources> <style name="loadingDialogStyle" parent="android:Theme.Dialog"> <item name="android:windowBackground">@android:color/transparentitem> <item name="android:windowFrame">@nullitem> <item name="android:windowNoTitle">trueitem> <item name="android:windowIsFloating">trueitem> <item name="android:windowIsTranslucent">trueitem> <item name="android:windowContentOverlay">@nullitem> <item name="android:windowAnimationStyle">@android:style/Animation.Dialogitem> <item name="android:backgroundDimEnabled">falseitem> <item name="android:backgroundDimAmount">0.6item> style> resources>
yuanjiao///
xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#86222222" /> <corners android:bottomLeftRadius="10dp" android:bottomRightRadius="10dp" android:topLeftRadius="10dp" android:topRightRadius="10dp" /> shape>
LoadingDialog///
package com.example.uploaderpicture; import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class LoadingDialog extends Dialog { private TextView tv; /** * style很关键 */ public LoadingDialog(Context context) { super(context, R.style.loadingDialogStyle); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_loading); tv = (TextView) findViewById(R.id.tv); tv.setText("正在上传....."); LinearLayout linearLayout = (LinearLayout) this.findViewById(R.id.LinearLayout); linearLayout.getBackground().setAlpha(210); } }
dialog_loading///
xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/transparent" android:orientation="vertical" > <LinearLayout android:id="@+id/LinearLayout" android:layout_width="160dp" android:layout_height="160dp" android:background="@drawable/yuanjiao" android:gravity="center" android:orientation="vertical"> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleInverse" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@android:color/transparent" /> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingTop="10dp" android:textColor="#fff" /> LinearLayout> LinearLayout>