ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AppGallery Connect场景化开发实战—图片存储分享

2022-07-01 09:03:20  阅读:178  来源: 互联网

标签:实战 存储 String result AppGallery Connect 上传 链接 图片


​简介

在上一篇场景开发实战中,我们使用AppGallery Connect(以下简称AGC)的认证服务、云函数、短信服务等服务实现了用户注册通知的功能。 本次,我们使用AGC提供的云函数、云存储和App Linking三大服务实现了图片的存储、在线剪辑和分享功能,相关代码已同步至Github

实现概览

  1. 用户在客户端选择需要上传的图片,调用云存储Android/iOS的上传接口将图片上传至云存储。
  2. 创建处理图片的云函数,选择云存储触发器,每当云存储有新的图片上传都会触发云函数进行缩略图处理。
  3. 云函数中调用云存储Node.js SDK的下载文件接口将图片下载至内存,通过特定方法处理图片,而后调用云存储Node.js SDK中的上传接口将处理完的图片上传回云存储。
  4. 端侧通过云存储Android/iOS SDK下载云存储上的缩略图后,通过AppLinking生成分享链接分享给好友,好友点击链接后即可直接打开到应用的指定页面。

端侧上传图片至云存储

请登录AppGallery Connect官方网站,并在控制台中进行操作:

  1. 启用云存储服务
  2. 创建新的存储实例
  3. 设置云存储安全策略
  4. 设置云存储文件夹结构

在您的应用中进行的操作:

1、使用云存储Android SDK中的getStorageReference方法为存放上传文件的云端地址创建引用:

AGCStorageManagement storageManagement = AGCStorageManagement.getInstance();
StorageReference reference = storageManagement.getStorageReference("images/demo.jpg");

2、调用SDK中的上传接口将本地的文件上传至存储实例中:

UploadTask task = reference.putFile(new File("path/images/test.jpg"));
task.addOnFailureListener(new OnFailureListener(){
    @Override
    public void onFailure(@NonNull Exception exception) {
    }
}).addOnSuccessListener(new OnSuccessListener<UploadTask.UploadResult>(){
    @Override
    public void onSuccess(UploadTask.UploadResult uploadResult) {
    }
});

云存储触发云函数

AppGallery Connect控制台中进行的操作:

  1. 登录AppGallery Connect,找到云函数并启用。
  2. 新建函数并设置函数名称,部署信息等相关设置。
  3. 在“代码文件”配置项处,上传处理图片尺寸的函数部署包至云函数。
  4. 创建云存储触发器,输入之前创建的存储实例名称并选择事件名称为Complete(意为上传图片成功后开始触发云函数剪裁图片)。

云函数处理图片尺寸

在您的应用中进行的操作:

1、调用云存储Node.js SDK指定需要下载的实例与存储桶并指定本地地址:

const storage = new StorageManagement();
const bucket = storage.bucket("photo-7iawi");
const remoteFile = bucket.file(fileAddr);
localAddr = “\ImageProcess\picture”;

2、调用方法下载文件:

try {
        remoteFile.createReadStream()
        .on('error', err => {
          result = {"message":"download file error, " + err.message};
          callback(result);
        })
        .on('end', () => {
            result = {"message":"download file success"};
            // callback(result);
        })
        .pipe(fs.createWriteStream(localFile));
    } catch (error) {
        result = {"message":"download file error, " + error.message};
        callback(result);
    }

3、下载文件完成后进行处理图片分辨率的操作。

4、图片处理完成后将新的图片上传回云存储。

const options = {
        destination: 'thumbnail/' + fileName,
        onUploadProgress: (event) => {
        }
    };

    bucket.upload(imageAddr, options)
        .then(res => {
            result = {"message":"All Success"};
            callback(result);
        }).catch(err => {
            result = {"message":"upload failed"};
            callback(result);
        });

App Linking链接分享

请登录AppGallery Connect官方网站,并在控制台中进行操作:

  1. 启用App Linking服务
  2. 启用服务以后,在链接前缀页签,创建一个全网唯一的链接前缀。
  3. 配置您应用签名的SHA256文件,具体的配置方法可参考 配置签名指纹证书

