什么是AppGallery Connect云存储服务?

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

您将建立什么?

在本次Codelab中,您将建立一个集成云存储能力的应用,该应用具备如下功能:

您将会学到什么?

开发环境及技能要求

运行终端要求

准备一台Android设备,必须为Android 4.2及以上版本。

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

开通云存储服务

集成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。
    // 配置如下地址 apply plugin: 'com.huawei.agconnect' dependencies { // 添加存储依赖时,先添加依赖AGC框架的相关依赖 implementation 'com.huawei.agconnect:agconnect-storage:1.5.0.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="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的功能分别为:
    • Upload File:可触发上传文件的按钮。
    • Delete File:可触发删除文件的按钮。
    • 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.6.5.300' implementation 'com.huawei.agconnect:agconnect-auth:1.6.5.300'
  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 does 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文件)

删除文件

点击"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. 用于获取文件路径的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; }
  1. 运行Android Studio工程生成APK包,并在测试手机中安装APK包。
  2. 打开安装的APK包,点击"Upload File"按钮,上传手机本地的"test.jpg"文件。
  3. 进入云存储页面,在"文件"页签查看上传的文件。
  4. 单击"Delete File"按钮,删除已上传的"test.jpg"文件,进入"云存储 > 文件"页面,可查看到文件已被删除。

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

Code copied