android開發之用阿里雲OSS載入圖片
阿新 • • 發佈:2019-01-06
概要
阿里雲物件儲存(Object Storage Service,簡稱OSS),是阿里雲對外提供的海量,安全,低成本,高可靠的雲端儲存服務。使用者可以通過呼叫API,在任何應用、任何時間、任何地點上傳和下載資料,也可以通過使用者Web控制檯對資料進行簡單的管理。OSS適合存放任意檔案型別,適合各種網站、開發企業及開發者使用。當然,如果您找到了這篇文章相信您已經知道是什麼了,那麼廢話少說,這裡提出一些關於Android開發的小經驗,幫助您快速入門
問題目錄
從這裡開始
首先我們要進行開發,一定是要開發者文件的 ~ 若您還沒有註冊OSS服務則請在您的阿里雲賬號上找到如下位置註冊即可註冊了之後您要了解如下資訊,以便我們程式碼的編寫 1、點選進入bucket時您的bucket名稱 2、進入Bucket概覽裡找到您的外網域名 3、進入Object管理裡面檢視並修改您的檔案目錄
4、在這裡獲得AccessKeys(因為假如您給bucket設定了讀寫許可權的話AccessKey就相當於一個通行證,可以在您的程式裡自由讀寫訪問bucket)
程式碼編寫
如果以上任務都完成了的話~就讓我們開始吧 因為OSS我們並不熟悉,而我們往往會很急著用,所以……拿來用!! 這裡貼出資源路徑: http://download.csdn.net/detail/baidu_25537855/9517304 免費的,隨便下=w= 程式碼下載下來相信您已經明白了一大半 這裡詳細解釋一下各個引數:
當把這個各引數配置好配置對了之後相信就可以執行試試咯,你會發現檔案已經成功傳輸和下載// 執行sample前需要配置以下欄位為有效的值 private static final String endpoint = "oss-cn-city.aliyuncs.com"; //這個是外網域名的後半部分(外網域名 = bucket.endpoint) private static final String accessKeyId = "這個不能讓你們看你們也能找到"; private static final String accessKeySecret = "這個也是"; private static final String uploadFilePath = Environment.getExternalStorageDirectory().getPath()+"/test/testByLyfsForOSS.txt"; //這個路徑是你要上傳的檔案的路徑(本地) private static final String testBucket = "這個就是bucket"; private static final String uploadObject = "images/TestByLyfsForOSS2.txt"; //這個是你要上傳到OSS的檔案路徑,加入想上傳到資料夾則前面加上****/****形式的路徑即可 private static final String downloadObject = "images/TestByLyfsForOSS.txt"; // 同理,從OSS上下載的路徑
用OSS下載圖片
將檔案目錄下的 作為外部模組匯入你的相關工程,再把測試檔案裡除了MainActivity的其他檔案匯入進來貼上到你的工程裡如圖然後就可以在你想要呼叫的Activity裡呼叫相關的方法了!! 但是怎麼進行圖片的上傳下載呢?這裡僅以下載為例進行分析,如有上傳有困難的請評論或者私信 這裡我們稍微修改了一下OSS提供的內部程式碼來達成我們的目的
原API給的方法是在這個方法裡進行一個非同步任務來完成下載,我們只要把獲得的位元組流拼裝之後轉換成相應的檔案即可,但是我們要在程式裡用,所以這裡用了一個蹩腳的方法:迴圈判定直到我們想要的位元組流不再為空則返回public byte[] asyncGetObjectSample() { GetObjectRequest get = new GetObjectRequest(testBucket, testObject); OSSAsyncTask task = oss.asyncGetObject(get, new OSSCompletedCallback<GetObjectRequest, GetObjectResult>() { @Override public void onSuccess(GetObjectRequest request, GetObjectResult result) { // 請求成功 InputStream inputStream = result.getObjectContent(); byte[] buffer = new byte[2048]; ByteArrayOutputStream outStream = new ByteArrayOutputStream(); int len; try { while ((len = inputStream.read(buffer)) != -1) { // 處理下載的資料 outStream.write(buffer, 0, len); Log.d("asyncGetObjectSample", "read length: " + len); } outStream.flush(); imageByteArray = outStream.toByteArray(); outStream.close(); Log.d("asyncGetObjectSample", "download success."); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(GetObjectRequest request, ClientException clientExcepion, ServiceException serviceException) { // 請求異常 if (clientExcepion != null) { // 本地異常如網路異常等 clientExcepion.printStackTrace(); } if (serviceException != null) { // 服務異常 Log.e("ErrorCode", serviceException.getErrorCode()); Log.e("RequestId", serviceException.getRequestId()); Log.e("HostId", serviceException.getHostId()); Log.e("RawMessage", serviceException.getRawMessage()); } } }); while (imageByteArray == null) { } return imageByteArray; }
這裡比較重要的程式碼單獨貼出來
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int len;
try {
while ((len = inputStream.read(buffer)) != -1) {
// 處理下載的資料
outStream.write(buffer, 0, len);
Log.d("asyncGetObjectSample", "read length: " + len);
}
outStream.flush();
imageByteArray = outStream.toByteArray();
outStream.close();
這樣就可以在imageByteArray
裡獲得最終下載完成的位元組陣列並進行相關的處理了new Thread(new Runnable() {
@Override
public void run() {
imgv_header_pic = BitmapUtils.getPicFromBytes(new GetObjectSamples(NetWorkUtils.oss, Data.testBucket, Data.downloadObject).asyncGetObjectSample(),null);
handler.sendEmptyMessage(HANDLER_BANNER_PIC);
}
}).start();
我們通過
BitmapUtils.getPicFromByte()
方法將位元組陣列轉換成圖片,這個方法的程式碼為
public static Bitmap getPicFromBytes(byte[] bytes,BitmapFactory.Options opts)
{
Log.e("lyfsInBitmap","begin");
if (bytes != null) {
if (opts != null) {
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opts);
} else {
Log.e("lyfsInBitmap", bytes.toString());
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
}else {
Log.e("lyfsInBitmap","bad");
}
return null;
}
如果沒有剛才我們運用的那個蹩腳的while迴圈的話這裡傳來的位元組陣列將為空
這樣我們就將圖片成功的載入下來了,可喜可賀!!
最後呼叫你的handler進行介面處理就好了
有相關OSS的問題歡迎討論~程式猿要對自己好一點,願你在程式的世界裡呼風喚雨,成為一個大俠=w=好吧,我承認程式設計師的修真小說看多了,大家早點休息,晚安~