Android中meta-data直接配置long值数据的坑
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() |
需要特别注意的情况有:
- 如果值就是数字类型的,你通过 getString() 方法获取的值为 null,只能通过 getInt() 来获取,不能想当然的认为可以获取到字符串;
- 除数字类型的值外,布尔类型、浮点类型也是同理,也就是说对应的基本数据类型,只能通过对应的方法来获取,其他才能通过 getString() 方法获取到;