1. 程式人生 > >android開發之用阿里雲OSS載入圖片

android開發之用阿里雲OSS載入圖片

概要

阿里雲物件儲存(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提供的內部程式碼來達成我們的目的
 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;
    }
原API給的方法是在這個方法裡進行一個非同步任務來完成下載,我們只要把獲得的位元組流拼裝之後轉換成相應的檔案即可,但是我們要在程式裡用,所以這裡用了一個蹩腳的方法:迴圈判定直到我們想要的位元組流不再為空則返回

這裡比較重要的程式碼單獨貼出來
 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=好吧,我承認程式設計師的修真小說看多了,大家早點休息,晚安~