okhttp 调用相机 上传服务器

MainActivity

package com.bwie.lianxi1;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.view.ActionMode;
import android.view.View;

import okhttp3.Cache;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLDecoder;
import java.util.concurrent.TimeUnit;
import okhttp3.CacheControl;
import okhttp3.Callback;
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toPhoto();
            }
        });
        findViewById(R.id.bt2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                toCamera();
            }
        });
        cache();
    }
    public void synchronousMethod(){
     new Thread(new Runnable() {
            @Override
          public void run() {
                  try {
                            OkHttpClient client = new OkHttpClient();
                      Request request = new Request.Builder().url("https://publicobject.com/helloworld.txt").build();

                          Call call =  client.newCall(request);
                         //同步
                           Response response =  call.execute() ;
                               if(response.isSuccessful()){
                                     ResponseBody body =  response.body() ;
                                         String result =  body.string() ;
                                    System.out.println("result = " + result);
                  }


                } catch (IOException e) {
                   e.printStackTrace();
                   }

                   }
        }).start();

            }
    public void asynchronousGet(){
          // http://www.baidu.com/aaaa/
          // http://www.baidu1.com/aaaa/
           // http://www.baidu.com/aaaa/


           // http://www.baidu2.com/aaaa/
      try {
                  OkHttpClient client = new OkHttpClient();


                     Request request = new Request.Builder()
                      .url("http://publicobject.com/helloworld.txt")
                     .header("key","value")
                       .header("key","value1")
                          .addHeader("Connection","Keep-Alive")
                            .addHeader("Connection","Keep-Alive1")
                            .build();
                Call call =  client.newCall(request);


                         call.enqueue(new Callback() {
               @Override
             public void onFailure(Call call, IOException e) {
                      }
             @Override
           public void onResponse(Call call, Response response) throws IOException {




                         String result =   response.body().string() ;
                        System.out.println("result = " + result);


                         }
            });
        } catch (Exception e) {
               e.printStackTrace();
            }
    }
    public static final MediaType MEDIA_TYPE_MARKDOWN=MediaType.parse("text/x-markdown; charset=utf-8");
    public void postString(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    File file = new File("本地图片路径");
                    OkHttpClient client=new OkHttpClient();
                    Request request=new Request.Builder().url("https://api.github.com/markdown/raw")
                            .post(RequestBody.create(MEDIA_TYPE_MARKDOWN,file)).build();
                    Response response = client.newCall(request).execute();
                    if(response.isSuccessful()){
                        String result =   response.body().string() ;
                      System.out.println("result = " + result);

                                         }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    public void postFile(File file){

               //  sdcard/dliao/aaa.jpg
              String path =  file.getAbsolutePath() ;
               String [] split =  path.split("\/");
               MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
             OkHttpClient client = new OkHttpClient();
                RequestBody requestBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
        //                file
                        .addFormDataPart("imageFileName",split[split.length-1])
                       .addFormDataPart("image",split[split.length-1],RequestBody.create(MEDIA_TYPE_PNG,file))
                      .build();

              Request request = new Request.Builder().post(requestBody).url("http://qhb.2dyt.com/Bwei/upload").build();

              client.newCall(request).enqueue(new Callback() {
            @Override
           public void onFailure(Call call, IOException e) {

                           }

                   @Override
          public void onResponse(Call call, Response response) throws IOException {

                                System.out.println("response = " + response.body().string());

                     }
         });


           }

    static final int INTENTFORCAMERA = 1 ;
    static final int INTENTFORPHOTO = 2 ;
          public String LocalPhotoName;
     public String createLocalPhotoName() {
             LocalPhotoName = System.currentTimeMillis() + "face.jpg";
             return  LocalPhotoName ;
            }
    public void toCamera(){
             try {
                   Intent intentNow = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                 Uri uri = null ;
           //            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //针对Android7.0,需要通过FileProvider封装过的路径,提供给外部调用
           //                uri = FileProvider.getUriForFile(UploadPhotoActivity.this, "com.bw.dliao", SDCardUtils.getMyFaceFile(createLocalPhotoName()));//通过FileProvider创建一个content类型的Uri,进行封装
         //            }else {
                 uri = Uri.fromFile(SDCardUtils.getMyFaceFile(createLocalPhotoName())) ;
           //      }
                 intentNow.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                 startActivityForResult(intentNow, INTENTFORCAMERA);
              } catch (Exception e) {
                 e.printStackTrace();
             }
           }

    /**
     360      * 打开相册
     361      */
     public void toPhoto() {
         try {
             createLocalPhotoName();
             Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
             getAlbum.setType("image/*");
             startActivityForResult(getAlbum, INTENTFORPHOTO);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
         @Override
             protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                      super.onActivityResult(requestCode, resultCode, data);


                    switch (requestCode) {
                          case INTENTFORPHOTO:
                                    //相册
                                   try {
                                             // 必须这样处理,不然在4.4.2手机上会出问题
                                             Uri originalUri = data.getData();
                                             File f = null;
                                            if (originalUri != null) {
                                                   f = new File(SDCardUtils.photoCacheDir, LocalPhotoName);
                                                      String[] proj = {MediaStore.Images.Media.DATA};
                                                     Cursor actualimagecursor =  this.getContentResolver().query(originalUri, proj, null, null, null);
                                                   if (null == actualimagecursor) {
                                                         if (originalUri.toString().startsWith("file:")) {
                                                                  File file = new File(originalUri.toString().substring(7, originalUri.toString().length()));
                                                                   if(!file.exists()){
                                                                         //地址包含中文编码的地址做utf-8编码
                                                                           originalUri = Uri.parse(URLDecoder.decode(originalUri.toString(),"UTF-8"));
                                                                           file = new File(originalUri.toString().substring(7, originalUri.toString().length()));
                                                                  }
                                                                  FileInputStream inputStream = new FileInputStream(file);
                                                                    FileOutputStream outputStream = new FileOutputStream(f);
                                                                    copyStream(inputStream, outputStream);
                                                              }
                                                       } else {
                                                            // 系统图库
                                                          int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                                                           actualimagecursor.moveToFirst();
                                                          String img_path = actualimagecursor.getString(actual_image_column_index);
                                                            if (img_path == null) {
                                                                   InputStream inputStream = this.getContentResolver().openInputStream(originalUri);
                                                                   FileOutputStream outputStream = new FileOutputStream(f);
                                                                   copyStream(inputStream, outputStream);
                                                             } else {
                                                                   File file = new File(img_path);
                                                                  FileInputStream inputStream = new FileInputStream(file);
                                                                FileOutputStream outputStream = new FileOutputStream(f);
                                                                   copyStream(inputStream, outputStream);
                                                               }
                                                   }
                                                    Bitmap bitmap = ImageResizeUtils.resizeImage(f.getAbsolutePath(), 1080);
                                                    int width = bitmap.getWidth();
                                                    int height = bitmap.getHeight();
                                                 FileOutputStream fos = new FileOutputStream(f.getAbsolutePath());
                                                   if (bitmap != null) {


                                                             if (bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos)) {
                                                                  fos.close();
                                                                   fos.flush();
                                                             }
                                                            if (!bitmap.isRecycled()) {
                                                                    bitmap.isRecycled();
                                                                }


                                                              System.out.println("f = " + f.length());
                                                            postFile(f);


                                                        }

                                                }
                                        } catch (Exception e) {
                                         e.printStackTrace();


                                      }

                                  break;
                          case INTENTFORCAMERA:
                      //                相机
                                   try {
                                            //file 就是拍照完 得到的原始照片
                                             File file = new File(SDCardUtils.photoCacheDir, LocalPhotoName);
                                            Bitmap bitmap = ImageResizeUtils.resizeImage(file.getAbsolutePath(), 1080);
                                             int width = bitmap.getWidth();
                                            int height = bitmap.getHeight();
                                             FileOutputStream fos = new FileOutputStream(file.getAbsolutePath());
                                             if (bitmap != null) {
                                                    if (bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos)) {
                                                          fos.close();
                                                         fos.flush();
                                                    }
                                                   if (!bitmap.isRecycled()) {
                                                         //通知系统 回收bitmap
                                                         bitmap.isRecycled();
                                                    }
                                               System.out.println("f = " + file.length());


                                                postFile(file);
                                              }
                                      } catch (Exception e) {
                                         e.printStackTrace();
                                     }


                                    break;
                        }


               }
    public static void copyStream(InputStream inputStream, OutputStream outStream) throws Exception {
                try {
                        byte[] buffer = new byte[1024];
                       int len = 0;
                    while ((len = inputStream.read(buffer)) != -1) {
                              outStream.write(buffer, 0, len);
                          }
                        outStream.flush();
                    } catch (IOException e) {
                       e.printStackTrace();
                    }finally {
                     if(inputStream != null){
                              inputStream.close();
                          }
                     if(outStream != null){
                            outStream.close();
                       }
                 }

          }

            public void post(){

            OkHttpClient client = new OkHttpClient();

               RequestBody requestBody = new FormBody.Builder()
                     .add("username","1507D")
                       .add("password","1507D")
                     .add("postkey","1503")
                      .build();

                Request request = new Request.Builder().url("http://qhb.2dyt.com/Bwei/login")
                       .post(requestBody).build();

               client.newCall(request).enqueue(new Callback() {
            @Override
           public void onFailure(Call call, IOException e) {


                         }

                 @Override
             public void onResponse(Call call, Response response) throws IOException {
                  System.out.println("response = " + response.body().string());
                          }
         });

           }

           public void cache(){


             new Thread(new Runnable() {
            @Override
          public void run() {
                          try {
                                        int cacheSize = 10 * 1024 * 1024; // 10 MiB
                                        Cache cache = new Cache(getCacheDir(), cacheSize);
                                         OkHttpClient client = new OkHttpClient.Builder()
                                                .addInterceptor(new LoggingInterceptor())
                                                 .cache(cache)
                                                 .build();
                                        Request request = new Request.Builder()
                                                .cacheControl(CacheControl.FORCE_NETWORK)
                                                .url("http://publicobject.com/helloworld.txt")
                                                .build();
                                        String response1Body;
                                        Response response1 = client.newCall(request).execute();
                     //        () {
                                         if (!response1.isSuccessful()) throw new IOException("Unexpected code " + response1);
                                         response1Body = response1.body().string();
                                         System.out.println("Response 1 response:          " + response1);
                                        System.out.println("Response 1 cache response:    " + response1.cacheResponse());
                                        System.out.println("Response 1 network response:  " + response1.networkResponse());
                     //        }
                                        String response2Body;
                     //
                     // {
                     //                    Response response2 = client.newCall(request).execute();
                     //
                     //
                     ////                   Call call1 =   client.newCall(request);
                     ////
                     ////                    call1.cancel();
                     //
                     //                    if (!response2.isSuccessful()) throw new IOException("Unexpected code " + response2);
                     //
                     //                    response2Body = response2.body().string();
                     //                    System.out.println("Response 2 response:          " + response2);
                     //                    System.out.println("Response 2 cache response:    " + response2.cacheResponse());
                     //                    System.out.println("Response 2 network response:  " + response2.networkResponse());
                     //
                     //
                     //                    System.out.println("Response 2 equals Response 1? " + response1Body.equals(response2Body));
                     //
                              }catch (Exception e) {
                                }
                      }
    }).start();
           }
         //
           public void percall(){
              OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).build();
                OkHttpClient client1 = client.newBuilder().connectTimeout(10, TimeUnit.SECONDS).build();
               OkHttpClient client2 = client.newBuilder().connectTimeout(100, TimeUnit.SECONDS).build();
        //        client.newCall()
            }
       }
