糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > Android中使用封装的OKHttp上传图片 从相机和相册中获取图片并剪切

Android中使用封装的OKHttp上传图片 从相机和相册中获取图片并剪切

时间:2019-10-13 19:10:45

相关推荐

Android中使用封装的OKHttp上传图片 从相机和相册中获取图片并剪切

Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切

效果:注意:1:网络权限<uses-permissionandroid:name="android.permission.INTERNET"></uses-permission>2:我封装了一个OKHttp,需要在build.gradle 中加入compile'com.squareup.okhttp3:logging-interceptor:3.4.2' 在同步一在3:用SharedPreferences 保存和获取图片了,将图片和字符串进行了转换4: 可以调用相机和相册获取图片,并进行剪切//-----------------我的布局文件-----------------------------<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="/apk/res/android" xmlns:tools="/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context=".tackpicture2.MainActivity"> <ImageView android:layout_width="200dp" android:layout_height="200dp" android:scaleType="fitXY" android:src="@mipmap/ic_launcher" android:id="@+id/iv_img"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="相机" android:id="@+id/bt_camera"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="相册" android:id="@+id/bt_xiangce"/> </LinearLayout> //-------------我的MainActivity -------------------------package.tackpicture2;importandroid.content.Context;importandroid.content.Intent;importandroid.content.SharedPreferences;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.provider.MediaStore;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Base64;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.Toast;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importokhttp3.Request;public classMainActivityextendsAppCompatActivityimplementsView.OnClickListener {privateImageViewiv_img;privateButtonbt_camera;privateButtonbt_xiangce;private static final intPHOTO_REQUEST_CAREMA= 1;// 拍照private static final intPHOTO_REQUEST_GALLERY= 2;// 从相册中选择private static final intPHOTO_REQUEST_CUT= 3;// 结果 /* 头像名称 */private static finalStringPHOTO_FILE_NAME="temp_photo.jpg";privateFiletempFile; @Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); }private voidinitView() {iv_img= (ImageView) findViewById(R.id.iv_img);bt_camera= (Button) findViewById(R.id.bt_camera);bt_xiangce= (Button) findViewById(R.id.bt_xiangce);//从SharedPreferences获取图片getBitmapFromSharedPreferences();bt_camera.setOnClickListener(this);bt_xiangce.setOnClickListener(this); } @Overridepublic voidonClick(View v) {switch(v.getId()) {caseR.id.bt_camera:// 激活相机Intent intent =newIntent("android.media.action.IMAGE_CAPTURE");// 判断存储卡是否可以用,可用进行存储if(hasSdcard()) {tempFile=newFile(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME); // 从文件中创建uriUri uri = Uri.fromFile(tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMAstartActivityForResult(intent,PHOTO_REQUEST_CAREMA);break;caseR.id.bt_xiangce:// 激活系统图库,选择一张图片Intent intent1 =newIntent(Intent.ACTION_PICK);intent1.setType("image/*");// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERYstartActivityForResult(intent1,PHOTO_REQUEST_GALLERY);break; } } /** 判断sdcard是否被挂载*/private booleanhasSdcard() {//判断SD卡手否是安装好的media_mountedif(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {return true; }else{return false; } } /* * 剪切图片 */private voidcrop(Uri uri) {// 裁剪图片意图Intent intent =newIntent("com.android.camera.action.CROP"); intent.setDataAndType(uri,"image/*"); intent.putExtra("crop","true"); // 裁剪框的比例,1:1intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // 裁剪后输出图片的尺寸大小intent.putExtra("outputX", 250); intent.putExtra("outputY", 250); intent.putExtra("outputFormat","JPEG");// 图片格式intent.putExtra("noFaceDetection",true);// 取消人脸识别intent.putExtra("return-data",true); // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUTstartActivityForResult(intent,PHOTO_REQUEST_CUT); } /** * *@paramrequestCode*@paramresultCode*@paramdata*/@Overrideprotected voidonActivityResult(intrequestCode,intresultCode, Intent data) {if(requestCode ==PHOTO_REQUEST_GALLERY) {// 从相册返回的数据if(data !=null) {// 得到图片的全路径Uri uri = data.getData();crop(uri); } }else if(requestCode ==PHOTO_REQUEST_CAREMA) {// 从相机返回的数据if(hasSdcard()) {crop(Uri.fromFile(tempFile)); }else{Toast.makeText(MainActivity.this,"未找到存储卡,无法存储照片!", Toast.LENGTH_SHORT).show(); } }else if(requestCode ==PHOTO_REQUEST_CUT) {// 从剪切图片返回的数据if(data !=null) {Bitmap bitmap = data.getParcelableExtra("data");/*** 获得图片*/iv_img.setImageBitmap(bitmap);//保存到SharedPreferencessaveBitmapToSharedPreferences(bitmap); }try{// 将临时文件删除tempFile.delete(); }catch(Exception e) {e.printStackTrace(); } }super.onActivityResult(requestCode, resultCode, data); } //保存图片到SharedPreferencesprivate voidsaveBitmapToSharedPreferences(Bitmap bitmap) {// Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); //第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStreamByteArrayOutputStream byteArrayOutputStream =newByteArrayOutputStream(); press(pressFormat.PNG, 80, byteArrayOutputStream); //第二步:利用Base64将字节数组输出流中的数据转换成字符串Stringbyte[] byteArray = byteArrayOutputStream.toByteArray(); String imageString =newString(Base64.encodeToString(byteArray, Base64.DEFAULT)); //第三步:将String保持至SharedPreferencesSharedPreferences sharedPreferences = getSharedPreferences("testSP", Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("image", imageString); mit(); //上传头像setImgByStr(imageString,""); } /** * 上传头像 此处使用用的OKHttp post请求上传的图片 *@paramimgStr*@paramimgName*/public voidsetImgByStr(String imgStr, String imgName) {String url ="http://appserver。。。。。。。"; Map<String, String> params =newHashMap<String, String>(); params.put("id","参数值");//params.put("data", imgStr); OkHttp.postAsync(url, params,newOkHttp.DataCallBack() {@Overridepublic voidrequestFailure(Request request, IOException e) {Log.i("上传失败","失败"+ request.toString() + e.toString()); } @Overridepublic voidrequestSuccess(String result)throwsException {Log.i("上传成功", result); } }); } //从SharedPreferences获取图片private voidgetBitmapFromSharedPreferences(){SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE); //第一步:取出字符串形式的BitmapString imageString=sharedPreferences.getString("image",""); //第二步:利用Base64将字符串转换为ByteArrayInputStreambyte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);if(byteArray.length==0){iv_img.setImageResource(R.mipmap.ic_launcher); }else{ByteArrayInputStream byteArrayInputStream=newByteArrayInputStream(byteArray); //第三步:利用ByteArrayInputStream生成BitmapBitmap bitmap= BitmapFactory.decodeStream(byteArrayInputStream);iv_img.setImageBitmap(bitmap); } }}//下面是我封装的一个 OKHttp注意:需要在build.gradle 中添加下面这句,然后在同步一下compile'com.squareup.okhttp3:logging-interceptor:3.4.2'//----------下面是封装的OKHttp类------------------package.tackpicture2;importandroid.os.Handler;importandroid.os.Looper;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.HashMap;importjava.util.Map;importjava.util.concurrent.TimeUnit;importokhttp3.Call;importokhttp3.Callback;importokhttp3.FormBody;importokhttp3.OkHttpClient;importokhttp3.Request;importokhttp3.RequestBody;importokhttp3.Response;importokhttp3.logging.HttpLoggingInterceptor;/*** Created by fan on /11/9.*/public classOkHttp {/** * 静态实例 */private staticOkHttpsOkHttpManager; /** * okhttpclient实例 */privateOkHttpClientmClient; /** * 因为我们请求数据一般都是子线程中请求,在这里我们使用了handler */privateHandlermHandler; /** * 构造方法 */privateOkHttp() {// // 可以通过实现 Logger 接口更改日志保存位置HttpLoggingInterceptor loggingInterceptor =newHttpLoggingInterceptor(); loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);// mClient = new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();mClient=newOkHttpClient(); /** * 在这里直接设置连接超时.读取超时,写入超时 */OkHttpClient.Builder builder =mClient.newBuilder(); builder.connectTimeout(10, TimeUnit.SECONDS); builder.readTimeout(10, TimeUnit.SECONDS); builder.writeTimeout(10, TimeUnit.SECONDS); builder.addInterceptor(loggingInterceptor);mClient= builder.build(); /** * 如果是用的3.0之前的版本 使用以下直接设置连接超时.读取超时,写入超时 */ //client.setConnectTimeout(10, TimeUnit.SECONDS); //client.setWriteTimeout(10, TimeUnit.SECONDS); //client.setReadTimeout(30, TimeUnit.SECONDS); /** * 初始化handler */mHandler=newHandler(Looper.getMainLooper()); } /** * 单例模式 获取OkHttp实例 * *@return*/public staticOkHttp getInstance() {if(sOkHttpManager==null) {sOkHttpManager=newOkHttp(); }returnsOkHttpManager; } //-------------------------同步的方式请求数据-------------------------- /** * 对外提供的get方法,同步的方式 * *@paramurl传入的地址 *@return*/public staticResponse getSync(String url) {//通过获取到的实例来调用内部方法returnsOkHttpManager.inner_getSync(url); } /** * GET方式请求的内部逻辑处理方式,同步的方式 * *@paramurl*@return*/privateResponse inner_getSync(String url) {Request request =newRequest.Builder().url(url).build(); Response response =null;try{//同步请求返回的是response对象response =mClient.newCall(request).execute(); }catch(IOException e) {e.printStackTrace(); }returnresponse; } /** * 对外提供的同步获取String的方法 * *@paramurl*@return*/public staticString getSyncString(String url) {returnsOkHttpManager.inner_getSyncString(url); } /** * 同步方法 */privateString inner_getSyncString(String url) {String result =null;try{/** * 把取得到的结果转为字符串,这里最好用string() */result = inner_getSync(url).body().string(); }catch(IOException e) {e.printStackTrace(); }returnresult; } //-------------------------异步的方式请求数据--------------------------public static voidgetAsync(String url, DataCallBack callBack) {getInstance().inner_getAsync(url, callBack); } /** * 内部逻辑请求的方法 * *@paramurl*@paramcallBack*@return*/private voidinner_getAsync(String url,finalDataCallBack callBack) {finalRequest request =newRequest.Builder().url(url).build();mClient.newCall(request).enqueue(newCallback() {@Overridepublic voidonFailure(Call call, IOException e) {deliverDataFailure(request, e, callBack); } @Overridepublic voidonResponse(Call call, Response response)throwsIOException {String result =null;try{result = response.body().string();}catch(IOException e) {deliverDataFailure(request, e, callBack);}deliverDataSuccess(result, callBack); } }); } /** * 分发失败的时候调用 * *@paramrequest*@parame*@paramcallBack*/private voiddeliverDataFailure(finalRequest request,finalIOException e,finalDataCallBack callBack) {/** * 在这里使用异步处理 */mHandler.post(newRunnable() {@Overridepublic voidrun() {if(callBack !=null) {callBack.requestFailure(request, e);} } }); } /** * 分发成功的时候调用 * *@paramresult*@paramcallBack*/private voiddeliverDataSuccess(finalString result,finalDataCallBack callBack) {/** * 在这里使用异步线程处理 */mHandler.post(newRunnable() {@Overridepublic voidrun() {if(callBack !=null) {try{callBack.requestSuccess(result);}catch(Exception e) {e.printStackTrace();}} } }); } /** * 数据回调接口 */public interfaceDataCallBack {voidrequestFailure(Request request, IOException e);voidrequestSuccess(String result)throwsException; } //-------------------------提交表单--------------------------public static voidpostAsync(String url, Map<String, String> params, DataCallBack callBack) {getInstance().inner_postAsync(url, params, callBack); }private voidinner_postAsync(String url, Map<String, String> params,finalDataCallBack callBack) {RequestBody requestBody =null;if(params ==null) {params =newHashMap<>(); } /** * 如果是3.0之前版本的,构建表单数据是下面的一句 */ //FormEncodingBuilder builder = new FormEncodingBuilder(); /** * 3.0之后版本 */FormBody.Builder builder =newFormBody.Builder(); /** * 在这对添加的参数进行遍历,map遍历有四种方式,如果想要了解的可以网上查找 */for(Map.Entry<String, String> map : params.entrySet()) {String key = map.getKey().toString(); String value =null; /** * 判断值是否是空的 */if(map.getValue() ==null) {value =""; }else{value = map.getValue(); } /** * 把key和value添加到formbody中 */builder.add(key, value); } requestBody = builder.build(); //结果返回 // 请求对象finalRequest request =newRequest.Builder().url(url).post(requestBody).build();mClient.newCall(request).enqueue(newCallback() {@Overridepublic voidonFailure(Call call, IOException e) {deliverDataFailure(request, e, callBack); } @Overridepublic voidonResponse(Call call, Response response)throwsIOException {String result = response.body().string();deliverDataSuccess(result, callBack); } }); } //-------------------------文件下载--------------------------public static voiddownloadAsync(String url, String desDir, DataCallBack callBack) {getInstance().inner_downloadAsync(url, desDir, callBack); } /** * 下载文件的内部逻辑处理类 * *@paramurl下载地址 *@paramdesDir目标地址 *@paramcallBack*/private voidinner_downloadAsync(finalString url,finalString desDir,finalDataCallBack callBack) {finalRequest request =newRequest.Builder().url(url).build();mClient.newCall(request).enqueue(newCallback() {@Overridepublic voidonFailure(Call call, IOException e) {deliverDataFailure(request, e, callBack); } @Overridepublic voidonResponse(Call call, Response response)throwsIOException {/*** 在这里进行文件的下载处理*/InputStream inputStream =null;FileOutputStream fileOutputStream =null;try{//文件名和目标地址File file =newFile(desDir, getFileName(url)); //把请求回来的response对象装换为字节流inputStream = response.body().byteStream();fileOutputStream =newFileOutputStream(file);intlen = 0;byte[] bytes =new byte[2048]; //循环读取数据while((len = inputStream.read(bytes)) != -1) {fileOutputStream.write(bytes, 0, len);} //关闭文件输出流fileOutputStream.flush(); //调用分发数据成功的方法deliverDataSuccess(file.getAbsolutePath(), callBack);}catch(IOException e) {//如果失败,调用此方法deliverDataFailure(request, e, callBack);e.printStackTrace();}finally{if(inputStream !=null) {inputStream.close();}if(fileOutputStream !=null) {fileOutputStream.close();}} } }); } /** * 根据文件url获取文件的路径名字 * *@paramurl*@return*/privateString getFileName(String url) {intseparatorIndex = url.lastIndexOf("/"); String path = (separatorIndex < 0) ? url : url.substring(separatorIndex + 1, url.length());returnpath; }}//---------------完了-----------------