在您的应用中进行的操作:

1、使用云存储接口获取对应图片的下载链接。

private String downloadUrl;
private void getDownLoadUrl() {
    AGCStorageManagement storageManagement = AGCStorageManagement.getInstance();
        StorageReference reference = storageManagement.getStorageReference("images/demo.jpg");
        Task<Uri> task = reference.getDownloadUrl();
        task.addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) { 
                String downloadUrl = uri.toString();
            }
        });
        task.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
            }
        });
    }

2、将下载链接和对应的图片ID生成分享链接。

private String shortLink;
private static final String DOMAIN_URI_PREFIX = "https:// DomainUriPrefix.drcn.agconnect.link";
    private static final String SHARE_DEEP_LINK = "share://photo.share.com";
    private void createShareLinking(String UserName, String PhotoID, String ImageUrl) {
        String newDeep_Link = SHARE_DEEP_LINK  + "?PhotoID=" + PhotoID;
        AppLinking.Builder builder = AppLinking.newBuilder()
                .setUriPrefix(DOMAIN_URI_PREFIX)
                .setDeepLink(Uri.parse(ImageUrl))
                .setAndroidLinkInfo(AppLinking.AndroidLinkInfo.newBuilder()
                        .setAndroidDeepLink(newDeep_Link)
                        .build())
                .setSocialCardInfo(AppLinking.SocialCardInfo.newBuilder()
                        .setTitle("It is a beautiful Photo")
                        .setImageUrl(ImageUrl)
                        .setDescription(UserName + " share a Photo to you")
                        .build())
                .setCampaignInfo(AppLinking.CampaignInfo.newBuilder()
                        .setName("UserSharePhoto")
                        .setSource("ShareInApp")
                        .setMedium("MediumExample")
                        .build());
        builder.buildShortAppLinking().addOnSuccessListener(shortAppLinking -> {
            shortLink = shortAppLinking.getShortUrl().toString();
        }).addOnFailureListener(e -> {
        });
    }

3、在AndroidManifest中配置Intent-Filter,用于接收App Linking链接并且直接拉起应用。

<activity android:name=".MainActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
	<intent-filter android:autoVerify="true">
		<action android:name="android.intent.action.VIEW"/>
		<category android:name="android.intent.category.DEFAULT"/>
		<category android:name="android.intent.category.BROWSABLE"/>
		<data android:host=" DomainUriPrefix.drcn.agconnect.link" android:scheme="http"/>
		<data android:host=" DomainUriPrefix.drcn.agconnect.link" android:scheme="https"/>
	</intent-filter>
</activity>

4、在应用启动页的OnCreate方法中, 接收并且处理App Linking链接的方法。

AGConnectAppLinking.getInstance().getAppLinking(LoginActivity.this).addOnSuccessListener(resolvedLinkData -> {
	Log.i(TAG,"StartUp From AppLinking");
	if (resolvedLinkData!= null) {
		String deepLink = resolvedLinkData.getDeepLink().toString();
		// your action of StartUp From AppLinking 
	}
}).addOnFailureListener(e-> {
	Log.i(TAG,"Normal StartUp");
	// your action of Normal StartUp 
});

测试功能

您可以执行以下操作来测试图片或视频是否可以正常分享:

  1. 打开您的应用,随机拍摄一张图片存储于手机中。
  2. 查看图片上传后的处理效果。
  3. 进入图片详情界面,点击右上角的分享链接,查看是否生成链接并发送给好友。
  4. 使用好友帐号登录应用,查收并点击链接,测试是否可正常打开分享的图片页面。

更多参考,请下载Demo

 

欲了解更多详情,请参见:
华为官网:
https://developer.huawei.com/consumer/cn/forum/topic/0203726140997690403?fid=0101271690375130218?ha_source=zzh

 

参考文档:

使用云存储上传图片:

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

使用Applinking分享链接:

https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-applinking-createlinks-bysdk-android-0000001055674692

创建云函数:

https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudfunction-config-0000001058511532

标签:实战,存储,String,result,AppGallery,Connect,上传,链接,图片
来源: https://www.cnblogs.com/developer-huawei/p/16433317.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有