【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能_第1頁
【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能_第2頁
【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能_第3頁
【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能_第4頁
【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】Android如何實現(xiàn)頭像上傳功能

這篇文章將為大家詳細講解有關Android如何實現(xiàn)頭像上傳功能,在下覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。效果圖首先看上傳圖片的工具類,一點都沒有少復制就可以用**

*

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";

//

內(nèi)容類型

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

在網(wǎng)頁上<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

在網(wǎng)頁上<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

=

"";

/***

*

以下是用于上傳參數(shù)

*/

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,

"上傳結(jié)果:"

+

result);

return;

}

else

{

Log.e(TAG,

"request

error"

+

res);

sendMessage(UPLOAD_SERVER_ERROR_CODE,

"上傳失?。篶ode="

+

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;

}

}

/**

*

發(fā)送上傳結(jié)果

*

*

@param

responseCode

*

@param

responseMessage

*/

private

void

sendMessage(int

responseCode,

String

responseMessage)

{

onUploadProcessListener.onUploadDone(responseCode,

responseMessage);

}

/**

*

下面是一個自定義的回調(diào)函數(shù),用到回調(diào)上傳文件是否完成

*

*

@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轉(zhuǎn)換成文件

*

保存文件

*

*

@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));

press(Bitmap.CompressFormat.JPEG,

80,

bos);

bos.flush();

bos.close();

return

myCaptureFile;

}

}從相冊獲取圖片的方法/**

*

從相冊選擇圖片來源

*/

private

void

getPhoto()

{

Intent

intent

=

new

Intent(Intent.ACTION_PICK,

vider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,

"image/*");

startActivityForResult(intent,

PHOTO_REQUEST);

}從系統(tǒng)相機拍照獲取照片/**

*

從系統(tǒng)相機選擇圖片來源

*/

private

void

getCamera()

{

Intent

intent

=

new

Intent(MediaStore.ACTION_IMAGE_CAPTURE);

//

下面這句指定調(diào)用相機拍照后的照片存儲的路徑

intent.putExtra(MediaStore.EXTRA_OUTPUT,

Uri.fromFile(new

File(

Environment.getExternalStorageDirectory(),

"hand.jpg")));

startActivityForResult(intent,

CAMERA_REQUEST);

}調(diào)用系統(tǒng)裁剪工具裁剪圖片/****

*

調(diào)用系統(tǒng)自帶切圖工具對圖片進行裁剪

*

微信也是

*

*

@param

uri

*/

private

void

photoClip(Uri

uri)

{

//

調(diào)用系統(tǒng)中自帶的圖片剪裁

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);

//設置監(jiān)聽器監(jiān)聽上傳狀態(tài)

Map<String,

String>

params

=

new

HashMap<String,

String>();//上傳map對象

params.put("userId",

"");

uploadUtil.uploadFile(filepath,

fileKey,

"上傳頭像的地址",

params);

Toast.makeText(this,

"上傳成功",

Toast.LENGTH_LONG).show();

}重新服務器響應方法/**

*

上傳服務器響應回調(diào)

*/

@Override

public

void

onUploadDone(int

responseCode,

String

message)

{

//上傳完成響應

pd.dismiss();

Message

msg

=

Message.obtain();

msg.what

=

UPLOAD_FILE_DONE;

msg.arg1

=

responseCode;

msg.obj

=

message;

}

@Override

public

void

onUploadProcess(int

uploadSize)

{

//上傳中

Message

msg

=

Message.obtain();

msg.what

=

UPLOAD_IN_PROCESS;

msg.arg1

=

uploadSize;

}

@Override

public

void

initUpload(int

fileSize)

{

//準備上傳

Message

msg

=

Message.obtain();

msg.what

=

UPLOAD_INIT_PROCESS;

msg.arg1

=

fileSize;

}重寫這些方法需要實現(xiàn)接口public

class

MainActivity

extends

AppCompatActivity

implements

View.OnClickListener,

Uploa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論