LoggingInterceptor
package com.bwie.lianxi1;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;

class LoggingInterceptor implements Interceptor {
  @Override public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();

    long t1 = System.currentTimeMillis();


    Response response = chain.proceed(request);

    long t2 = System.currentTimeMillis();

    System.out.println("t2 = " +( t2-t1));


    return response;
  }
}
ImageResizeUtils
package com.bwie.lianxi1;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import static android.graphics.BitmapFactory.decodeFile;

/**
* Created by muhanxi on 17/7/6.
*/

public class ImageResizeUtils {


/**
* 照片路径
* 压缩后 宽度的尺寸
* @param path
* @param specifiedWidth
*/
public static Bitmap resizeImage(String path, int specifiedWidth) throws Exception {


Bitmap bitmap = null;
FileInputStream inStream = null;
File f = new File(path);
System.out.println(path);
if (!f.exists()) {
throw new FileNotFoundException();
}
try {
inStream = new FileInputStream(f);
int degree = readPictureDegree(path);
BitmapFactory.Options opt = new BitmapFactory.Options();
//照片不加载到内存 只能读取照片边框信息
opt.inJustDecodeBounds = true;
// 获取这个图片的宽和高
decodeFile(path, opt); // 此时返回bm为空



int inSampleSize = 1;
final int width = opt.outWidth;
// width 照片的原始宽度 specifiedWidth 需要压缩的宽度
// 1000 980
if (width > specifiedWidth) {
inSampleSize = (int) (width / (float) specifiedWidth);
}
// 按照 565 来采样 一个像素占用2个字节
opt.inPreferredConfig = Bitmap.Config.RGB_565;
// 图片加载到内存
opt.inJustDecodeBounds = false;
// 等比采样
opt.inSampleSize = inSampleSize;
// opt.inPurgeable = true;
// 容易导致内存溢出
bitmap = BitmapFactory.decodeStream(inStream, null, opt);
// bitmap = BitmapFactory.decodeFile(path, opt);
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
inStream = null;
}
}

if (bitmap == null) {
return null;
}
Matrix m = new Matrix();
if (degree != 0) {
//给Matrix 设置旋转的角度
m.setRotate(degree);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
}
float scaleValue = (float) specifiedWidth / bitmap.getWidth();
// 等比压缩
m.setScale(scaleValue, scaleValue);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true);
return bitmap;
} catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}


}


