国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > 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, "上傳失敗:error=" + e.getMessage());  e.printStackTrace();  return; } catch (IOException e) {  sendMessage(UPLOAD_SERVER_ERROR_CODE, "上傳失敗:error=" + 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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安顺市| 元江| 中方县| 教育| 枣强县| 南乐县| 科技| 乐业县| 临漳县| 清流县| 湘西| 台前县| 余干县| 远安县| 黔西| 房山区| 甘谷县| 常宁市| 光泽县| 离岛区| 古交市| 行唐县| 万源市| 庆安县| 铜山县| 惠州市| 阿拉尔市| 佳木斯市| 宜兴市| 托里县| 卢龙县| 屏边| 六枝特区| 武强县| 和硕县| 鄯善县| 赤峰市| 莱阳市| 广昌县| 启东市| 义乌市|