什么是AppGallery Connect云存储服务?

AppGallery Connect(简称AGC)云存储服务专为开发者打造的可伸缩、免维护的云端存储服务,通过集成云存储SDK,您可以将图片、音频、视频或其他由用户生成的内容存储到云端和从云端下载回本地。

您将建立什么?

在本次Codelab中,您将建立一个集成云存储能力的应用,该应用具备通过调用API接口上传和下载文件的功能。

您将会学到什么

您需要什么?

开发环境及技能要求:

运行终端要求:

集成AGC云存储服务,需要完成以下准备工作

具体操作,请按照《AppGallery Connect集成准备》中详细说明来完成。

开通云存储服务

集成Cloud Storage SDK前需要开通云存储服务,具体步骤如下:

  1. 登录AppGallery Connect网站,点击"我的项目"。
  2. 在项目列表中选择您需要开通云存储服务的项目。
  3. 选择"构建 > 云存储",进入云存储页面,点击"立即开通"。
  4. 在引导界面输入存储实例名称和选择"数据存储位置"。
  5. 点击"下一步",进入默认安全策略设置界面。
  6. 点击"完成"。

集成Cloud Storage SDK

针对Android Studio开发环境,开发前需集成Cloud Storage SDK到您的Android Studio项目中。

  1. 登录AppGallery Connect网站,点击"我的项目"。
  2. 在项目列表中选择您的项目。
  3. 选择常规页签下"应用"区域,下载"agconnect-services.json"配置文件。
  4. 将"agconnect-services.json"文件拷贝到应用级根目录下。
  5. 打开Android Studio应用级build.gradle文件,添加如下代码集成Cloud Storage SDK。
    dependencies { // 配置如下地址 // 添加存储依赖时,先添加依赖AGC框架的相关依赖 implementation 'com.huawei.agconnect:agconnect-storage:1.3.1.100' }
  6. 点击界面上的"Sync Now"链接同步已完成的配置。
  1. 本次Codelab中您可以在Android Studio工程中创建一个布局页面,新增六个Button和一个TextView。
    <?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="getFileMetadata" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAllCaps="false" android:text="Get FileMetadata" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="updateFileMetadata" android:text="get DownloadUrl" android:textAllCaps="false" /> <Button android:onClick="getFileList" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAllCaps="false" android:text="Get FileList" /> <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>
  2. 新增的六个Button和一个TextView的功能分别为:
    • 可触发上传文件的按钮
    • 可触发下载文件的按钮
    • 可触发获取对象元数据的按钮
    • 可触发更新对象元数据的按钮
    • 可触发获取对象列表的按钮
    • 可触发删除文件的按钮
    • 展示上述六个按钮触发请求获取的结果
  3. 可参照下图进行UI设计。

本次Codelab中示例代码采用的匿名登录模式,因此在工程配置前需要在AGC管理台启用AGC认证服务的匿名帐号功能,否则登录失败。

  1. 登录AppGallery Connect网站,选择"我的项目"。
  2. 在项目列表中找到您的项目。
  3. 点击"构建 > 认证服务",进入认证服务的页面。如果首次使用认证服务,请点击"立即开通"开通服务。
  4. 进入"认证服务"界面后,选择"认证方式"标签,点击"匿名登录"对应"操作"列的"启用"。
  5. 在应用级gradle文件中(通常在app/build.gradle)添加AGConnect Auth的编译依赖配置:
    implementation 'com.huawei.agconnect:agconnect-core:1.4.2.301' implementation 'com.huawei.agconnect:agconnect-auth:1.4.2.301'
  6. 在AndroidManifest.xml文件中添加相应权限:
    <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" />
  7. 在MainActivity 的OnCreate里完成权限申请相关方法的调用,示例代码如下:
    private String[] permissions = { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, }; ActivityCompat.requestPermissions(this, permissions, 1);
  8. 在MainActivity 的OnCreate里完成认证服务相关方法的调用,匿名认证的示例代码如下(在验证云存储相关功能之前,请确保匿名登录成功):
    private void login() { if (AGConnectAuth.getInstance().getCurrentUser() != null) { System.out.println("already sign a user"); return; } AGConnectAuth.getInstance().signInAnonymously().addOnSuccessListener(signInResult -> System.out.println("AGConnect OnSuccess")) .addOnFailureListener(e -> System.out.println("AGConnect OnFail: " + e.getMessage())); }

本次Codelab中您可以调用Cloud Storage SDK的相关API进行相应功能点开发,详见如下:

初始化

在应用客户端使用云存储功能前,需调用AGCStorageManagement.getInstance初始化存储实例。

private void initAGCStorageManagement() { mAGCStorageManagement = AGCStorageManagement.getInstance(); }

上传文件

点击"Upload File"按钮触发调用uploadFile方法可以将文件上传到云端。

public void uploadFile(View view) { if (mAGCStorageManagement == null) { initAGCStorageManagement(); } uploadFile(); } private void uploadFile() { 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; } new Thread(new Runnable() { @Override public void run() { 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!"); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }

(在工程代码中配置了指定的上传的文件:在手机的内部存储AGCSDK目录下的test.jpg文件)

下载文件

点击"Download File"按钮触发调用downloadFile方法可以将刚才上传的文件从云端下载回本地,该文件默认保存在上传的目录中,名称采用download_{timestamp}.png的格式保存。

public void downloadFile(View view) { if (mAGCStorageManagement == null) { initAGCStorageManagement(); } downloadFile(); } private void downloadFile() { String fileName = "download_" + System.currentTimeMillis() + ".jpg"; final String path = "test.jpg"; String agcSdkDirPath = getAGCSdkDirPath(); final File file = new File(agcSdkDirPath, fileName); new Thread(new Runnable() { @Override public void run() { 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!"); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }

文件元数据操作

  1. 点击"Get FileMetadata"按钮触发调用getFileMetadata方法可以获取文件的元数据。
    public void getFileMetadata(View view) { if (mAGCStorageManagement == null) { initAGCStorageManagement(); } getFileMetadata(); } private void getFileMetadata() { final String path = "test.jpg"; new Thread(new Runnable() { @Override public void run() { StorageReference storageReference = mAGCStorageManagement.getStorageReference(path); Task<FileMetadata> fileMetadataTask = storageReference.getFileMetadata(); try { fileMetadataTask.addOnSuccessListener(new OnSuccessListener<FileMetadata>() { @Override public void onSuccess(FileMetadata metadata) { mShowResultTv.setText("getfilemetadata success!"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { mShowResultTv.setText("getfilemetadata failure!"); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
  2. 点击"Update FileMetadata"按钮触发调用updateFileMetadata方法修改文件的元数据。
    public void updateFileMetadata(View view) { if (mAGCStorageManagement == null) { initAGCStorageManagement(); } updateFileMetadata(); } private void updateFileMetadata() { final String path = "test.jpg"; new Thread(new Runnable() { @Override public void run() { FileMetadata fileMetadata = initFileMetadata(); StorageReference storageReference = mAGCStorageManagement.getStorageReference(path); Task<FileMetadata> fileMetadataTask = storageReference.updateFileMetadata(fileMetadata); try { fileMetadataTask.addOnSuccessListener(new OnSuccessListener<FileMetadata>() { @Override public void onSuccess(FileMetadata metadata) { mShowResultTv.setText("updatefilemetadata success!"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { mShowResultTv.setText("updatefilemetadata failure!"); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }

获取文件列表

点击"Get FileList"按钮触发调用getFileList方法可以从云端获取文件列表。

public void getFileList(View view) { if (mAGCStorageManagement == null) { initAGCStorageManagement(); } getFileList(); } private void getFileList() { final String path = "test.jpg"; new Thread(new Runnable() { @Override public void run() { StorageReference storageReference = mAGCStorageManagement.getStorageReference(path); Task<ListResult> listResultTask = null; listResultTask = storageReference.list(100); try { listResultTask.addOnSuccessListener(new OnSuccessListener<ListResult>() { @Override public void onSuccess(ListResult listResult) { mShowResultTv.setText("getfilelist success!"); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(Exception e) { mShowResultTv.setText("getfilelist failure!"); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }

删除文件

点击"Delete File"按钮触发调用deleteFile方法可以将刚才上传的文件从云端删除。

public void deleteFile(View view) { if (mAGCStorageManagement == null) { initAGCStorageManagement(); } deleteFile(); } private void deleteFile() { final String path = "test.jpg"; System.out.println(String.format("path=%s", path)); new Thread(new Runnable() { @Override public void run() { 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!"); } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
  1. OnCreate中相关方法:
    @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. 初始化metadata的initFileMetadata方法
    private FileMetadata initFileMetadata() { FileMetadata metadata = new FileMetadata(); metadata.setContentType("image/*"); metadata.setCacheControl("no-cache"); metadata.setContentEncoding("identity"); metadata.setContentDisposition("inline"); metadata.setContentLanguage("en"); return metadata; }
  3. 获取文件路径getAGCSdkDirPath方法
    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; }

AGC的云存储服务提供可视化的文件管理和数据分析功能。

  1. 登录AppGallery Connect网站,点击"我的项目"。
  2. 在项目列表中找到您的项目。
  3. 选择"构建 > 云存储",进入云存储页面,可进行文件管理,包括上传、查看、下载、删除文件等。
  4. 点击"用量统计"页签,还可以查看云存储用量统计情况。页面展示当前存储实例下的存储用量、对象数量、网络流量和请求数。您可以在页面右上角选择需要查看数据的时间段(当天、昨天、过去7天、过去30天)。

祝贺您,您已经成功地构建了您的第一个集成AGC Cloud Storage的应用程序,并学到了如何在AGC控制台对Cloud Storage进行管理。

AGC Cloud Storage的相关API介绍请参见云存储API参考
本Codelab中所用demo源码下载地址如下:

源码下载

已复制代码