• 【AppLinking实战案例】通过AppLinking分享应用内图片


    华为AppGallery Connect提供的App Linking服务支持,可以支持跨平台的分享,支持在Android,iOS,Web等多个平台上使用。对于Android和iOS的移动平台,可以直接拉起应用的指定页面,对于设备上没有安装指定应用的情况下,App Linking链接还可以拉起商店下载应用,下载好应用以后,首次打开也可以打开指定应用的界面。

    下面介绍一个,通过华为 App Linking SDK,场景分享链接,用于分享应用内照片的实际使用场景。

    需求分析

    首先研究华为App Linking官方文档: App Linking-使用入门

    从官方文档的步骤来看,集成华为App Linking服务,主要涉及四个步骤

    1. 在AGC管理台,创建对应的AGC项目。
    2. 在项目创建特定的链接前缀
    3. 在Android项目中集成App Linking SDK,并且通过代码灵活创建链接
    4. 配置Android应用接收并且处理App Linking 链接。

    从代码要求和配置来看,仅需要提供对应的PhotoID,下游图片加载环节,就可以通过PhotoID实现照片的识别和加载。

    因此,仅需要将PhotoID添加到App Linking的分享DeepLink中,然后接收的时候,通过对DeepLink的解析,来获取对应的PhotoID。

    Step1:创建AGC项目

    1. 在AGC控制台,AppGallery Connect (huawei.com),界面选择我的项目。
    2. 在界面上选择 + 号 添加一个项目。输入对应的项目名称即可。
    3. 为项目添加对应的应用,此处需要配置对应包名,包名需要和Android项目代码中的保持一致。

    1.png

    Step2:创建链接前缀

    1. 在上一步创建的项目下,左侧菜单栏,选择 增长 – App Linking,进入到App Linking页签。
    2. 先点击立即使用, 开通该服务。
    3. 在页面下选择 “链接前缀” 页签,先添加一个链接前缀,这个前缀需要全网唯一,系统会自动帮你校验唯一性。

    例如我配置的的链接前缀如下:

    2.png

    Step3:集成SDK、使用API创建链接

    1. 回到AGC项目设置页面,下载agconnect-service.json文件,放到Android项目的App路径下

    3.png

        2. 打开Android项目级gradle文件,添加如下AGC Maven仓地址和AGCP插件。

    1. buildscript {
    2. repositories {
    3. google()
    4. jcenter()
    5. maven { url 'http://developer.huawei.com/repo/' }
    6. }
    7. dependencies {
    8. classpath "com.android.tools.build:gradle:4.1.1"
    9. classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    10. // NOTE: Do not place your application dependencies here; they belong
    11. // in the individual module build.gradle files
    12. }
    13. }
    14. allprojects {
    15. repositories {
    16. google()
    17. jcenter()
    18. maven { url 'http://developer.huawei.com/repo/' }
    19. }
    20. }

        3. 在Android应用级gradle文件中,应用AGCP插件,并且添加App Linking SDK。

    1. apply plugin: 'com.android.application'
    2. apply plugin: 'com.huawei.agconnect'
    3. android{…}
    4. dependencies {
    5. ….
    6. implementation 'com.huawei.agconnect:agconnect-applinking:1.6.0.300'
    7. }

        4. 使用API接口,根据PhotoID灵活创建App Linking链接:

    此处需要注意的是,我传入了UserName和ImageURL参数,作为分享时候的预览页,另外将PhotoID这个参数封装到了DeepLink里。

    1. private static final String DOMAIN_URI_PREFIX = "https://photoplaza.drcn.agconnect.link";
    2. private static final String DEEP_LINK = "https://photoplaza-agc.dra.agchosting.link";
    3. private static final String SHARE_DEEP_LINK = "photo://photoplaza.share.com";
    4. /**
    5. * Call AppLinking.Builder to create a App Linking in App
    6. *
    7. * @param UserName input UserName
    8. * @param PhotoID input PhotoID
    9. * @param ImageUrl input ImageUrl
    10. * @param icallback input icallback
    11. */
    12. public void createShareLinking(String UserName, String PhotoID, String ImageUrl, Icallback icallback) {
    13. String newDeep_Link = SHARE_DEEP_LINK + "?PhotoID=" + PhotoID;
    14. AppLinking.Builder builder = AppLinking.newBuilder()
    15. .setUriPrefix(DOMAIN_URI_PREFIX)
    16. .setDeepLink(Uri.parse(DEEP_LINK))
    17. .setAndroidLinkInfo(AppLinking.AndroidLinkInfo.newBuilder()
    18. .setAndroidDeepLink(newDeep_Link)
    19. .build())
    20. .setSocialCardInfo(AppLinking.SocialCardInfo.newBuilder()
    21. .setTitle("It is a beautiful Photo")
    22. .setImageUrl(ImageUrl)
    23. .setDescription(UserName + " share a Photo to you")
    24. .build())
    25. .setCampaignInfo(AppLinking.CampaignInfo.newBuilder()
    26. .setName("UserSharePhoto")
    27. .setSource("ShareInApp")
    28. .setMedium("WeChat")
    29. .build());
    30. builder.buildShortAppLinking().addOnSuccessListener(shortAppLinking -> {
    31. shortLink = shortAppLinking.getShortUrl().toString();
    32. try {
    33. icallback.onSuccess(shortLink, "Success");
    34. } catch (FileNotFoundException e) {
    35. e.printStackTrace();
    36. }
    37. }).addOnFailureListener(e -> icallback.onFailure(e.getMessage()));
    38. }

    Step4:接收App Linking连接。

    先说一下规划,我计划在ImageDetailActivity这个页面,进行App Linking链接的接收,也就是说,链接直接拉起应用后,打开的是这个Detail页面。

    1. 配置AndroidManifest文件。找到ImageDetailActivity标签,为其添加需要接收DeepLink的Intent-filter
    1. <activity android:name=".ImageDetailActivity">
    2. <meta-data
    3. android:name="android.support.PARENT_ACTIVITY"
    4. android:value=".ImageListActivity" />
    5. <intent-filter>
    6. <action android:name="android.intent.action.VIEW" />
    7. <category android:name="android.intent.category.DEFAULT" />
    8. <category android:name="android.intent.category.BROWSABLE" />
    9. <!-- 此处添加项目中自定义的域名 -->
    10. <data android:host="photoplaza.share.com" android:scheme="photo" />
    11. </intent-filter>
    12. </activity>

    2. 打开ImageDetail文件,在onCreate()中配置接收并且解析App Linking并且获取DeepLink的相关代码

    1. protected void onCreate(Bundle savedInstanceState) {
    2. super.onCreate(savedInstanceState);
    3. setDarkStatusIcon();
    4. setContentView(R.layout.image_detail);
    5. AGConnectAppLinking.getInstance().getAppLinking(ImageDetailActivity.this)
    6. .addOnSuccessListener(resolvedLinkData -> {
    7. // 通过AppLinking启动应用,此处适配已安装场景的再次启动
    8. if (resolvedLinkData!= null) {
    9. Uri deepLink = resolvedLinkData.getDeepLink();
    10. Log.i(TAG, "Open From AppLinking:" + deepLink);
    11. // Get picture details.
    12. getSharePicDetails(deepLink.toString());
    13. }
    14. }).addOnFailureListener(e->{
    15. Bundle data = getIntent().getExtras();
    16. if (data != null) {
    17. if (data.getBoolean("firstLink")) {
    18. // 通过AppLinking首次启动应用的入口
    19. getSharePicDetails(data.getString("deepLink"));
    20. }
    21. else{
    22. // 正常打开ImageDetail页面
    23. initView();
    24. }
    25. }
    26. });
    27. }
    28. /**
    29. * Get a picture detail from a App Linking which share from other.
    30. *
    31. * @param link input a deepLink of App Linking
    32. */
    33. private void getSharePicDetails(String link) {
    34. ToastUtils.showToast(this, getResources().getString(R.string.loading_photo));
    35. sharePhotoID = parseLink (link).get("PhotoID");
    36. Log.i("AppLinking", "sharePhotoID: " + sharePhotoID);
    37. }
    38. /**
    39. * Get param in received deepLink from AppLinking.
    40. *
    41. * @param url input the received deepLink
    42. * @return myMap output the param
    43. */
    44. public static Map<String, String> parseLink(String url) {
    45. Map<String, String> myMap = new HashMap<String, String>();
    46. String[] urlParts = url.split("\\?");
    47. String[] params = urlParts[1].split("&");
    48. for (String param : params) {
    49. String[] keyValue = param.split("=");
    50. myMap.put(keyValue[0], keyValue[1]);
    51. }
    52. return myMap;
    53. }

    Step5:补充步骤

    由于App Linking还会使用在应用未安装的场景。该步骤特定用户介绍全新安装的场景下 ,App Linking需要做何种适配。

    1. 情况描述:

    首先对于应用未安装情况,App Linking链接会根据指定的包名(默认就是创建链接时候的那个App的包名), 根据包名,打开你手机的华为商店的应用下载页面,当然也可以配置本地商店打开。

    在商店下载并且安装好以后,点击打开,App Linking也是生效并且可以传递参数的。但是由于是首次打开,此时第四步配置的Intent-filter是不生效的。只能打开应用的首页。因为该步骤的重点,就是在应用的启动页里面,适配App Linking首次打开的场景。

        2.代码适配,打开应用启动页,同样配置getAppLinking的代码

    例如我的启动页面是LoginActivity,

    1. AGConnectAppLinking.getInstance().getAppLinking(LoginActivity.this).addOnSuccessListener(resolvedLinkData -> {
    2. // 通过AppLinking首次启动
    3. Log.i(TAG,"StartUp From AppLinking");
    4. if (resolvedLinkData!= null) {
    5. String deepLink = resolvedLinkData.getDeepLink().toString();
    6. Log.i("AppLinking", "deepLink:" + deepLink);
    7. Bundle bundle = new Bundle();
    8. bundle.putBoolean("firstLink", true);
    9. bundle.putString("deepLink", deepLink);
    10. Intent intent;
    11. intent = new Intent(LoginActivity.this, ImageDetailActivity.class);
    12. intent.putExtras(bundle);
    13. startActivity(intent);
    14. finish();
    15. }
    16. }).addOnFailureListener(e-> {
    17. // 普通的启动方式
    18. Log.i(TAG,"Normal StartUp");
    19. initView();
    20. });

    总结和归纳

    上面,就是Android项目内,通过App Linking 的SDK,快速构建应用内图片分享的能力,不需要额外申请应用专属域名,也不涉及后台的运维、H5页面的开发、JavaScript代码的适配等内容,轻松五个步骤就完成了。可以说非常方便快捷。

    下面是涉及的页面的简单步骤截图:

    4.png      5.png      6.png

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

    参考文档

    1. 华为AGC App Linking服务业务介绍:App Linking-业务介绍
    2. 华为ACG Android平台使用入门:App Linking-使用入门
    3. 华为AGC App Linking服务,常见问题排查:App Linking-视频课堂:常见问题排查
  • 相关阅读:
    vue2+vue3天禹老师版复习笔记
    多输入多输出 | MATLAB实现CNN-LSTM-Attention卷积神经网络-长短期记忆网络结合SE注意力机制的多输入多输出预测
    两个面试Demo,看完就有收获!
    【Python学习笔记】第二章循环:while循环,for循环,break和continue语句,死循环,循环的嵌套
    ATL新能源科技薪资待遇及Verify测评语言理解数字推理题型简介
    论文(0):下载ieee期刊会议杂志论文模板流程
    C++虚继承原理与类布局分析
    基础语言-第15天-文件操作
    退运险业务及系统架构演进史
    花生壳 搭建服务器
  • 原文地址:https://blog.csdn.net/weixin_44708240/article/details/125520587