快速上传头像到服务端工具类FaceUtil
来源:互联网 发布:大数据自动阅卷系统 编辑:程序博客网 时间:2024/04/18 13:17
快速迭代用
用法,伪代码:
简化从相册或照相获取图片的Android库:EasyImage
http://www.open-open.com/lib/view/open1446710908670.html
另一个Android图片(视频)选择器:android-media-picker
http://www.open-open.com/lib/view/open1437054095193.html
[多文件上传一]利用httpmime.jar实现
http://my.oschina.net/oppo4545/blog/315420
[多文件上传二]利用表单方式实现
http://my.oschina.net/oppo4545/blog/315441
[多文件上传三]利用UrlEncodedFormEntity表单实现
http://my.oschina.net/oppo4545/blog/315451
使用volley上传图片,一个参数多张图、多张图片多张图,亲测有效哦
http://m.blog.csdn.net/blog/chequer_lkp/40631271
一个图片裁减库,可以自定义UI,非常不错。
http://www.jcodecraeer.com/a/opensource/2015/0822/3343.html
图片剪切库:scissors
http://www.open-open.com/lib/view/open1448373865642.html
一个volley自定义请求支持文件上传:MultipartRequest
http://www.open-open.com/lib/view/open1442817196732.html
import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.Timer;import java.util.TimerTask;import org.json.JSONException;import org.json.JSONObject;import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.content.ContentUris;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.provider.DocumentsContract;import android.provider.MediaStore;import android.util.Log;import com.yirui.youbao.App;import com.yirui.youbao.net.Commands;/** * * @author pythoner * */public class FaceUtil {private String[] items = new String[] { "图库", "拍照" };/* 头像名称 */private static final String IMAGE_FILE_NAME = "faces.jpg";/* 请求码 */private static final int IMAGE_REQUEST_CODE = 0;private static final int SELECT_PIC_KITKAT = 3;private static final int CAMERA_REQUEST_CODE = 1;private static final int RESULT_REQUEST_CODE = 2;private Activity context;private final int ST_UPLOAD_SUCCESS=0;private final int ST_UPLOAD_FAIL=1;Handler handler = new Handler(){ public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case ST_UPLOAD_SUCCESS: if (onFaceUploadListener != null) { DataWrap datas=(DataWrap)msg.obj; try { JSONObject response = new JSONObject(datas.data); JSONObject result = response.optJSONObject("result"); int code = result.optInt("code"); if (code == 2000) { JSONObject data = response.optJSONObject("data"); JSONObject urls = data.optJSONObject("urls"); String orignUrl = urls.optString("origin", null); String imgUrl = urls.optString("100_100", null); String circleImgUrl = urls.optString("100_100_circle", null); onFaceUploadListener.onFaceUploadSuccess(datas.photo, orignUrl,imgUrl, circleImgUrl); }else{ onFaceUploadListener.onFaceUploadFailed(datas.photo); } } catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();onFaceUploadListener.onFaceUploadFailed(datas.photo);} } break; case ST_UPLOAD_FAIL: if (onFaceUploadListener != null) { DataWrap datas=(DataWrap)msg.obj; onFaceUploadListener.onFaceUploadFailed(datas.photo); } break; default: break; } } }; public FaceUtil(Activity context) {this.context = context;}public void showSettingFaceDialog() {new AlertDialog.Builder(context).setTitle("图片来源").setCancelable(true).setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case 0:// Local ImageIntent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {context.startActivityForResult(intent,SELECT_PIC_KITKAT);} else {context.startActivityForResult(intent,IMAGE_REQUEST_CODE);}break;case 1:// Take PictureIntent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 判断存储卡是否可以用,可用进行存储if (hasSdcard()) {intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME)));}context.startActivityForResult(intentFromCapture,CAMERA_REQUEST_CODE);break;}}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).show();}public void onActivityResult(int requestCode, int resultCode, Intent data) {// 结果码不等于取消时候if (resultCode != Activity.RESULT_CANCELED) {switch (requestCode) {case FaceUtil.IMAGE_REQUEST_CODE:startPhotoZoom(data.getData());break;case FaceUtil.SELECT_PIC_KITKAT:startPhotoZoom(data.getData());break;case FaceUtil.CAMERA_REQUEST_CODE:File tempFile = new File(Environment.getExternalStorageDirectory(),FaceUtil.IMAGE_FILE_NAME);if (tempFile.exists()) {startPhotoZoom(Uri.fromFile(tempFile));}break;case FaceUtil.RESULT_REQUEST_CODE:if (data != null) {setData(data);}break;}}}private boolean hasSdcard() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);}/** * 裁剪图片方法实现 * * @param uri */private void startPhotoZoom(Uri uri) {if (uri == null) {Log.i("tag", "The uri is not exist.");return;}Intent intent = new Intent("com.android.camera.action.CROP");if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {String url = getPath(context, uri);intent.setDataAndType(Uri.fromFile(new File(url)), "image/*");} else {intent.setDataAndType(uri, "image/*");}// 设置裁剪intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 200);intent.putExtra("outputY", 200);intent.putExtra("return-data", true);context.startActivityForResult(intent, RESULT_REQUEST_CODE);}/** * 保存裁剪之后的图片数据 * * @param picdata */private void setData(Intent data) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");if (photo != null) {//这里是保存图片到本地saveBitmap(photo);//然后上传图片到服务端保存;//此处每个人实现是不一样的,一般需要重写uploadFace方法;//我这里没有抽成接口,为了快速迭代使用;//但是,我在uploadFace成功后回调onFaceUploadSuccess方法;uploadFace(photo);}}}private OnFaceUploadListener onFaceUploadListener;public void setOnFaceUploadListener(OnFaceUploadListener onFaceUploadListener) {this.onFaceUploadListener = onFaceUploadListener;}public interface OnFaceUploadListener {void onFaceUploadSuccess(Bitmap photo, String orignUrl,String imgUrl, String circleImgUrl);void onFaceUploadFailed(Bitmap photo);}private void saveBitmap(Bitmap bitmap) {File f = new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);try {f.createNewFile();FileOutputStream fos = null;fos = new FileOutputStream(f);bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private void uploadFace(final Bitmap photo) {TimerTask task=new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stubFile file = new File(Environment.getExternalStorageDirectory(),IMAGE_FILE_NAME);String filePath = file.getAbsolutePath();String urlString=Commands.URL_SYSTEMS_UPLOAD_FILE+"?user_session_key="+App.user.getUser_session_key()+"&file_category=1";uploadFile(photo,filePath,urlString);}};Timer t=new Timer();t.schedule(task, 5);//使用volley上传,该方法可能会报错/*Commands.uploadFile(context, 1, App.user, filePath,new VolleyHelper.OnFileUploadListener() {@Overridepublic void onFileUploadSuccess(String orignUrl,String imgUrl, String circleImgUrl) {// TODO Auto-generated method stubif (onFaceUploadSuccessListener != null) {onFaceUploadSuccessListener.onFaceUploadSuccess(view, photo, orignUrl,imgUrl, circleImgUrl);}}});*/}/** * 上传文件至Server * @param photo * @param filePath 文件路径 * @param urlString 连接地址 */ private void uploadFile(Bitmap photo,String filePath,String urlString) { String end ="\r\n"; String twoHyphens ="--"; String boundary ="*****"; try { URL url =new URL(urlString); HttpURLConnection con=(HttpURLConnection)url.openConnection(); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); con.setRequestMethod("POST"); con.setRequestProperty("Connection", "Keep-Alive"); con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); DataOutputStream dos =new DataOutputStream(con.getOutputStream()); dos.writeBytes(twoHyphens + boundary + end); dos.writeBytes("Content-Disposition: form-data; "+"name=\"file1\";filename=\""+IMAGE_FILE_NAME +"\""+ end); dos.writeBytes(end); FileInputStream fis =new FileInputStream(filePath); int bufferSize =1024; byte[] buffer =new byte[bufferSize]; int length =-1; /* 从文件读取数据至缓冲区 */ while((length = fis.read(buffer)) !=-1) { dos.write(buffer, 0, length); } dos.writeBytes(end); dos.writeBytes(twoHyphens + boundary + twoHyphens + end); dos.flush(); dos.close(); fis.close(); /* 取得Response内容 */ InputStream is = con.getInputStream(); int ch; StringBuffer b =new StringBuffer(); while( ( ch = is.read() ) !=-1 ) { b.append( (char)ch ); } is.close(); DataWrap obj=new DataWrap(photo,b.toString()); sendMessage(ST_UPLOAD_SUCCESS,obj); } catch(Exception e) { e.printStackTrace(); DataWrap obj=new DataWrap(photo,null); sendMessage(ST_UPLOAD_FAIL,obj); } } private void sendMessage(int st,Object obj){ Message message = new Message(); message.what = st; message.obj=obj; handler.sendMessage(message); } class DataWrap{ Bitmap photo; String data; DataWrap(Bitmap photo,String data){ this.photo=photo; this.data=data; } } @SuppressLint("NewApi")private static String getPath(final Context context, final Uri uri) {final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;// DocumentProviderif (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {// ExternalStorageProviderif (isExternalStorageDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {return Environment.getExternalStorageDirectory() + "/"+ split[1];}}// DownloadsProviderelse if (isDownloadsDocument(uri)) {final String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));return getDataColumn(context, contentUri, null, null);}// MediaProviderelse if (isMediaDocument(uri)) {final String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];Uri contentUri = null;if ("image".equals(type)) {contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;} else if ("video".equals(type)) {contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;} else if ("audio".equals(type)) {contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;}final String selection = "_id=?";final String[] selectionArgs = new String[] { split[1] };return getDataColumn(context, contentUri, selection,selectionArgs);}}// MediaStore (and general)else if ("content".equalsIgnoreCase(uri.getScheme())) {// Return the remote addressif (isGooglePhotosUri(uri))return uri.getLastPathSegment();return getDataColumn(context, uri, null, null);}// Fileelse if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}return null;}/** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context * The context. * @param uri * The Uri to query. * @param selection * (Optional) Filter used in the query. * @param selectionArgs * (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */private static String getDataColumn(Context context, Uri uri,String selection, String[] selectionArgs) {Cursor cursor = null;final String column = "_data";final String[] projection = { column };try {cursor = context.getContentResolver().query(uri, projection,selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {final int index = cursor.getColumnIndexOrThrow(column);return cursor.getString(index);}} finally {if (cursor != null)cursor.close();}return null;}/** * @param uri * The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */private static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}/** * @param uri * The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */private static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}/** * @param uri * The Uri to check. * @return Whether the Uri authority is MediaProvider. */private static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}/** * @param uri * The Uri to check. * @return Whether the Uri authority is Google Photos. */private static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}}
用法,伪代码:
ImageView iv_face = (ImageView) view.findViewById(R.id.iv_face);iv_face.setOnClickListener(this);//初始化显示默认头像Bitmap defaultFace = ImageUtil.drawableToBitmap(App.res.getDrawable(R.drawable.default_face));CircleImageDrawable drawable=new CircleImageDrawable(defaultFace);iv_face.setImageDrawable(drawable);faceUtil =new FaceUtil(this,iv_face);faceUtil.setOnFaceUploadSuccessListener(new FaceUtil.OnFaceUploadSuccessListener() {@Overridepublic void onFaceUploadSuccess(ImageView view, Bitmap photo,String orignUrl, String imgUrl, String circleImgUrl) {// TODO Auto-generated method stubLog.i("tag", "orignUrl=" + orignUrl);Log.i("tag", "imgUrl=" + imgUrl);Log.i("tag", "circleImgUrl=" + circleImgUrl);CircleImageDrawable drawable=new CircleImageDrawable(photo);view.setImageDrawable(drawable); App.user.setFaceUrl(orignUrl); App.user.setFaceBitmap(photo);}});@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent=null;switch (v.getId()) {case R.id.iv_face:if(App.user.isLogined()){faceUtil.showSettingFaceDialog();}else{intent=new Intent(context,UserLoginActivity.class);startActivity(intent);}break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);Log.i("tag", "requestCode==" + requestCode + ";resultCode==" + resultCode);faceUtil.onActivityResult(requestCode,resultCode,data); }
简化从相册或照相获取图片的Android库:EasyImage
http://www.open-open.com/lib/view/open1446710908670.html
另一个Android图片(视频)选择器:android-media-picker
http://www.open-open.com/lib/view/open1437054095193.html
[多文件上传一]利用httpmime.jar实现
http://my.oschina.net/oppo4545/blog/315420
[多文件上传二]利用表单方式实现
http://my.oschina.net/oppo4545/blog/315441
[多文件上传三]利用UrlEncodedFormEntity表单实现
http://my.oschina.net/oppo4545/blog/315451
使用volley上传图片,一个参数多张图、多张图片多张图,亲测有效哦
http://m.blog.csdn.net/blog/chequer_lkp/40631271
一个图片裁减库,可以自定义UI,非常不错。
http://www.jcodecraeer.com/a/opensource/2015/0822/3343.html
图片剪切库:scissors
http://www.open-open.com/lib/view/open1448373865642.html
一个volley自定义请求支持文件上传:MultipartRequest
http://www.open-open.com/lib/view/open1442817196732.html
0 0
- 快速上传头像到服务端工具类FaceUtil
- 工具类---上传头像
- 手机APP上传头像保存到oracle数据库中并显示头像(服务端)
- // 上传头像到服务器
- 上传头像到服务器
- Android头像上传和java服务端接收图片。
- post上传视频文件到服务端
- c#上传文件到服务端
- TCP 上传图片到服务端
- Android 测试上传头像到服务器
- Thinkphp头像上传到用户文件下
- iOS上传图片或者头像到服务器。
- iOS开发:上传头像到服务器
- Android 上传头像(文件)到服务器
- 关于上传头像到服务器的问题
- 调用系统相册上传头像到服务器
- Android裁剪头像上传到远程服务器
- 修改用户头像,上传到服务器
- 常见的对话框Dialog
- 分解质因数
- LoadMoreListView+SwipeRefreshLayout(分页下拉)基本结构
- MyBatis学习笔记(一)
- HorizontalScrollView+RadioGroup+ViewPager+FragmentPagerAdapter基本结构
- 快速上传头像到服务端工具类FaceUtil
- 手势滑动销毁Activity
- zxing二维码扫描功能
- 排序算法总结
- android5.x之Palette调色板
- 模拟退火算法
- 关于struts2 result param name的详解
- SlideExpandableListView滑动显示隐藏面板
- MultiStateView不同的状态下显示不同的界面