皇马路亚 發表於 2021-2-22 17:27:00

快速集成华为AGC云存储服务-Android

<p>华为AppGallery Connect提供了一个云存储(CloudStorage)的服务,号称提供了一个便捷的云端存储服务,应用开发者使用的时候,可以不用关注服务器的部署,直接使用就行。</p>
<p>目前这个功能还在bate阶段,我先抢先体验了一下。如果你想快速体验云存储服务的功能,请参考demo。</p>
<h1 id="1环境与应用信息">1、环境与应用信息</h1>
<table>
<thead>
<tr>
<th>版本名称</th>
<th>集成环境</th>
<th>测试设备</th>
</tr>
</thead>
<tbody>
<tr>
<td>agconnect-storage:1.3.1.100</td>
<td>Android Studio</td>
<td>荣耀Magic 2</td>
</tr>
</tbody>
</table>
<p>AGC地址:https://developer.huawei.com/consumer/cn/service/josp/agc/index.html<br>
SDK集成方式:Maven仓集成,对接华为Maven仓:<br>
implementation 'com.huawei.agconnect:agconnect-storage:1.3.1.100'</p>
<h1 id="2在agc上开通云存储">2、在AGC上开通云存储:</h1>
<p>PS: 云存储服务目前还处于beta状态,我是发了邮件申请开通才可以使用的:</p>
<p>https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-apply</p>
<p>在<strong>我的项目</strong> 下选择你的开发项目,在<strong>构建</strong>下面,找到<strong>云存储</strong>服务,点击开通:</p>
<p>没有Android项目的话,可以先自己创建一个。</p>
<p><img src="https://img-blog.csdnimg.cn/20210222143251596.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>开通服务的时候,需要先配置存储实例,这里按需配置就可以,我就随便配置一个。</p>
<p><img src="https://img-blog.csdnimg.cn/20210222143544442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>下一步,还需要配置安全策略,这里使用默认的安全策略就好:<br>
PS:默认的情况是,只有经过身份认证的用户才能进行读写。</p>
<p><img src="https://img-blog.csdnimg.cn/2021022216014525.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h1 id="3在android项目里集成sdk">3、在Android项目里集成SDK</h1>
<h3 id="a-集成sdk">a) 集成SDK</h3>
<p>1、在项目级的gradle文件中添加华为Maven,配置如下内容</p>
<pre><code class="language-java">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/'}
    }
}
</code></pre>
<p>2、打开应用级的<strong>build.gradle</strong>文件,配置好云存储的SDK和华为认证服务的SDK,配置下面标红的内容即可。<strong>注意别落了上面的agcp插件</strong>。</p>
<pre><code class="language-java">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'
}
</code></pre>
<h3 id="b-下载json文件并且配置默认存储实例">b) 下载json文件,并且配置默认存储实例</h3>
<p>1、在AGC界面上,选择 我的项目 -&gt; 项目设置–&gt; 常规 下面,下载agconnect-services.json文件到你的Android项目的app路径下。</p>
<p>2、记得查看你的json文件,注意是否有default_storage,如果没有的话,需要自行添加。</p>
<p><img src="https://img-blog.csdnimg.cn/20210222163858343.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h1 id="4前置步骤">4、前置步骤</h1>
<p>1、申请权限<br>
需要先申请文件的读写权限和网络访问权限,在Mainfest.xml文件里面application的外层,配置下面这些代码来申请权限:</p>
<p>注意android:allowBackup的参数必须为false。</p>
<pre><code class="language-java">&lt;uses-permission android:name="android.permission.INTERNET" /&gt;
&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;
&lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /&gt;
&lt;uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /&gt;
    &lt;application
      android:allowBackup="false"/&gt;
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/20210222163946124.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>2、界面布局<br>
设置几个按钮,通过点击按钮来实现功能:包括上传,下载文件,和删除文件的按钮。</p>
<pre><code class="language-java">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;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"&gt;

    &lt;Button
      android:onClick="uploadFile"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textAllCaps="false"
      android:text="Upload File" /&gt;

    &lt;Button
      android:onClick="downloadFile"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textAllCaps="false"
      android:text="Download File" /&gt;

    &lt;Button
      android:onClick="deleteFile"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textAllCaps="false"
      android:text="Delete File" /&gt;

    &lt;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" /&gt;
   
&lt;/LinearLayout&gt;
</code></pre>
<p><img src="https://img-blog.csdnimg.cn/20210222164024896.png#pic_center"></p>
<h1 id="5功能开发">5、功能开发:</h1>
<p>1、先初始化参数<br>
在MainActivity,先初始化参数:包括,云存储实例,展示消息框,以及相关权限。</p>
<pre><code class="language-java">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);
    }