package.tackpicture2;importandroid.content.Context;importandroid.content.Intent;importandroid.content.SharedPreferences;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;import.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.provider.MediaStore;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Base64;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importandroid.widget.Toast;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;importokhttp3.Request;public classMainActivityextendsAppCompatActivityimplementsView.OnClickListener {privateImageViewiv_img;privateButtonbt_camera;privateButtonbt_xiangce;private static final intPHOTO_REQUEST_CAREMA= 1;// 拍照private static final intPHOTO_REQUEST_GALLERY= 2;// 从相册中选择private static final intPHOTO_REQUEST_CUT= 3;// 结果 /* 头像名称 */private static finalStringPHOTO_FILE_NAME="temp_photo.jpg";privateFiletempFile;@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private voidinitView() {iv_img= (ImageView) findViewById(R.id.iv_img);bt_camera= (Button) findViewById(R.id.bt_camera);bt_xiangce= (Button) findViewById(R.id.bt_xiangce);//从SharedPreferences获取图片getBitmapFromSharedPreferences();bt_camera.setOnClickListener(this);bt_xiangce.setOnClickListener(this);}@Overridepublic voidonClick(View v) {switch(v.getId()) {caseR.id.bt_camera:// 激活相机Intent intent =newIntent("android.media.action.IMAGE_CAPTURE");// 判断存储卡是否可以用,可用进行存储if(hasSdcard()) {tempFile=newFile(Environment.getExternalStorageDirectory(),PHOTO_FILE_NAME);// 从文件中创建uriUri uri = Uri.fromFile(tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMAstartActivityForResult(intent,PHOTO_REQUEST_CAREMA);break;caseR.id.bt_xiangce:// 激活系统图库,选择一张图片Intent intent1 =newIntent(Intent.ACTION_PICK);intent1.setType("image/*");// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERYstartActivityForResult(intent1,PHOTO_REQUEST_GALLERY);break;}}/** 判断sdcard是否被挂载*/private booleanhasSdcard() {//判断SD卡手否是安装好的media_mountedif(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {return true;}else{return false;}}/* * 剪切图片 */private voidcrop(Uri uri) {// 裁剪图片意图Intent intent =newIntent("com.android.camera.action.CROP");intent.setDataAndType(uri,"image/*");intent.putExtra("crop","true");// 裁剪框的比例,1:1intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// 裁剪后输出图片的尺寸大小intent.putExtra("outputX", 250);intent.putExtra("outputY", 250);intent.putExtra("outputFormat","JPEG");// 图片格式intent.putExtra("noFaceDetection",true);// 取消人脸识别intent.putExtra("return-data",true);// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUTstartActivityForResult(intent,PHOTO_REQUEST_CUT);}/** * *@paramrequestCode*@paramresultCode*@paramdata*/@Overrideprotected voidonActivityResult(intrequestCode,intresultCode, Intent data) {if(requestCode ==PHOTO_REQUEST_GALLERY) {// 从相册返回的数据if(data !=null) {// 得到图片的全路径Uri uri = data.getData();crop(uri);}}else if(requestCode ==PHOTO_REQUEST_CAREMA) {// 从相机返回的数据if(hasSdcard()) {crop(Uri.fromFile(tempFile));}else{Toast.makeText(MainActivity.this,"未找到存储卡,无法存储照片!", Toast.LENGTH_SHORT).show();}}else if(requestCode ==PHOTO_REQUEST_CUT) {// 从剪切图片返回的数据if(data !=null) {Bitmap bitmap = data.getParcelableExtra("data");/*** 获得图片*/iv_img.setImageBitmap(bitmap);//保存到SharedPreferencessaveBitmapToSharedPreferences(bitmap);}try{// 将临时文件删除tempFile.delete();}catch(Exception e) {e.printStackTrace();}}super.onActivityResult(requestCode, resultCode, data);}//保存图片到SharedPreferencesprivate voidsaveBitmapToSharedPreferences(Bitmap bitmap) {// Bitmap bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); //第一步:将Bitmap压缩至字节数组输出流ByteArrayOutputStreamByteArrayOutputStream byteArrayOutputStream =newByteArrayOutputStream();press(pressFormat.PNG, 80, byteArrayOutputStream);//第二步:利用Base64将字节数组输出流中的数据转换成字符串Stringbyte[] byteArray = byteArrayOutputStream.toByteArray();String imageString =newString(Base64.encodeToString(byteArray, Base64.DEFAULT));//第三步:将String保持至SharedPreferencesSharedPreferences sharedPreferences = getSharedPreferences("testSP", Context.MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();editor.putString("image", imageString);mit();//上传头像setImgByStr(imageString,"");}/** * 上传头像 *@paramimgStr*@paramimgName */public voidsetImgByStr(String imgStr, String imgName) {String url ="http://appserver.1035.mobi/MobiSoft/User_upLogo";Map<String, String> params =newHashMap<String, String>();params.put("id","11460047");// 11459832params.put("data", imgStr);OkHttp.postAsync(url, params,newOkHttp.DataCallBack() {@Overridepublic voidrequestFailure(Request request, IOException e) {Log.i("上传失败","失败"+ request.toString() + e.toString());}@Overridepublic voidrequestSuccess(String result)throwsException {Log.i("上传成功", result);}});}//从SharedPreferences获取图片private voidgetBitmapFromSharedPreferences(){SharedPreferences sharedPreferences=getSharedPreferences("testSP", Context.MODE_PRIVATE);//第一步:取出字符串形式的BitmapString imageString=sharedPreferences.getString("image","");//第二步:利用Base64将字符串转换为ByteArrayInputStreambyte[] byteArray=Base64.decode(imageString, Base64.DEFAULT);if(byteArray.length==0){iv_img.setImageResource(R.mipmap.ic_launcher);}else{ByteArrayInputStream byteArrayInputStream=newByteArrayInputStream(byteArray);//第三步:利用ByteArrayInputStream生成BitmapBitmap bitmap= BitmapFactory.decodeStream(byteArrayInputStream);iv_img.setImageBitmap(bitmap);}}}

如果觉得《Android中使用封装的OKHttp上传图片 从相机和相册中获取图片并剪切》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。