華為AppGallery Connect提供了一個雲存儲(CloudStorage)的服務,號稱提供了一個便捷的雲端存儲服務,應用開發者使用的時候,可以不用關注服務器的部署,直接使用就行。
目前這個功能還在bate階段,我先搶先體驗了一下。如果你想快速體驗雲存儲服務的功能,請參考demo。
1、環境與應用信息
版本名稱 | 集成環境 | 測試設備 |
---|---|---|
agconnect-storage:1.3.1.100 | Android Studio | 榮耀Magic 2 |
AGC地址:https://developer.huawei.com/consumer/cn/service/josp/agc/index.html
SDK集成方式:Maven倉集成,對接華為Maven倉:
implementation 'com.huawei.agconnect:agconnect-storage:1.3.1.100'
2、在AGC上開通雲存儲:
PS: 雲存儲服務目前還處於beta狀態,我是發了郵件申請開通才可以使用的:
在我的項目 下選擇你的開發項目,在構建下面,找到雲存儲服務,點擊開通:
沒有Android項目的話,可以先自己創建一個。
開通服務的時候,需要先配置存儲實例,這里按需配置就可以,我就隨便配置一個。
下一步,還需要配置安全策略,這里使用默認的安全策略就好:
PS:默認的情況是,只有經過身份認證的用戶才能進行讀寫。
3、在Android項目里集成SDK
a) 集成SDK
1、在項目級的gradle文件中添加華為Maven,配置如下內容
buildscript {
repositories {
//…
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
//…
classpath 'com.huawei.agconnect:agcp:1.4.1.300'
}
}
allprojects {
repositories {
//…
maven {url 'https://developer.huawei.com/repo/'}
}
}
2、打開應用級的build.gradle文件,配置好雲存儲的SDK和華為認證服務的SDK,配置下面標紅的內容即可。注意別落了上面的agcp插件。
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
android {…..}
dependencies {
//…
implementation 'com.huawei.agconnect:agconnect-auth:1.4.1.300'
implementation 'com.huawei.agconnect:agconnect-storage:1.3.1.100'
}
b) 下載json文件,並且配置默認存儲實例
1、在AGC界面上,選擇 我的項目 -> 項目設置–> 常規 下面,下載agconnect-services.json文件到你的Android項目的app路徑下。
2、記得查看你的json文件,注意是否有default_storage,如果沒有的話,需要自行添加。
4、前置步驟
1、申請權限
需要先申請文件的讀寫權限和網絡訪問權限,在Mainfest.xml文件里面application的外層,配置下面這些代碼來申請權限:
注意android:allowBackup的參數必須為false。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="false"/>
2、界面布局
設置幾個按鈕,通過點擊按鈕來實現功能:包括上傳,下載文件,和刪除文件的按鈕。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
tools:context=".MainActivity">
<Button
android:onClick="uploadFile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Upload File" />
<Button
android:onClick="downloadFile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Download File" />
<Button
android:onClick="deleteFile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Delete File" />
<TextView
android:id="@+id/showResult"
android:enabled="false"
android:hint="This will display the result of the operation"
android:layout_width="match_parent"
android:layout_marginTop="10dp"
android:gravity="center"
android:layout_height="wrap_content" />
</LinearLayout>
5、功能開發:
1、先初始化參數
在MainActivity,先初始化參數:包括,雲存儲實例,展示消息框,以及相關權限。
private AGCStorageManagement mAGCStorageManagement;
private TextView mShowResultTv;
private String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mShowResultTv = findViewById(R.id.showResult);
AGConnectInstance.initialize(getApplicationContext());
login();
ActivityCompat.requestPermissions(this, permissions, 1);
}
2、相關方法:匿名登錄&獲取路徑
匿名認證方法:對於雲存儲的數據操作,需要經過華為認證服務,這里為了簡化,就僅使用華為的匿名認證:
private void login() {
if (AGConnectAuth.getInstance().getCurrentUser() != null) {
System.out.println("already sign a user");
return;
}
AGConnectAuth.getInstance().signInAnonymously().addOnSuccessListener(new OnSuccessListener<SignInResult>() {
@Override
public void onSuccess(SignInResult signInResult) {
System.out.println("AGConnect OnSuccess");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// onFail
}
});
}
獲取文件路徑的方法:對於雲存儲的數據操作,上傳時候本地文件的獲取,以及雲端文件的下載存放,都是在這個路徑下, 即 /AGCSdk路徑下
private String getAGCSdkDirPath() {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AGCSdk/";
System.out.println("path=" + path);
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
return path;
}
3、初始化雲存儲實例
雲存儲的每一步操作之前,都需要確保已經進行初始化了雲存儲實例
private void initAGCStorageManagement() {
mAGCStorageManagement = AGCStorageManagement.getInstance();
}
4、上傳文件:
需要先獲取到本地文件 ,以及這個文件的路徑,然后創建文件引用,對文件的進行上傳的uploadTask操作。
public void uploadFile(View view) {
if (mAGCStorageManagement == null) {
initAGCStorageManagement();
}
final String path = "test.jpg";
String fileName = "test.jpg";
String agcSdkDirPath = getAGCSdkDirPath();
final File file = new File(agcSdkDirPath, fileName);
if (!file.exists()) {
mShowResultTv.setText("file is not exist!");
return;
}
StorageReference storageReference = mAGCStorageManagement.getStorageReference(path);
UploadTask uploadTask = storageReference.putFile(file);
try {
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.UploadResult>() {
@Override
public void onSuccess(UploadTask.UploadResult uploadResult) {
mShowResultTv.setText("upload success!");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
mShowResultTv.setText("upload failure!" + e.getMessage());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
5、下載文件:
需要先在本地設備中創建該文件,包括這個文件的路徑和文件名。然后創建一個雲端文件名稱的引用,對這個文件的引用的進行下載的downloadTask操作。
public void downloadFile(View view) {
if (mAGCStorageManagement == null) {
initAGCStorageManagement();
}
String fileName = "download_" + System.currentTimeMillis() + ".jpg";
final String path = "test.jpg";
String agcSdkDirPath = getAGCSdkDirPath();
final File file = new File(agcSdkDirPath, fileName);
StorageReference storageReference = mAGCStorageManagement.getStorageReference(path);
DownloadTask downloadTask = storageReference.getFile(file);
try {
downloadTask.addOnSuccessListener(new OnSuccessListener<DownloadTask.DownloadResult>() {
@Override
public void onSuccess(DownloadTask.DownloadResult downloadResult) {
mShowResultTv.setText("download success!");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
mShowResultTv.setText("download failure!" + e.getMessage());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
6、刪除文件:
首先,先指定一個文件名為test.jpg的文件,對這個文件名創建一個引用,然后對該引用執行deleteTask操作,就可以將雲端的test.jpg刪除了。
public void deleteFile(View view) {
if (mAGCStorageManagement == null) {
initAGCStorageManagement();
}
final String path = "test.jpg";
System.out.println(String.format("path=%s", path));
StorageReference storageReference = mAGCStorageManagement.getStorageReference(path);
Task<Void> deleteTask = storageReference.delete();
try {
deleteTask.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mShowResultTv.setText("delete success!");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
mShowResultTv.setText("delete failure!" + e.getMessage());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
6、打包測試:
Android Studio連接手機,然后將該安卓項目運行到手機上。
1、准備好初始文件
打開手機的文件管理器,找到 內部存儲/AGCSdk/ 路徑下,添加並且准備一個test.jpg文件。如下圖所示:
2、上傳文件 & 上傳結果
打開剛剛的應用,點擊Upload File 按鈕,查看上傳結果
此時AGC界面上,也可以看到剛剛上傳的文件:
2、下載文件 & 下載結果
在應用內點擊下載按鈕,可以看到界面顯示 下載成功。
此時回到文件管理器,可以看到剛剛下載的文件。
2、刪除文件 & 刪除結果
點擊應用里面的刪除按鈕,可以看到應用界面上顯示刪除成功。
此時到AGC界面上確認下載結果,發現剛剛的test.jpg文件已經被刪除了
7、總結
僅關注前端應用的開發,就可以開發一個帶雲端存儲服務器的應用。再也不用為了服務器的搭建和運維擔心,省時省力。而且還提供了類似於管理員模式的web控制台,可以簡單直觀的對服務器上的文件進行管理。
這個雲存儲服務,除了最普通的上傳下載和刪除功能,還包括有列舉文件,設置元數據等功能,具體可以看官方文檔:
雲存儲服務開發指南:
雲存儲codelab:
https://developer.huawei.com/consumer/cn/codelab/CloudStorage/index.html#1
原文鏈接:https://developer.huawei.com/consumer/cn/forum/topic/0201411971207960391?fid=0101271690375130218
原作者:Mayism