</code></pre>
<p>2、相关方法:匿名登录&amp;获取路径<br>
匿名认证方法:对于云存储的数据操作,需要经过华为认证服务,这里为了简化,就仅使用华为的<strong>匿名认证</strong>:</p>
<pre><code class="language-java">private void login() {
      if (AGConnectAuth.getInstance().getCurrentUser() != null) {
            System.out.println("already sign a user");
            return;
      }
      AGConnectAuth.getInstance().signInAnonymously().addOnSuccessListener(new OnSuccessListener&lt;SignInResult&gt;() {
            @Override
            public void onSuccess(SignInResult signInResult) {
                System.out.println("AGConnect OnSuccess");
            }
      }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
                // onFail
            }
      });
}
</code></pre>
<p>获取文件路径的方法:对于云存储的数据操作,上传时候本地文件的获取,以及云端文件的下载存放,都是在这个路径下, 即 <strong>/AGCSdk</strong>路径下</p>
<pre><code class="language-java">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;
    }
</code></pre>
<p>3、初始化云存储实例<br>
云存储的每一步操作之前,都需要确保已经进行初始化了云存储实例</p>
<pre><code class="language-java">private void initAGCStorageManagement() {
    mAGCStorageManagement = AGCStorageManagement.getInstance();
}
</code></pre>
<p>4、上传文件:<br>
需要先获取到本地文件 ,以及这个文件的路径,然后创建文件引用,对文件的进行上传的uploadTask操作。</p>
<pre><code class="language-java">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&lt;UploadTask.UploadResult&gt;() {
            @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();
    }
}
</code></pre>
<p>5、下载文件:<br>
需要先在本地设备中创建该文件,包括这个文件的路径和文件名。然后创建一个云端文件名称的引用,对这个文件的引用的进行下载的downloadTask操作。</p>
<pre><code class="language-java">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&lt;DownloadTask.DownloadResult&gt;() {
            @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();
    }
}
</code></pre>
<p>6、删除文件:<br>
首先,先指定一个文件名为test.jpg的文件,对这个文件名创建一个引用,然后对该引用执行deleteTask操作,就可以将云端的test.jpg删除了。</p>
<pre><code class="language-java">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&lt;Void&gt; deleteTask = storageReference.delete();
      try {
            deleteTask.addOnSuccessListener(new OnSuccessListener&lt;Void&gt;() {
                @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();
      }
    }
</code></pre>
<h1 id="6打包测试">6、打包测试:</h1>
<p>Android Studio连接手机,然后将该安卓项目运行到手机上。</p>
<h3 id="1准备好初始文件">1、准备好初始文件</h3>
<p>打开手机的文件管理器,找到 内部存储/AGCSdk/ 路径下,添加并且准备一个test.jpg文件。如下图所示:</p>
<p><img src="https://img-blog.csdnimg.cn/20210222170806722.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h3 id="2上传文件--上传结果">2、上传文件 &amp; 上传结果</h3>
<p>打开刚刚的应用,点击Upload File 按钮,查看上传结果</p>
<p><img src="https://img-blog.csdnimg.cn/20210222170855229.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p><img src="https://img-blog.csdnimg.cn/20210222170923638.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>此时AGC界面上,也可以看到刚刚上传的文件:</p>
<p><img src="https://img-blog.csdnimg.cn/20210222170947496.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h3 id="2下载文件--下载结果">2、下载文件 &amp; 下载结果</h3>
<p>在应用内点击下载按钮,可以看到界面显示 下载成功。</p>
<p>此时回到文件管理器,可以看到刚刚下载的文件。</p>
<p><img src="https://img-blog.csdnimg.cn/20210222171042992.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p><img src="https://img-blog.csdnimg.cn/20210222171058734.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h3 id="2删除文件--删除结果">2、删除文件 &amp; 删除结果</h3>
<p>点击应用里面的删除按钮,可以看到应用界面上显示删除成功。</p>
<p><img src="https://img-blog.csdnimg.cn/2021022217113355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<p>此时到AGC界面上确认下载结果,发现刚刚的test.jpg文件已经被删除了</p>
<p><img src="https://img-blog.csdnimg.cn/20210222171225709.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDcwODI0MA==,size_16,color_FFFFFF,t_70#pic_center"></p>
<h1 id="7总结">7、总结</h1>
<p>仅关注前端应用的开发,就可以开发一个带云端存储服务器的应用。再也不用为了服务器的搭建和运维担心,省时省力。而且还提供了类似于管理员模式的web控制台,可以简单直观的对服务器上的文件进行管理。</p>
<p>这个云存储服务,除了最普通的上传下载和删除功能,还包括有列举文件,设置元数据等功能,具体可以看官方文档:</p>
<p>云存储服务开发指南:</p>
<p>https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudstorage-introduction</p>
<p>云存储codelab:</p>
<p>https://developer.huawei.com/consumer/cn/codelab/CloudStorage/index.html#1</p>
<hr>
<p>原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0201411971207960391?fid=0101271690375130218</p>
<p>原作者:Mayism</p><br><br>
来源:https://www.cnblogs.com/developer-huawei/p/14431609.html
頁: [1]
查看完整版本: 快速集成华为AGC云存储服务-Android