当前位置:网站首页>AppGallery Connect场景化开发实战—图片存储分享
AppGallery Connect场景化开发实战—图片存储分享
2022-07-02 07:15:00 【华为开发者论坛】
简介
在上一篇场景开发实战中,我们使用AppGallery Connect(以下简称AGC)的认证服务、云函数、短信服务等服务实现了用户注册通知的功能。 本次,我们使用AGC提供的云函数、云存储和App Linking三大服务实现了图片的存储、在线剪辑和分享功能,相关代码已同步至Github。
实现概览
- 用户在客户端选择需要上传的图片,调用云存储Android/iOS的上传接口将图片上传至云存储。
- 创建处理图片的云函数,选择云存储触发器,每当云存储有新的图片上传都会触发云函数进行缩略图处理。
- 云函数中调用云存储Node.js SDK的下载文件接口将图片下载至内存,通过特定方法处理图片,而后调用云存储Node.js SDK中的上传接口将处理完的图片上传回云存储。
- 端侧通过云存储Android/iOS SDK下载云存储上的缩略图后,通过AppLinking生成分享链接分享给好友,好友点击链接后即可直接打开到应用的指定页面。
端侧上传图片至云存储
请登录AppGallery Connect官方网站,并在控制台中进行操作:
- 启用云存储服务
- 创建新的存储实例
- 设置云存储安全策略
- 设置云存储文件夹结构
在您的应用中进行的操作:
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控制台中进行的操作:
- 登录AppGallery Connect,找到云函数并启用。
- 新建函数并设置函数名称,部署信息等相关设置。
- 在“代码文件”配置项处,上传处理图片尺寸的函数部署包至云函数。
- 创建云存储触发器,输入之前创建的存储实例名称并选择事件名称为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官方网站,并在控制台中进行操作:
- 启用App Linking服务。
- 启用服务以后,在链接前缀页签,创建一个全网唯一的链接前缀。
- 配置您应用签名的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
});测试功能
您可以执行以下操作来测试图片或视频是否可以正常分享:
- 打开您的应用,随机拍摄一张图片存储于手机中。
- 查看图片上传后的处理效果。
- 进入图片详情界面,点击右上角的分享链接,查看是否生成链接并发送给好友。
- 使用好友帐号登录应用,查收并点击链接,测试是否可正常打开分享的图片页面。
更多参考,请下载Demo。
欲了解更多详情,请参见:
华为官网:
https://developer.huawei.com/consumer/cn/forum/topic/0203726140997690403?fid=0101271690375130218?ha_source=zzh
参考文档:
使用云存储上传图片:
使用Applinking分享链接:
创建云函数:
边栏推荐
- PCL 点云转深度图像
- 13. Semaphore critical zone protection
- [TS] 1368 seconds understand typescript generic tool types!
- MySQL数据库远程访问权限设置
- Read H264 parameters from mediarecord recording
- Shutter - canvas custom graph
- 12.进程同步与信号量
- Pytest framework implements pre post
- (5) Gear control setting of APA scene construction
- UWA report uses tips. Did you get it? (the fourth bullet)
猜你喜欢

HDU1236 排名(结构体排序)

KS009基于SSH实现宠物管理系统

01 install virtual machine

Leetcode+ 76 - 80 storm search topic

使用Windbg静态分析dump文件(实战经验总结)

Beautiful and intelligent, Haval H6 supreme+ makes Yuanxiao travel safer

Flink实时计算topN热榜

Session cookies and tokens

Kustomize user manual

MongoDB 学习整理(条件操作符,$type 操作符,limit()方法,skip() 方法 和 sort() 方法)
随机推荐
Ks009 implement pet management system based on SSH
【TS】1368- 秒懂 TypeScript 泛型工具类型!
What are the popular frameworks for swoole in 2022?
互联网快讯:腾讯会议应用市场正式上线;Soul赴港递交上市申请书
记录 AttributeError: ‘NoneType‘ object has no attribute ‘nextcall‘
从.bag文件中读取并保存.jpg图片和.pcd点云
点云投影图片
Open the encrypted SQLite method with sqlcipher
flink 提交程序
Mysql database remote access permission settings
HDU1228 A + B(map映射)
P1055 [NOIP2008 普及组] ISBN 号码
618 what is the secret of dominating the list again? Nike's latest financial report gives the answer
Start class, data analysis, high salary training plan, elite class
Pywin32打开指定窗口
转换YV12到RGB565图像转换,附YUV转RGB测试
flume 190 INSTALL
UVM learning - object attribute of UVM phase
MySQL keyword
Lunix reallocates root and home space memory