现象描述
最近在项目中接入穿山甲广告的sdk,快速实现了核心功能验证。接下来就准备规范代码正式使用,却掉了一个坑,略做记录。
穿山甲sdk提供了一个appid的参数,不同渠道包是不同的,所以将其配入了gradle的productFlavors部分,即如下所示中的TT_APPID:
productFlavors { version_vivo { dimension "default" applicationIdSuffix ".vivo" manifestPlaceholders = [CHANEL_ID: "vivo1000", //穿山甲广告 TT_APPID : "5657678" ] } }
再在AndroidManifest.xml中配置meta数据:
<meta-data android:name="CHANEL_ID" android:value="${CHANEL_ID}" /> <meta-data android:name="TT_APPID" android:value="${TT_APPID}" />
初始化穿山甲sdk的时候获取meta数据:
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); AppUtil.CHANEL_ID = appInfo.metaData.getString("CHANEL_ID"); AppUtil.TT_APPID = appInfo.metaData.getString("TT_APPID");
这一系列步骤看起来完美无缺,但偏偏当信心满满run起来的时候,发现获取不到TT_APPID。
检查了下代码,发现CHANEL_ID都能获取到,偏偏获取不到TT_APPID,这不科学啊!
气死我也,本来如行云流水的敲代码过程就被中断了。
深呼吸,一顿各种检查,各种log查看,谷歌加百度支援,终于解决了问题。
问题分析
Android在处理meta-data的时候如果value可以转化为数值类型,那么它将自动被转换为数值类型。在代码中通过getString是无法获取到这个值的。而本案例中的CHANEL之所以可以获取到,因为不可转化为数值类型,而TT_APPID是可以转化为数值类型的
解决方法
- 将value改用非数值类型
- 也可以将数值类型转换为带0X的16进制表示
- 或者使用getInt方法取值
我选用的是第3个解决方法
ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); AppUtil.CHANEL_ID =appInfo.metaData.getString("CHANEL_ID"); AppUtil.TT_APPID = "" + appInfo.metaData.getInt("TT_APPID");
继续阅读
评论