亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現頭像上傳功能

2019-10-21 21:31:36
字體:
來源:轉載
供稿:網友

之前做這個頭像上傳功能還是花了好多時間的,今天我將我的代碼分享給大家先看效果圖

Android,頭像上傳

首先看上傳圖片的工具類,一點都沒有少復制就可以用

** * Created by Administrator on 2016/7/28. * 上傳圖片工具類 */public class UploadUtil { private static UploadUtil uploadUtil; private static final String BOUNDARY = UUID.randomUUID().toString(); // 邊界標識 隨機生成 private static final String PREFIX = "--"; private static final String LINE_END = "/r/n"; private static final String CONTENT_TYPE = "multipart/form-data"; // 內容類型 private UploadUtil() { } /** * 單例模式獲取上傳工具類 * * @return */ public static UploadUtil getInstance() { if (null == uploadUtil) {  uploadUtil = new UploadUtil(); } return uploadUtil; } private static final String TAG = "UploadUtil"; private int readTimeOut = 10 * 1000; // 讀取超時 private int connectTimeout = 10 * 1000; // 超時時間 /*** * 請求使用多長時間 */ private static int requestTime = 0; private static final String CHARSET = "utf-8"; // 設置編碼 /*** * 上傳成功 */ public static final int UPLOAD_SUCCESS_CODE = 1; /** * 文件不存在 */ public static final int UPLOAD_FILE_NOT_EXISTS_CODE = 2; /** * 服務器出錯 */ public static final int UPLOAD_SERVER_ERROR_CODE = 3; protected static final int WHAT_TO_UPLOAD = 1; protected static final int WHAT_UPLOAD_DONE = 2; /** * android上傳文件到服務器 * * @param filePath 需要上傳的文件的路徑 * @param fileKey 在網頁上<input type=file name=xxx/> xxx就是這里的fileKey * @param RequestURL 請求的URL */ public void uploadFile(String filePath, String fileKey, String RequestURL,    Map<String, String> param) { if (filePath == null) {  sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE, "文件不存在");  return; } try {  File file = new File(filePath);  uploadFile(file, fileKey, RequestURL, param); } catch (Exception e) {  sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE, "文件不存在");  e.printStackTrace();  return; } } /** * android上傳文件到服務器 * * @param file 需要上傳的文件 * @param fileKey 在網頁上<input type=file name=xxx/> xxx就是這里的fileKey * @param RequestURL 請求的URL */ public void uploadFile(final File file, final String fileKey,    final String RequestURL, final Map<String, String> param) { if (file == null || (!file.exists())) {  sendMessage(UPLOAD_FILE_NOT_EXISTS_CODE, "文件不存在");  return; } Log.i(TAG, "請求的URL=" + RequestURL); Log.i(TAG, "請求的fileName=" + file.getName()); Log.i(TAG, "請求的fileKey=" + fileKey); new Thread(new Runnable() { //開啟線程上傳文件  @Override  public void run() {  toUploadFile(file, fileKey, RequestURL, param);  } }).start(); } private void toUploadFile(File file, String fileKey, String RequestURL,    Map<String, String> param) { String result = null; requestTime = 0; long requestTime = System.currentTimeMillis(); long responseTime = 0; try {  URL url = new URL(RequestURL);  HttpURLConnection conn = (HttpURLConnection) url.openConnection();  conn.setReadTimeout(readTimeOut);  conn.setConnectTimeout(connectTimeout);  conn.setDoInput(true); // 允許輸入流  conn.setDoOutput(true); // 允許輸出流  conn.setUseCaches(false); // 不允許使用緩存  conn.setRequestMethod("POST"); // 請求方式  conn.setRequestProperty("Charset", CHARSET); // 設置編碼  conn.setRequestProperty("connection", "keep-alive");  conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");  conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY);// conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");/** * 當文件不為空,把文件包裝并且上傳 */  DataOutputStream dos = new DataOutputStream(conn.getOutputStream());  StringBuffer sb = null;  String params = "";/*** * 以下是用于上傳參數 */  if (param != null && param.size() > 0) {  Iterator<String> it = param.keySet().iterator();  while (it.hasNext()) {   sb = null;   sb = new StringBuffer();   String key = it.next();   String value = param.get(key);   sb.append(PREFIX).append(BOUNDARY).append(LINE_END);   sb.append("Content-Disposition: form-data; name=/"").append(key).append("/"").append(LINE_END).append(LINE_END);   sb.append(value).append(LINE_END);   params = sb.toString();   Log.i(TAG, key + "=" + params + "##");   dos.write(params.getBytes());// dos.flush();  }  }  sb = null;  params = null;  sb = new StringBuffer();/** * 這里重點注意: name里面的值為服務器端需要key 只有這個key 才可以得到對應的文件 * filename是文件的名字,包含后綴名的 比如:abc.png */  sb.append(PREFIX).append(BOUNDARY).append(LINE_END);  sb.append("Content-Disposition:form-data; name=/"" + fileKey   + "/"; filename=/"" + file.getName() + "/"" + LINE_END);  sb.append("Content-Type:image/pjpeg" + LINE_END); // 這里配置的Content-type很重要的 ,用于服務器端辨別文件的類型的  sb.append(LINE_END);  params = sb.toString();  sb = null;  Log.i(TAG, file.getName() + "=" + params + "##");  dos.write(params.getBytes());/**上傳文件*/  InputStream is = new FileInputStream(file);  onUploadProcessListener.initUpload((int) file.length());  byte[] bytes = new byte[1024];  int len = 0;  int curLen = 0;  while ((len = is.read(bytes)) != -1) {  curLen += len;  dos.write(bytes, 0, len);  onUploadProcessListener.onUploadProcess(curLen);  }  is.close();  dos.write(LINE_END.getBytes());  byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END).getBytes();  dos.write(end_data);  dos.flush();//// dos.write(tempOutputStream.toByteArray());/** * 獲取響應碼 200=成功 當響應成功,獲取響應的流 */  int res = conn.getResponseCode();  responseTime = System.currentTimeMillis();  this.requestTime = (int) ((responseTime - requestTime) / 1000);  Log.e(TAG, "response code:" + res);  if (res == 200) {  Log.e(TAG, "request success");  InputStream input = conn.getInputStream();  StringBuffer sb1 = new StringBuffer();  int ss;  while ((ss = input.read()) != -1) {   sb1.append((char) ss);  }  String s = sb1.toString();  result = s;  Log.e(TAG, "result : " + result);  sendMessage(UPLOAD_SUCCESS_CODE, "上傳結果:"   + result);  return;  } else {  Log.e(TAG, "request error" + res);  sendMessage(UPLOAD_SERVER_ERROR_CODE, "上傳失敗:code=" + res);  return;  } } catch (MalformedURLException e) {  sendMessage(UPLOAD_SERVER_ERROR_CODE, "上傳失?。篹rror=" + e.getMessage());  e.printStackTrace();  return; } catch (IOException e) {  sendMessage(UPLOAD_SERVER_ERROR_CODE, "上傳失?。篹rror=" + e.getMessage());  e.printStackTrace();  return; } } /** * 發送上傳結果 * * @param responseCode * @param responseMessage */ private void sendMessage(int responseCode, String responseMessage) { onUploadProcessListener.onUploadDone(responseCode, responseMessage); } /** * 下面是一個自定義的回調函數,用到回調上傳文件是否完成 * * @author shimingzheng */ public static interface OnUploadProcessListener { /**  * 上傳響應  *  * @param responseCode  * @param message  */ void onUploadDone(int responseCode, String message); /**  * 上傳中  *  * @param uploadSize  */ void onUploadProcess(int uploadSize); /**  * 準備上傳  *  * @param fileSize  */ void initUpload(int fileSize); } private OnUploadProcessListener onUploadProcessListener; public void setOnUploadProcessListener(  OnUploadProcessListener onUploadProcessListener) { this.onUploadProcessListener = onUploadProcessListener; } public int getReadTimeOut() { return readTimeOut; } public void setReadTimeOut(int readTimeOut) { this.readTimeOut = readTimeOut; } public int getConnectTimeout() { return connectTimeout; } public void setConnectTimeout(int connectTimeout) { this.connectTimeout = connectTimeout; } /** * 獲取上傳使用的時間 * * @return */ public static int getRequestTime() { return requestTime; } public static interface uploadProcessListener { } /** * 將Bitmap轉換成文件 * 保存文件 * * @param bm * @param fileName * @throws IOException */ public static File saveFile(Bitmap bm, String path, String fileName) throws IOException { File dirFile = new File(path); if (!dirFile.exists()) {  dirFile.mkdir(); } File myCaptureFile = new File(path, fileName); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(myCaptureFile)); bm.compress(Bitmap.CompressFormat.JPEG, 80, bos); bos.flush(); bos.close(); return myCaptureFile; }}

從相冊獲取圖片的方法

/** * 從相冊選擇圖片來源 */private void getPhoto() { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  "image/*"); startActivityForResult(intent, PHOTO_REQUEST);}

