Android实现获取meta-data和build.gradle的值
有时候会用到meta-data中的参数,比如定义的渠道号,类似友盟统计。也会用到定义在build.gradle文件中android标签下的defaultConfig标签下,添加manifestPlaceholders标签中,有可能也会用到渠道值。
<meta-data
android:name="UMENG_CHANNEL"
android:value="0"/
首先获取meta-data中的值,直接看方法:
/**
* 不同的类型要区别获取,以下是String类型的
* @param context 上下午
* @param metaName meta-data定义的名字
* @param defaultValue 默认值
* @return
*/
public static String getAppMetaDataString(Context context, String metaName, String defaultValue) {
try {
//application标签下用getApplicationinfo,如果是activity下的用getActivityInfo
//Sting类型的用getString,Boolean类型的getBoolean,其他具体看api
String value = context.getPackageManager()
.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)
.metaData.getString(metaName, defaultValue);
return value;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return defaultValue;
}
}
获取build.gradle中的值:
manifestPlaceholders = [
JPUSH_PKGNAME : applicationId,
JPUSH_APPKEY : "xxxxxxxxxxxxxxxxx", //JPush上注册的包名对应的appkey.
JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
]
原理是一样的,manifestPlaceholders标签下的值需要在清单文件AndroidManifest.xml中占位显示,这里占位极光渠道号(ps:不知道极光文档有没有直接获取的):
这里 name 为 名字随意,不重复就行,value 为manifestPlaceholders下的定义的值,必须采用 ${变量值}
<meta-data android:name="JPUSH_CHANNEL"
android:value="${JPUSH_CHANNEL}"/
同用方法
/**
* 获取MetaData信息
*
* @param name
* @param def
* @return
*/
public static String getMetaDataValue(Context context, String name,
String def) {
String value = getMetaDataValue(context, name);
return (value == null) ? def : value;
}
public static String getMetaDataValue(Context context, String name) {
Object value = null;
PackageManager packageManager = context.getPackageManager();
ApplicationInfo applicationInfo;
try {
applicationInfo = packageManager.getApplicationInfo(
context.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null && applicationInfo.metaData != null) {
value = applicationInfo.metaData.get(name);
}
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(
"Could not read the name in the manifest file.", e);
}
if (value == null) {
throw new RuntimeException("The name '" + name
+ "' is not defined in the manifest file's meta data.");
}
return value.toString();
}
所以又回到了上一步,去获取meta-data中的值了。说到底还是熟不熟悉PackageManager
补充知识:android meta data值获取的坑
获取meta data的时候,正常的非纯数字的字符串,设置在value里面,用getString获取是正常的。
但是如果含有纯数字的字符串,用getString获取返回为null。也许你会想到用getInt,getLong获取,很抱歉,也可能是null。
解决方式有两种:
一.
继续使用value=”1234567890″,但是在纯数字字符串开头加上” “(反斜杠+空格)这样系统会自动读取为字符串而不是其他格式,形如
<meta-data
android:name="appkey"
android:value=" 1234567890" /
二. 使用resources属性通过getInt获取资源id,再获取资源id对应的值,这种方式可扩展性很强,可以获取所有资源而不只是string,形如
<meta-data
android:name="appkey"
android:resource="@string/AppKey" /
在strings.xml中定义AppKey的值为
<string name=”AppKey” 1234567890</string
三.Application下获取meta资源的方式
public static String getStringMetaData(String name) {
int valueId = 0;
try {
ApplicationInfo appInfo = getApplicationContext().getPackageManager()
.getApplicationInfo(getApplicationContext().getPackageName(),
PackageManager.GET_META_DATA);
valueId = appInfo.metaData.getInt(name);
if (valueId != 0) {
return getApplicationContext().getResources().getString(valueId);
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return "";
}
以上这篇Android实现获取meta-data和build.gradle的值就是小编分享给大家的全部内容了,希望能给大家一个参考。
- 51Nod 1090 3个数和为0(暴力)
- qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)
- POJ 3624 Charm Bracelet(01背包裸题)
- 2015 计蒜之道 初赛(4)爱奇艺的自制节目(枚举 贪心)
- Codeforces 810C Do you want a date?(数学,前缀和)
- [快学Python3]数据结构-堆栈
- [快学Python3]PyMySQL库
- [快学Python3]SMTP发送邮件
- Educational Codeforces Round 21 D.Array Division(二分)
- Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2)(A.暴力,B.优先队列,C.dp乱搞)
- [libvirt][nginx]libvirt文档访问速度提高的小技巧
- 图论----同构图(详解)
- 基数排序与桶排序,计数排序【详解】
- SG函数和SG定理【详解】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- php fread函数使用方法总结
- Yii2框架控制器、路由、Url生成操作示例
- Laravel框架实现调用百度翻译API功能示例
- phpstudy2018升级MySQL5.5为5.7教程(图文)
- laravel实现简单用户权限的示例代码
- tp5(thinkPHP5框架)时间查询操作实例分析
- PHP使Laravel为JSON REST API返回自定义错误的问题
- 详解PHP PDO简单教程
- Python实现ElGamal加密算法的示例代码
- PHP实现基于状态的责任链审批模式详解
- django rest framework使用django-filter用法
- 通过实例解析python创建进程常用方法
- thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
- OpenCV 之按位运算举例解析
- Python实时监控网站浏览记录实现过程详解