Android 获取manifest.xml中meta-data值遇到的问题

项目中要根据打不同flave包,包名和一些配置信息要一键切换,所有把部分信息写到build.gradle文件中了,如下

entpRelease {
    buildConfigField "boolean", "DEV_MODE", "false"
    applicationIdSuffix ".preview"
    debuggable true
    zipAlignEnabled true
    minifyEnabled true
    shrinkResources true
    ndk {
        debuggable true
    }
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.release
    manifestPlaceholders = ["WEIXIN_APP_ID"         : "wxae8serw56d41411",
                            "WEIXIN_APP_SECRET"     : "d3b0fa119esdf2a447b7b6sdfsadfc78a",
                            "QQ_APP_ID"             : "1106323496",
                            "QQ_APP_SECRET"         : "Zea4D35gt3RPGZXS",
                            "Sina_APP_ID"           : "3242287343",
                            "Sina_APP_SECRET"       : "5d0cf6d2swfd652f20bb15b6776fd"]
}

// 测试环境
entpDebug {
    buildConfigField "boolean", "DEV_MODE", "true"
    applicationIdSuffix ".preview.debug"
    debuggable true
    zipAlignEnabled true
    minifyEnabled true
    shrinkResources true
    ndk {
        debuggable true
    }
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    signingConfig signingConfigs.release
    manifestPlaceholders = ["WEIXIN_APP_ID"         : "wxc11e8dfsdfasdf1e656d",
                            "WEIXIN_APP_SECRET"     : "d3b0fa119ea73e0aaaafc9447b7b6c78a",
                            "QQ_APP_ID"             : "1106302696",
                            "QQ_APP_SECRET"         : "Zea432655RPGZXS",
                            "Sina_APP_ID"           : "3266549287",
                            "Sina_APP_SECRET"       : "5d0cf6d74a45dfasdf52f20bb15b6776fd"]
}

但是又要能够在代码中获取到这些值,所有我只能在AndroidManifest.xml文件中引用这些变量,如下:

    android:name="WEIXIN_APP_ID"
    android:value="${WEIXIN_APP_ID}" />

    android:name="WEIXIN_APP_SECRET"
    android:value="${WEIXIN_APP_SECRET}" />

    android:name="QQ_APP_ID"
    android:value="${QQ_APP_ID}" />

    android:name="QQ_APP_SECRET"
    android:value="${QQ_APP_SECRET}" />

    android:name="Sina_APP_ID"
    android:value="${Sina_APP_ID}" />

    android:name="Sina_APP_SECRET"
    android:value="${Sina_APP_SECRET}" />

代码中通过如下代码获取这些配置信息:

/**
 * 获取manifest文件中配置的字符串
 */
public static String getMetaDataString(Context context, String key) {
    Bundle metaData = null;
    try {
        metaData = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA).metaData;
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (metaData != null) {
        String result = String.valueOf(metaData.get(key));
        return result;
    }
    return "";
}

代码运行其他的没问题,就是获取微信和新浪的 APP_ID的时候,老是获取到的null,这就比较恼火了,我检查配置是一样的啊。

然后就怀疑可能是哪抛异常了,一看控制台果然是,异常是 Float/Integer cannot cast to String,一看微信和新浪的APP_ID果然全是数字,可能系统给解析成整形或浮点型给保存到Bundle中了,难道要手动判断类型然后解析吗?

    如果那样就太麻烦了,检查AndroidManifest.xml文件,看到微信的配置里有这样的代码

Android 获取manifest.xml中meta-data值遇到的问题_第1张图片

我灵机一动,我是不是也可以在配置文件中添加一些字符,这样就统一用字符串来解析就可以了,然后修改配置,改成如下

Android 获取manifest.xml中meta-data值遇到的问题_第2张图片

运行,然后代码中再把获取到的字符串中的sina,tencent给去掉,就OK了。

你可能感兴趣的:(android,meta-data)