/**
* 读取图片属性:旋转的角度
*
* @param path 源信息
* 图片绝对路径
* @return degree旋转的角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}


public static void copyStream(InputStream inputStream, OutputStream outStream) throws Exception {
try {
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
outStream.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(inputStream != null){
inputStream.close();
}
if(outStream != null){
outStream.close();
}
}

}



}
SDCardUtils
package com.bwie.lianxi1;

import android.os.Environment;
import android.os.StatFs;

import java.io.File;
import java.io.IOException;


public class SDCardUtils {


    public static final String DLIAO = "dliao" ;

    public static File photoCacheDir = SDCardUtils.createCacheDir(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + DLIAO);
    public static String cacheFileName = "myphototemp.jpg";



    public static boolean isSDCardExist() {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            return true;
        } else {
            return false;
        }
    }

    public static void delFolder(String folderPath) {
        try {
            delAllFile(folderPath);
            String filePath = folderPath;
            filePath = filePath.toString();
            File myFilePath = new File(filePath);
            myFilePath.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static boolean delAllFile(String path) {
        boolean flag = false;
        File file = new File(path);
        if (!file.exists()) {
            return flag;
        }
        if (!file.isDirectory()) {
            return flag;
        }
        String[] tempList = file.list();
        File temp = null;
        for (int i = 0; i < tempList.length; i++) {
            if (path.endsWith(File.separator)) {
                temp = new File(path + tempList[i]);
            } else {
                temp = new File(path + File.separator + tempList[i]);
            }
            if (temp.isFile()) {
                temp.delete();
            }
            if (temp.isDirectory()) {
                delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
                delFolder(path + "/" + tempList[i]);// 再删除空文件夹
                flag = true;
            }
        }
        return flag;
    }

    public static boolean deleteOldAllFile(final String path) {
        try {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    delAllFile(Environment.getExternalStorageDirectory() + File.separator + DLIAO);
                }
            }).start();

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 给定字符串获取文件夹
     * 
     * @param dirPath
     * @return 创建的文件夹的完整路径
     */
    public static File createCacheDir(String dirPath) {
        File dir = new File(dirPath);;
        if(isSDCardExist()){
            if (!dir.exists()) {
                dir.mkdirs();
            }
        }
        return dir;
    }

    public static File createNewFile(File dir, String fileName) {
        File f = new File(dir, fileName);
        try {
            // 出现过目录不存在的情况,重新创建
            if (!dir.exists()) {
                dir.mkdirs();
            }
            f.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return f;
    }

    public static File getCacheFile() {
        return createNewFile(photoCacheDir, cacheFileName);
    }

    public static File getMyFaceFile(String fileName) {
        return createNewFile(photoCacheDir, fileName);
    }

    /**
     * 获取SDCARD剩余存储空间
     *
     * @return 0 sd已被挂载占用  1 sd卡内存不足 2 sd可用
     */
    public static int getAvailableExternalStorageSize() {
        if (isSDCardExist()) {
            File path = Environment.getExternalStorageDirectory();
            StatFs stat = new StatFs(path.getPath());
            long blockSize = stat.getBlockSize();
            long availableBlocks = stat.getAvailableBlocks();
            long memorySize = availableBlocks * blockSize;
            if(memorySize < 10*1024*1024){
                return 1;
            }else{
                return 2;
            }
        } else {
            return 0;
        }
    }
}

权限

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

原文地址:https://www.cnblogs.com/shangliang88/p/7607381.html