從系統相機拍照獲取照片

/** * 從系統相機選擇圖片來源 */private void getCamera() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面這句指定調用相機拍照后的照片存儲的路徑 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(  Environment.getExternalStorageDirectory(), "hand.jpg"))); startActivityForResult(intent, CAMERA_REQUEST);}

調用系統裁剪工具裁剪圖片

/**** * 調用系統自帶切圖工具對圖片進行裁剪 * 微信也是 * * @param uri */private void photoClip(Uri uri) { // 調用系統中自帶的圖片剪裁 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是寬高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 150); intent.putExtra("outputY", 150); intent.putExtra("return-data", true); startActivityForResult(intent, PHOTO_CLIP);}

上傳服務器的方法

/** * 上傳圖片到服務器 */private void toUploadFile() { pd = ProgressDialog.show(this, "", "正在上傳文件..."); pd.show(); String fileKey = "avatarFile"; UploadUtil uploadUtil = UploadUtil.getInstance(); uploadUtil.setOnUploadProcessListener(MainActivity.this); //設置監聽器監聽上傳狀態 Map<String, String> params = new HashMap<String, String>();//上傳map對象 params.put("userId", ""); uploadUtil.uploadFile(filepath, fileKey, "上傳頭像的地址", params); Toast.makeText(this, "上傳成功", Toast.LENGTH_LONG).show();}

重新服務器響應方法

/** * 上傳服務器響應回調 */@Overridepublic void onUploadDone(int responseCode, String message) { //上傳完成響應 pd.dismiss(); Message msg = Message.obtain(); msg.what = UPLOAD_FILE_DONE; msg.arg1 = responseCode; msg.obj = message;}@Overridepublic void onUploadProcess(int uploadSize) { //上傳中 Message msg = Message.obtain(); msg.what = UPLOAD_IN_PROCESS; msg.arg1 = uploadSize;}@Overridepublic void initUpload(int fileSize) { //準備上傳 Message msg = Message.obtain(); msg.what = UPLOAD_INIT_PROCESS; msg.arg1 = fileSize;}

重寫這些方法需要實現接口

public class MainActivity extends AppCompatActivity implements View.OnClickListener, UploadUtil.OnUploadProcessListener {

重寫onActivityResult獲取數據

 

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case CAMERA_REQUEST:  switch (resultCode) {  case -1://-1表示拍照成功   File file = new File(Environment.getExternalStorageDirectory()    + "/hand.jpg");//保存圖片   if (file.exists()) {   //對相機拍照照片進行裁剪   photoClip(Uri.fromFile(file));   }  }  break; case PHOTO_REQUEST://從相冊取  if (data != null) {  Uri uri = data.getData();  //對相冊取出照片進行裁剪  photoClip(uri);  }  break; case PHOTO_CLIP:  //完成  if (data != null) {  Bundle extras = data.getExtras();  if (extras != null) {   Bitmap photo = extras.getParcelable("data");   try {   //獲得圖片路徑   filepath = UploadUtil.saveFile(photo, Environment.getExternalStorageDirectory().toString(), "hand.jpg");   //上傳照片   toUploadFile();   } catch (IOException e) {   e.printStackTrace();   }   //上傳完成將照片寫入imageview與用戶進行交互   mImageView.setImageBitmap(photo);  }  }  break; }}

源碼下載:Android實現頭像上傳功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美区二区三区| 国产精品视频26uuu| 日韩精品一区二区视频| 中文字幕久热精品在线视频| 久久噜噜噜精品国产亚洲综合| 中文字幕亚洲激情| 亚洲大胆美女视频| 57pao国产精品一区| 日韩一区二区三区国产| 亚洲高清免费观看高清完整版| 日韩一区二区三区在线播放| 国产一区视频在线播放| www欧美日韩| 国产经典一区二区| 中国日韩欧美久久久久久久久| 久久精品视频亚洲| 久久久av免费| 国产在线观看精品一区二区三区| 国产福利视频一区二区| 欧美成人精品在线| 不用播放器成人网| 久久在精品线影院精品国产| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲淫片在线视频| 欧美激情精品久久久久久蜜臀| 国产一区二区日韩| 中文字幕精品av| 国产精品亚洲综合天堂夜夜| 日韩电影在线观看免费| 欧美最猛性xxxxx(亚洲精品)| 欧美精品激情在线观看| 一区二区中文字幕| 国产亚洲精品高潮| 中文字幕9999| 性欧美视频videos6一9| 亚洲国产精品成人精品| 成人激情视频免费在线| 日韩美女毛茸茸| 亚洲天堂第二页| 亚洲人成网站999久久久综合| 久久久国产精彩视频美女艺术照福利| 亚洲aⅴ男人的天堂在线观看| 亚洲国内精品在线| 国产精品久在线观看| 在线成人一区二区| 亚洲免费av网址| 久久久久久成人精品| 亚洲欧美精品伊人久久| 久久久久久亚洲精品| 69视频在线播放| 91精品免费久久久久久久久| 亚洲视频综合网| 欧美视频在线观看免费网址| 欧美成人午夜影院| 欧美精品激情在线观看| 国产精品久久久久久久久久小说| 国产精品亚洲综合天堂夜夜| 久久综合久中文字幕青草| 久久99精品视频一区97| 青草成人免费视频| 成人中心免费视频| 精品久久久久久亚洲国产300| 8090理伦午夜在线电影| 国产99久久精品一区二区永久免费| 91国内产香蕉| 国产在线视频不卡| 久久久成人的性感天堂| 精品高清美女精品国产区| 日韩av男人的天堂| 北条麻妃99精品青青久久| 久久久精品国产一区二区| 日本不卡视频在线播放| 国产精品视频区1| 久久亚洲精品中文字幕冲田杏梨| 国产精品免费电影| 91亚洲精品视频| 91av在线看| 精品人伦一区二区三区蜜桃免费| 亚洲日韩欧美视频| 国产丝袜一区二区| 亚洲国产欧美一区二区丝袜黑人| 亚洲国产精品嫩草影院久久| 亚洲精品按摩视频| 国产一区二区三区精品久久久| 在线观看欧美日韩国产| 日韩欧美在线观看视频| 欧美日韩国产一区二区| 亚洲成人黄色在线观看| 91亚洲精品在线观看| 国产精品观看在线亚洲人成网| 国产精品毛片a∨一区二区三区|国| 91干在线观看| 美女视频黄免费的亚洲男人天堂| 色综合视频一区中文字幕| 国内精品在线一区| 日韩欧中文字幕| 中文在线资源观看视频网站免费不卡| 国产精品一区二区av影院萌芽| 92福利视频午夜1000合集在线观看| 亚洲片在线观看| 欧美精品在线极品| 91在线精品视频| 日韩在线免费视频| 日韩毛片在线看| 日韩性xxxx爱| 最近2019中文字幕大全第二页| 91精品国产高清久久久久久久久| 日韩精品在线观看一区| 亚洲女人天堂成人av在线| 久久久午夜视频| 青青青国产精品一区二区| 91免费视频网站| 欧美精品久久一区二区| 92福利视频午夜1000合集在线观看| 成人日韩在线电影| 亚洲精品午夜精品| 国产精品欧美久久久| 亚洲天堂成人在线视频| 久久成人精品电影| zzjj国产精品一区二区| 欧美成人免费播放| 国产精品久久久久久搜索| 欧美日韩性生活视频| 亚洲精品在线观看www| 日本一区二区三区四区视频| 日韩av在线影院| 久久精品中文字幕免费mv| 国内精久久久久久久久久人| 日韩毛片在线观看| 97久久伊人激情网| 91久久精品国产91性色| 亚洲性无码av在线| 欧美天堂在线观看| 欧美精品久久久久| 97在线观看视频国产| 7777精品久久久久久| 久久久亚洲欧洲日产国码aⅴ| 日本在线精品视频| 日韩欧中文字幕| 久久久久999| 成人福利免费观看| 永久免费看mv网站入口亚洲| 琪琪亚洲精品午夜在线| 国产一区二区三区免费视频| 亚洲精品色婷婷福利天堂| 中文字幕精品av| 国模吧一区二区三区| 欧美激情精品久久久久久蜜臀| 欧美日韩加勒比精品一区| 一区二区三区四区精品| 精品国产一区二区三区久久狼黑人| 日韩美女在线观看一区| 久久久精品免费| 91视频免费网站| 影音先锋欧美在线资源| 久久久久久国产精品三级玉女聊斋| xxav国产精品美女主播| 久久久国产视频91| 欧美极品少妇全裸体| 精品久久久久久电影| 久久91亚洲人成电影网站| 欧美日韩一二三四五区| 亚洲美女免费精品视频在线观看| 在线观看国产精品91|