android long类型数据,Android中meta-data直接配置long值数据的坑

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

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

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

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()

需要特别注意的情况有:

如果值就是数字类型的,你通过 getString() 方法获取的值为 null,只能通过 getInt() 来获取,不能想当然的认为可以获取到字符串;

除数字类型的值外,布尔类型、浮点类型也是同理,也就是说对应的基本数据类型,只能通过对应的方法来获取,其他才能通过 getString() 方法获取到;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值