美文网首页
Android中meta-data直接配置long值数据的坑

Android中meta-data直接配置long值数据的坑

作者: 云飞扬1 | 来源:发表于2019-04-08 14:08 被阅读0次

    1. Android中的meta-data配置long型数据引发的问题

    通常我们的 APP 中都要接入第三方分享功能,例如:微信分享、微博分享、朋友圈分享、QQ分享等等,这需要我们在第三方平台申请一个 appId 之类的东西,审核通过后配置好就可以了。

    以微博为例,由于我们的 APP 需要打多个不同包名的APP,所以将申请到的微博 appId 配置到 AndroidManifest.xml 里的 meta-data 信息里,并采用一个占位符,可以在 build.gradle 里随时替换:

    <!-- 微博 -->
    <meta-data
        android:name="WEIBO_ID"
        android:value="${WEIBO_ID}" />
    

    在 build.gradle 里的替换占位符:

     manifestPlaceholders = [ WEIBO_ID:'111111111111']
    
    //用法,读取 meta-data 里的值:
    try {
        ApplicationInfo info = context.getPackageManager()
                .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        Bundle data = info.metaData;
        String weiboId = data.getString("WEIBO_ID");            
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    最终我们会打多个不同的包名出来,每个包名都对应一个在微博开发平台申请的 appId,但是测试的时候确发现一个很奇怪的问题,有的 APP 里微博分享能成功,有的 APP 里微博分享死活不成功,总是报一个类似“appId错误”的问题。在检查了很多遍配置、签名之后发现都没问题,于是我们查看了一下有问题的 app 的包信息,发现问题包里的 WEIBO_ID 的值不正确,这才找到了根本原因:meta-data不支持long数据类型。我们申请到的微博 appId ,都是纯数字类型的字符串,理论上我读取 meta-data 信息时用 getString("WEIBO_ID") 方法应该没问题的,但是打包的 aapt 工具不这么认为,它会把一个纯数字识别成数字而不是字符串,这样读取会直接报错;如果我用 getLong("WEIBO_ID") 来读取呢,同样有问题,它不支持 long 数据类型;如果我用 getInt("WEIBO_ID") 来读取,有的 appId 表示的数字类型已经超过了 int 能表示的范围,同样不能满足需求。

    2. 解决方案

    那么怎么在 meta-data 里配置这种数据呢,我们可以在 meta-data 的 value 里为数字增加一个字符串前缀,最终代码里读取到的是一个字符串,然后自己手动去掉前缀即可:

    manifestPlaceholders = [ WEIBO_ID:'weibo111111111111']
    
    //代码里这样读取
    String weiboId = data.getString("weibo");  
    weiboId = weiboId.replace("weibo", "");
    

    3. meta-data 支持的数据类型

    经过查看文档和自己测试,meta-data 支持以下几种数据类型的配置:

    类型 meta-data 对应的方法
    String getString()
    Integer getInt()
    Boolean getBoolean()
    Float getFloat()

    需要特别注意的情况有:

    1. 如果值就是数字类型的,你通过 getString() 方法获取的值为 null,只能通过 getInt() 来获取,不能想当然的认为可以获取到字符串;
    2. 除数字类型的值外,布尔类型、浮点类型也是同理,也就是说对应的基本数据类型,只能通过对应的方法来获取,其他才能通过 getString() 方法获取到;

    相关文章

      网友评论

          本文标题:Android中meta-data直接配置long值数据的坑

          本文链接:https://www.haomeiwen.com/subject/qgbuiqtx.html