MainActivityjava
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; } } }
權限android
<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" />