簡介
在上一篇場景開發實戰中,我們使用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) { } }); ···
雲函數處理圖片尺寸
在您的應用中進行的操作:
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);
});
雲存儲觸發雲函數
在AppGallery Connect控制檯中進行的操作:
1、登錄AppGallery Connect,找到雲函數並啓用。
2、新建函數並設置函數名稱,部署信息等相關設置。
3、在“代碼文件”配置項處,上傳處理圖片尺寸的函數部署包至雲函數。
4、創建雲存儲觸發器,輸入之前創建的存儲實例名稱並選擇事件名稱爲Complete(意爲上傳圖片成功後開始觸發雲函數剪裁圖片)。
App Linking鏈接分享
請登錄AppGallery Connect官方網站,並在控制檯中進行操作:
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。
參考文檔:
使用雲存儲上傳圖片:
使用Applinking分享鏈接:
創建雲函數:
更多精彩內容,請見華爲開發者官方論壇→https://developer.huawei.com/consumer/cn/forum/home?ha_source=sanfang