zoukankan      html  css  js  c++  java
  • 快速集成华为AGC云存储服务-Android

    华为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状态,我是发了邮件申请开通才可以使用的:

    https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-apply

    我的项目 下选择你的开发项目,在构建下面,找到云存储服务,点击开通:

    没有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控制台,可以简单直观的对服务器上的文件进行管理。

    这个云存储服务,除了最普通的上传下载和删除功能,还包括有列举文件,设置元数据等功能,具体可以看官方文档:

    云存储服务开发指南:

    https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-introduction

    云存储codelab:

    https://developer.huawei.com/consumer/cn/codelab/CloudStorage/index.html#1


    原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0201411971207960391?fid=0101271690375130218

    原作者:Mayism

  • 相关阅读:
    'Undefined symbols for architecture i386,clang: error: linker command failed with exit code 1
    The codesign tool requires there only be one 解决办法
    XCode iOS project only shows “My Mac 64bit” but not simulator or device
    Provisioning profile XXXX can't be found 的解决办法
    UIView 中的控件事件穿透 Passthrough 的实现
    Xcode4.5出现时的OC新语法
    xcode 快捷键(持续更新)
    打越狱包
    php缓存与加速分析与汇总
    浏览器的判断
  • 原文地址:https://www.cnblogs.com/developer-huawei/p/14431609.html
Copyright © 2011-2022 走看看