




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】怎么在Android中利用Oss上傳圖片
這篇文章給大家介紹怎么在Android中利用Oss上傳圖片,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。Androidstudio添加依賴dependencies
{
compile
'com.aliyun.dpa:oss-android-sdk:2.4.5'
compile
'com.squareup.okhttp3:okhttp:3.4.1'
compile
'com.squareup.okio:okio:1.9.0'
}直接引入jar包(對Androidstudio或者Eclipse都適用)1.在官網(wǎng)下載sdk包2.解壓后得到j(luò)ar包,目前包括aliyun-oss-sdk-android-x.x.x.jar、okhttp-3.x.x.jar和okio-1.x.x.jar3.將以上3個jar包導(dǎo)入libs目錄權(quán)限設(shè)置確保AndroidManifest.xml文件中已經(jīng)配置了這些權(quán)限,否則,SDK將無法正常工作。<uses-permission
android:name="android.permission.INTERNET"></uses-permission>
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>混淆設(shè)置-keep
class
com.alibaba.sdk.android.oss.**
{
*;
}
-dontwarn
okio.**
-dontwarn
mons.codec.binary.**實現(xiàn)過程首先為了安全起見,采用的是STS鑒權(quán)模式,則要用到的數(shù)據(jù)都是從后臺獲得然后應(yīng)用到前臺的。1.創(chuàng)建OSSClient(自己在這里命名為OssService)OSSClient為OSS服務(wù)的Android客戶端,它為調(diào)用者提供了一系列的方法,可以用來操作,管理存儲空間(bucket)和文件(object)等。public
class
OssService
{
private
OSS
oss;
private
String
bucket;
private
picResultCallback
callback;//回調(diào)接口
private
String
path=地址(后臺告訴);
public
OssService(OSS
oss,
String
bucket,picResultCallback
callback)
{
this.oss
=
oss;
this.bucket
=
bucket;
this.callback=callback;
}
/**object字段為圖片的上傳地址(具體地址的前綴后端給,這個是拼起
*來的一個路徑)
*localFile圖片的本地地址
*mProgress
進度條
*img
顯示圖片的控件
*type
類型
*/
public
void
asyncPutImage(String
object,
final
String
localFile,
final
ProgressBar
mProgress,
final
ImageView
img,String
type)
{
if
(object.equals(""))
{
Log.w("AsyncPutImage",
"ObjectNull");
return;
}
File
file
=
new
File(localFile);
if
(!file.exists())
{
Log.w("AsyncPutImage",
"FileNotExist");
Log.w("LocalFile",
localFile);
return;
}
//
構(gòu)造上傳請求
PutObjectRequest
put
=
new
PutObjectRequest(bucket,
object,
localFile);
put.setCallbackParam(new
HashMap<String,
String>()
{
{
put("callbackUrl",
path);
put("callbackBody",
"filename=${object}&size=${size}&id=${x:id}&action=${x:action}");
///document_detail/31989.html?spm=5176.doc31984.6.883.brskVg
}
});
HashMap<String,
String>
hashMap=new
HashMap<>();
hashMap.put("x:id",id);
hashMap.put("x:action",type);
put.setCallbackVars(hashMap);
//
異步上傳時可以設(shè)置進度回調(diào)
put.setProgressCallback(new
OSSProgressCallback<PutObjectRequest>()
{
@Override
public
void
onProgress(PutObjectRequest
request,
long
currentSize,
long
totalSize)
{
int
progress
=
(int)
(100
*
currentSize
/
totalSize);
mProgress.setProgress(progress);
}
});
OSSAsyncTask
task
=
oss.asyncPutObject(put,
new
OSSCompletedCallback<PutObjectRequest,
PutObjectResult>()
{
@Override
public
void
onSuccess(PutObjectRequest
request,
final
PutObjectResult
result)
{
Observable.just(result).observeOn(AndroidSchedulers.mainThread()).subscribe(new
Action1<PutObjectResult>()
{
@Override
public
void
call(PutObjectResult
putObjectResult)
{
mProgress.setVisibility(View.GONE);
img.setColorFilter(null);
callback.getPicData(result,localFile);
}
});
}
@Override
public
void
onFailure(PutObjectRequest
request,
ClientException
clientExcepion,
ServiceException
serviceException)
{
String
info
=
"";
//
請求異常
if
(clientExcepion
!=
null)
{
//
本地異常如網(wǎng)絡(luò)異常等
clientExcepion.printStackTrace();
info
=
clientExcepion.toString();
}
if
(serviceException
!=
null)
{
//
服務(wù)異常
Log.e("ErrorCode",
serviceException.getErrorCode());
Log.e("RequestId",
serviceException.getRequestId());
Log.e("HostId",
serviceException.getHostId());
Log.e("RawMessage",
serviceException.getRawMessage());
info
=
serviceException.toString();
}
}
});
}
//成功的回調(diào)接口
public
interface
picResultCallback
{
void
getPicData(PutObjectResult
data,String
oldPath);
}
}2.實現(xiàn)OssService的方法(在activity中)public
OssService
initOSS(String
endpoint,
String
bucket)
{
OSSCredentialProvider
credentialProvider;
credentialProvider
=
new
STSGetter(tokenBean);
//設(shè)置網(wǎng)絡(luò)參數(shù)
ClientConfiguration
conf
=
new
ClientConfiguration();
conf.setConnectionTimeout(15
*
1000);
//
連接超時,默認15秒
conf.setSocketTimeout(15
*
1000);
//
socket超時,默認15秒
conf.setMaxConcurrentRequest(5);
//
最大并發(fā)請求書,默認5個
conf.setMaxErrorRetry(2);
//
失敗后最大重試次數(shù),默認2次
OSS
oss
=
new
OSSClient(getApplicationContext(),
endpoint,
credentialProvider,
conf);
return
new
OssService(oss,
bucket,
this);
}3.重載OSSFederationCredentialProvider生成自己的獲取STS的功能(一般自動獲得token寫在這里,在getFederationToken()方法中,告訴它你獲得token的規(guī)則即可)1>官方demo代碼(自動更新token)public
class
OSSAuthCredentialsProvider
extends
OSSFederationCredentialProvider
{
private
String
mAuthServerUrl;
private
AuthDecoder
mDecoder;
public
OSSAuthCredentialsProvider(String
authServerUrl)
{
this.mAuthServerUrl
=
authServerUrl;
}
/**
*
set
auth
server
url
*
@param
authServerUrl
*/
public
void
setAuthServerUrl(String
authServerUrl)
{
this.mAuthServerUrl
=
authServerUrl;
}
/**
*
set
response
data
decoder
*
@param
decoder
*/
public
void
setDecoder(AuthDecoder
decoder)
{
this.mDecoder
=
decoder;
}
@Override
public
OSSFederationToken
getFederationToken()
throws
ClientException
{
OSSFederationToken
authToken;
String
authData;
try
{
URL
stsUrl
=
new
URL(mAuthServerUrl);
HttpURLConnection
conn
=
(HttpURLConnection)
stsUrl.openConnection();
conn.setConnectTimeout(10000);
InputStream
input
=
conn.getInputStream();
authData
=
IOUtils.readStreamAsString(input,
OSSConstants.DEFAULT_CHARSET_NAME);
if
(mDecoder
!=
null)
{
authData
=
mDecoder.decode(authData);
}
JSONObject
jsonObj
=
new
JSONObject(authData);
int
statusCode
=
jsonObj.getInt("StatusCode");
if
(statusCode
==
200)
{
String
ak
=
jsonObj.getString("AccessKeyId");
String
sk
=
jsonObj.getString("AccessKeySecret");
String
token
=
jsonObj.getString("SecurityToken");
String
expiration
=
jsonObj.getString("Expiration");
authToken
=
new
OSSFederationToken(ak,
sk,
token,
expiration);
}
else
{
String
errorCode
=
jsonObj.getString("ErrorCode");
String
errorMessage
=
jsonObj.getString("ErrorMessage");
throw
new
ClientException("ErrorCode:
"
+
errorCode
+
"|
ErrorMessage:
"
+
errorMessage);
}
return
authToken;
}
catch
(Exception
e)
{
throw
new
ClientException(e);
}
}
public
interface
AuthDecoder
{
String
decode(String
data);
}
}2>自己的代碼(因為自己的所有數(shù)據(jù)都是從后臺獲得的,而且結(jié)合rxjava沒有想到可以返回數(shù)據(jù)的方式,所以采用手動更新token的方式)手動更新token的具體操作:首先token的值存在MyApp中,第一次在進入需要用到token界面時候,先獲得token的值更新MyApp中的值并記錄當下的時間,如果下次再次進入任何一個需要用到token的界面的時候,則判斷時間是否過期,過期則重新請求token更新token的值。public
class
STSGetter
extends
OSSFederationCredentialProvider
{
private
OSSFederationToken
ossFederationToken;
String
ak;
String
sk;
String
token
;
String
expiration
;
public
STSGetter(TokenBean
bean)
{
this.ak
=
bean.getCredentials().getAccessKeyId();
this.sk
=
bean.getCredentials().getAccessKeySecret();
this.token
=
bean.getCredentials().getS
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 華東師范大學《風景園林設(shè)計實驗古典園林景觀設(shè)計》2023-2024學年第二學期期末試卷
- 武漢工程大學郵電與信息工程學院《立體設(shè)計》2023-2024學年第二學期期末試卷
- 南京師范大學泰州學院《大學美育》2023-2024學年第二學期期末試卷
- 南昌航空大學《電路(下)》2023-2024學年第二學期期末試卷
- 河南檢察職業(yè)學院《造型基礎(chǔ)(工設(shè))》2023-2024學年第二學期期末試卷
- 河源廣東河源紫金縣專門學校駐校教官招聘7人筆試歷年參考題庫附帶答案詳解
- 山東農(nóng)業(yè)大學《組成原理與接口技術(shù)》2023-2024學年第二學期期末試卷
- 山西體育職業(yè)學院《聯(lián)合創(chuàng)作預(yù)案》2023-2024學年第二學期期末試卷
- 中國礦業(yè)大學(北京)《基礎(chǔ)造型》2023-2024學年第二學期期末試卷
- 河南2025年河南省工業(yè)學校招聘20人筆試歷年參考題庫附帶答案詳解-1
- SH∕T 3097-2017 石油化工靜電接地設(shè)計規(guī)范
- 基礎(chǔ)構(gòu)成設(shè)計全套教學課件
- Python程序設(shè)計基礎(chǔ)PPT(本科)完整全套教學課件
- (全國通用)三甲人民醫(yī)院診斷證明書請假條模板(廣東佛山)
- 表面工程學課件-全
- 《XX醫(yī)院安寧療護建設(shè)實施方案》
- 電源線檢驗報告RVV
- 體育訓練隊隊規(guī)
- 八字命理漫畫版
- 電梯工程開工報告(直梯)(共1頁)
- 復(fù)件德力西質(zhì)量獎自評報告2戰(zhàn)略
評論
0/150
提交評論