2015年8月19日 星期三

【Android】Azure Storage 使用介紹

微軟的Azure是一套很強大的雲端平台

Azure提供非常非常多的服務

我們最常使用的包括Web站台、SQL Database、儲存體等等

優點是支援各種語言(Java , Node.js , ASP , php ....等等)好處很多,而且收費便宜

想要使用Azure請先自行去微軟申請,這邊就不多加介紹如何申請了(首次使用免費一個月)

這篇是介紹如何使用Android 操作 Azure儲存體



1.建立Azure儲存體服務


進入你的Azure訂用帳戶,新增儲存體的服務
新增 -> 資料服務 -> 儲存體 -> 快速建立
填寫想要的URL 與 離你最近的位置 與 備份選項


按下建立後,要等一小段時間,好了之後可以看到畫面是這樣子
點選剛剛建立的儲存體進入管理畫面


按下容器 -> 建立容器
填寫名稱 與 存取權限(這邊因為要給Android存取,所以選公用)


好了之後回到儀表板,點選下面的管理存取金鑰
我們要記下2個東東,儲存體帳戶名稱 與 金鑰 (可以先隨便開個記事本把他們複製貼上)



2.回到Android


在gradle內Add Azure Lib



compile 'com.microsoft.azure.android:azure-storage-android:0.5.1'


3.在專案內建立一個AsyncTask


這是用來上傳檔案的Task

CONTAINER_NAME 是你剛剛自己取的
storageConnectionString 要依照格式
AccountName=剛剛複製下來的儲存體帳戶名稱
AccountKey=剛剛複製下來的金鑰



public class FileUploadTask extends AsyncTask {
    //容器名稱
    private static final String CONTAINER_NAME = "my-file";
    //連結字串
    private static final String storageConnectionString =
            "DefaultEndpointsProtocol=http;" +
            "AccountName=my01test01;" +
            "AccountKey=tTP+zfmrUGb6FhiPBW/fRNCrjnfwX1QkJIvLpMp0BpWvFhgGjhlq6Syn5DFGgMjTsvPwhC8GmB6db/jklDpzPw==";
    private ProgressDialog mDialog;
    private File mUploadFile;
    private Context mContext;

    public FileUploadTask(Context context,File uploadFile) {
        mContext = context;
        mUploadFile = uploadFile;
    }

    @Override
    protected void onPreExecute() {
        mDialog = new ProgressDialog(mContext);
        mDialog.setTitle("Tips");
        mDialog.setMessage("Uploading...");
        mDialog.setCancelable(false);
        mDialog.show();
        super.onPreExecute();
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        boolean status;
        try {
            CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
            CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
            CloudBlobContainer container = blobClient.getContainerReference(CONTAINER_NAME);
            container.createIfNotExists();

            String blobName = System.currentTimeMillis()+".txt";
            CloudBlockBlob blockBlob = container.getBlockBlobReference(blobName);
            blockBlob.upload(new FileInputStream(mUploadFile), mUploadFile.length());
            status = true;
        } catch (Exception e) {
            status = false;
        }
        return status;
    }

    @Override
    protected void onPostExecute(Boolean status) {
        if (status == true) {
            Toast.makeText(mContext,"檔案上傳成功", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(mContext,"檔案上傳失敗", Toast.LENGTH_SHORT).show();
        }
        mDialog.cancel();
        super.onPostExecute(status);
    }
}


4.主畫面與測試


在Activity裡面就一個Button,layout就不貼了
按下後產生一個檔案並上傳



public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button = (Button)findViewById(R.id.button1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    //在Cache內產生檔案
                    String fileContent = "現在時間="+System.currentTimeMillis();
                    File saveFile = new File(MainActivity.this.getCacheDir(),"Test.txt");
                    FileOutputStream outStream = new FileOutputStream(saveFile);
                    outStream.write(fileContent.getBytes());
                    outStream.close();

                    //上傳
                    FileUploadTask fileUploadTask = new FileUploadTask(MainActivity.this,saveFile);
                    fileUploadTask.execute();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
    }
}


5.完成了!來看效果吧


按下按鈕後,跳出Dialog,結束後顯示Toast提示


回到Azure管理平台看看,果然上傳一個檔案了


將檔案下載下來,裡面的內容無誤