NO IMAGE

在開發中可能會遇到 獲取app的版本號、渠道號。因此簡單整理一下。

原始碼下載:http://download.csdn.net/detail/gl_mine_csdn/9756756點選開啟連結

class ChannelUtils {
private static final String CHANNEL_KEY = "";//預設的通道
private static final String CHANNEL_VERSION_KEY = "";//預設的通道的版本號
private static String mChannel;//channel
private static String mDefaultChannel = "qihoo";
/**
     * 返回市場。  如果獲取失敗返回""
     *
     * @param context
     * @return
     */
    public static String getChannel(Context context) {
//#1、使用第三方工具
//        return WalleChannelReader.getChannel(context.getApplicationContext());
//由於360要打加固包,之後META-INF資料全部被改,所以取預設channel
//#2、自己建立工具類
return getChannel(context, mDefaultChannel);
}
/**
     * 返回市場。  如果獲取失敗返回defaultChannel
     *
     * @param context
     * @param defaultChannel
     * @return
     */
    private static String getChannel(Context context, String defaultChannel) {
//1、記憶體中獲取
if (!TextUtils.isEmpty(mChannel)) {
return mChannel;
}
//2、sp中獲取
mChannel = getChannelBySharedPreferences(context);
if (!TextUtils.isEmpty(mChannel)) {
return mChannel;
}
//3、從apk中獲取
mChannel = getChannelFromApk(context, CHANNEL_KEY);
if (!TextUtils.isEmpty(mChannel)) {
//儲存sp中備用
saveChannelBySharedPreferences(context, mChannel);
return mChannel;
}
//全部獲取失敗
return defaultChannel;
}
/**
     * 從apk中獲取版本資訊
     *
     * @param context
     * @param channelKey
     * @return
     */
    private static String getChannelFromApk(Context context, String channelKey) {
//從apk包中獲取
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
//預設放在meta-inf/裡, 所以需要再拼接一下
String key = "META-INF/"   channelKey;
String ret = "";
ZipFile zipfile = null;
try {
zipfile = new ZipFile(sourceDir);//獲取壓縮包檔案
Enumeration<?> entries = zipfile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = ((ZipEntry) entries.nextElement());
String entryName = entry.getName();
if (entryName.startsWith(key)) {
ret = entryName;
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zipfile != null) {
try {
zipfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String[] split = ret.split("_");
String channel = "";
if (split != null && split.length >= 3) {//此處需要和app本身的包名有關
channel = split[2];//獲取channel名
//channel = ret.substring(split[0].length()   1);
}
return channel;
}
/**
     * 本地儲存channel & 對應版本號
     *
     * @param context
     * @param channel
     */
    private static void saveChannelBySharedPreferences(Context context, String channel) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sp.edit();
editor.putString(CHANNEL_KEY, channel);
editor.putInt(CHANNEL_VERSION_KEY, getVersionCode(context));
editor.apply();
}
/**
     * sp---->獲取channel
     *
     * @param context
     * @return 為空表示獲取異常、sp中的值已經失效、sp中沒有此值
     */
    private static String getChannelBySharedPreferences(Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
int currentVersionCode = getVersionCode(context);
if (currentVersionCode == -1) {
//獲取錯誤
return "";
}
int versionCodeSaved = sp.getInt(CHANNEL_VERSION_KEY, -1);
if (versionCodeSaved == -1) {
//本地沒有儲存的channel對應的版本號
//第一次使用  或者 原先儲存版本號異常
return "";
}
if (currentVersionCode != versionCodeSaved) {
return "";
}
return sp.getString(CHANNEL_KEY, "");
}
/**
     * 包資訊----->獲取版本號
     *
     * @param context
     * @return
     */
    private static int getVersionCode(Context context) {
try {
return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return -1;
}
}