指定路径存入bitmap 并且上传头像

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")
 Flowable<Bean> upload(@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<Bean>() {
                    @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();
        }
    }




}


 dialog 以下/

values->loadingDialogStyle///
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="loadingDialogStyle" parent="android:Theme.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item><!--设置dialog的背景-->
        <item name="android:windowFrame">@null</item><!--DialogwindowFrame框为无-->
        <item name="android:windowNoTitle">true</item><!--是否显示title-->
        <item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
        <item name="android:windowIsTranslucent">true</item><!--是否半透明-->
        <item name="android:windowContentOverlay">@null</item><!--是否半透明-->
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item><!-- 对话框是否有遮盖 -->
        <item name="android:backgroundDimEnabled">false</item><!--背景是否模糊显示-->
        <item name="android:backgroundDimAmount">0.6</item><!--背景的灰度-->
    </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>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值