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的值就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Android Manifest中meta-data扩展元素数据的配置与获取方式

    在AndroidManifest.xml清单文件中 我们有时会看到如下类似的<meta-data ... >元素开始的配置内容: <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyBhBFOgVQclaa8p1JJeqaZHiCo2nfiyBBo" /> <meta-data android:name="com.g

  • 详解关于Android Studio中安装和gradle的一些坑

    本人从开始用Android Studio到现在已经快一年了吧,在我刚开始用的时候Android Studio还是1.2的版本.当时安装会因为国内墙的缘故,导致下载SDK步骤卡死无法安装. 最近的版本似乎都没出现这个问题,但是还是要吐槽一下最近的2.2.3的更新.这个版本安装包自带的SDK里build tools版本是25.0.2,支持的最低gradle版本是3.3,然而安装包内自带的gradle版本是3.2,所以单纯这个用安装包你并不能建立任何完整的项目,连自带的Helloworld项目都会报错

  • 史上最全的Android build.gradle配置教程

    前言 Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项目时会包含两个Android build.gradle配置详解文件,如下图: 一.Project的build.gradle文件: 对应的build.gradle代码如下: // Top-level build file where you can add configuration optio

  • Android实现获取meta-data和build.gradle的值

    有时候会用到meta-data中的参数,比如定义的渠道号,类似友盟统计.也会用到定义在build.gradle文件中android标签下的defaultConfig标签下,添加manifestPlaceholders标签中,有可能也会用到渠道值. <meta-data android:name="UMENG_CHANNEL" android:value="0"/> 首先获取meta-data中的值,直接看方法: /** * 不同的类型要区别获取,以下是S

  • 浅析Android中build.gradle的实用技巧

    1.替换符的使用 (1)在 app-android-defaultConfig (或者多渠道打包)下面可以这样使用 android { defaultConfig { manifestPlaceholders = [ //高德地图key GDKEY: "123456789", ] } } (2)在 AndroidManifest.xml 文件的 application 标签下面这样引用 <!-- 高德地图 --> <meta-data android:name=&qu

  • 史上最全Android build.gradle配置详解(小结)

    Android Studio是采用gradle来构建项目的,gradle是基于groovy语言的,如果只是用它构建普通Android项目的话,是可以不去学groovy的.当我们创建一个Android项目时会包含两个Android build.gradle配置详解文件,如下图: 一.Project的build.gradle文件: 对应的build.gradle代码如下: // Top-level build file where you can add configuration options

  • Android build.gradle版本名打包配置的方法

    1.生成密钥文件到app工程目录下 2.在gradle.properties文件下配置密钥文件信息 # Project-wide Gradle settings. # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. # For more details on how to conf

  • Android中的build.gradle文件深入讲解

    一.什么是Gradle gradle是一个项目构建工具,java开发中有两个大名鼎鼎的项目构建Maven,Ant,其中maven简单易控深受开发者喜爱. 项目构建工具是什么?能干吗? 开发某些项目时,需要很多jar或者库的支持,还没开始开发就下载了n多个库,浪费了时间不说,这些库之间兼容性又无法保证.删了?白下载了.不删?又不兼容.此时就需要使用项目构建工具,简单的说就是一个可以根据简单的配置文件自动去下载相应包/库的软件.自动的还很简单,不用岂不亏了.多个项目构建工具各有特点,但是核心思想一样

  • Android Studio新建工程默认在build.gradle中加入maven阿里源的问题

    背景: 在安卓开发时,我们时常会因为gradle时间漫长感到烦恼.通常情况下我们会在build.gradle(Project:MyApplication)中的repositories里添加阿里源,如下图所示. 而每次新建工程依然是google()和jcenter(),而且新建后自动帮你Sync,如果网速不佳则是等了好久才编译好一个新的工程. 解决方案: Android Studio新建工程自动加入maven阿里源 版本:笔者用的是AndroidStudio 3.4,其他版本略同 找到Androi

  • Android报错Error:Could not find com.android.tools.build:gradle:4.1解决办法

    看字面意思,这个问题是Gradle没有对应版本.在搜索引擎没有找到方法之后,尝试自己解决. 有一点很重要,先保证自己的Android Studio是最新的稳定版本! 因为版本更新会修复很多bug,说不定遇到报错就是某个bug引起的. Could not find com.android.tools.build:gradle:3.0.0. 首先,看报错,大概是长这样的: Error:Could not find com.android.tools.build:gradle:4.1. Searche

  • 解决Could not find com.android.tools.build:gradle:3.0.0

    android studio升级3.0,gradle升级4.1以后项目报错,如下 Could not resolve all files for configuration ':classpath'. Could not find com.android.tools.build:gradle:3.0.0. Searched in the following locations: https://jcenter.bintray.com/com/android/tools/build/gradle/

  • Android编程获取sdcard音乐文件的方法

    本文实例讲述了Android编程获取sdcard音乐文件的方法.分享给大家供大家参考,具体如下: 复制代码 代码如下: Cursor  query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder); Uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档. Projection: 指定查询数据库表中的哪几列,

随机推荐