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的值就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。