更换获取更新接口
This commit is contained in:
@ -9,18 +9,14 @@ import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.pm.Signature;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.util.ArrayMap;
|
||||
import android.text.TextUtils;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.gh.gamecenter.entity.GameUpdateEntity;
|
||||
import com.gh.gamecenter.manager.FilterManager;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.security.cert.CertificateException;
|
||||
import java.security.cert.CertificateFactory;
|
||||
import java.security.cert.X509Certificate;
|
||||
@ -31,65 +27,6 @@ public class PackageUtils {
|
||||
|
||||
public static final String publicKey = "OpenSSLRSAPublicKey{modulus=a8c4bb5748fec8d5c35db1a7a182d41ba4721a91131a417330af79ef4ddb43f9fa0ff4907b0a613bfe152de0ed8fc1b2e6f94a908aa98a5f7adc1ce814ba7ec919d75d9910bdfd8649b4789da6a90ffb61f0d23ac4f828a78fcd0d6f6120c1c43c1f87f7498a89eb40ca8e32dfc2f9d5c10d612b95192870223674e241e53305abf320d7eed76ded398778576e4db7b17b3bc6a792f13de5e43a6a5fae4276c73e6990ce97f68dff0ec16fc9594f175c8d49cd0d7877340d9de60942ca0efc737e50b6c295dfe0713e4532b4e810e1ea11b702b4a27753e41559cbceb247e7f044ec4e3ab2e8bccd8b9fd71286e63307550bcde86deee95adb8133076269135b,publicExponent=10001}";
|
||||
|
||||
/*
|
||||
* 根据apk路径,获取apk的签名信息,耗时
|
||||
*/
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public static String getApkSignatureByPath(Context context, String path) {
|
||||
String PATH_PackageParser = "android.content.pm.PackageParser";
|
||||
try {
|
||||
// apk包的文件路径
|
||||
// 这是一个Package 解释器, 是隐藏的
|
||||
// 构造函数的参数只有一个, apk文件的路径
|
||||
// PackageParser packageParser = new PackageParser(apkPath);
|
||||
Class pkgParserCls = Class.forName(PATH_PackageParser);
|
||||
Class[] typeArgs = new Class[1];
|
||||
typeArgs[0] = String.class;
|
||||
Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);
|
||||
Object[] valueArgs = new Object[1];
|
||||
valueArgs[0] = path;
|
||||
Object pkgParser = pkgParserCt.newInstance(valueArgs);
|
||||
// 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况
|
||||
DisplayMetrics metrics = new DisplayMetrics();
|
||||
metrics.setToDefaults();
|
||||
// PackageParser.Package mPkgInfo = packageParser.parsePackage(new
|
||||
// File(apkPath), apkPath,
|
||||
// metrics, 0);
|
||||
typeArgs = new Class[4];
|
||||
typeArgs[0] = File.class;
|
||||
typeArgs[1] = String.class;
|
||||
typeArgs[2] = DisplayMetrics.class;
|
||||
typeArgs[3] = Integer.TYPE;
|
||||
Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(
|
||||
"parsePackage", typeArgs);
|
||||
valueArgs = new Object[4];
|
||||
valueArgs[0] = new File(path);
|
||||
valueArgs[1] = path;
|
||||
valueArgs[2] = metrics;
|
||||
valueArgs[3] = PackageManager.GET_SIGNATURES;
|
||||
Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,
|
||||
valueArgs);
|
||||
|
||||
typeArgs = new Class[2];
|
||||
typeArgs[0] = pkgParserPkg.getClass();
|
||||
typeArgs[1] = Integer.TYPE;
|
||||
Method pkgParser_collectCertificatesMtd = pkgParserCls
|
||||
.getDeclaredMethod("collectCertificates", typeArgs);
|
||||
valueArgs = new Object[2];
|
||||
valueArgs[0] = pkgParserPkg;
|
||||
valueArgs[1] = PackageManager.GET_SIGNATURES;
|
||||
pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);
|
||||
// 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开
|
||||
Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField(
|
||||
"mSignatures");
|
||||
Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);
|
||||
return parseSignature(info[0].toByteArray())[0];
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* 根据路径,获取apk的包名
|
||||
*/
|
||||
@ -104,6 +41,9 @@ public class PackageUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* 获取meta-data
|
||||
*/
|
||||
public static Object getMetaData(Context context, String packageName, String name) {
|
||||
try {
|
||||
Bundle metaDate = context.getPackageManager().getApplicationInfo(
|
||||
@ -120,8 +60,7 @@ public class PackageUtils {
|
||||
/*
|
||||
* 根据包名,获取apk的签名信息
|
||||
*/
|
||||
public static String getApkSignatureByPackageName(Context context,
|
||||
String packageName) {
|
||||
public static String getApkSignatureByPackageName(Context context, String packageName) {
|
||||
try {
|
||||
PackageInfo packageInfo = context.getPackageManager()
|
||||
.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
|
||||
@ -133,6 +72,31 @@ public class PackageUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* 判断是否可以更新
|
||||
*/
|
||||
public static boolean isCanUpdate(Context context, GameUpdateEntity gameUpdateEntity) {
|
||||
// 判断是否gh_version是否相同
|
||||
String gh_version = (String) PackageUtils.getMetaData(
|
||||
context, gameUpdateEntity.getPackageName(), "gh_version");
|
||||
if (gh_version != null) {
|
||||
gh_version = gh_version.substring(2);
|
||||
// 判断gh_version是否相同
|
||||
if (gh_version.equals(gameUpdateEntity.getGhVersion())) {
|
||||
// 判断version是否相同
|
||||
String version = PackageUtils.getVersionByPackage(
|
||||
context, gameUpdateEntity.getPackageName());
|
||||
if (version != null && version.equals(gameUpdateEntity.getVersion())) {
|
||||
// 版本相同,无需显示插件更新,继续查看是否有可更新的游戏包
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* 判断是否是插件包
|
||||
*/
|
||||
@ -144,16 +108,16 @@ public class PackageUtils {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* 根据apk路径,获取apk包名、签名 根据包名 判断 是否已安装游戏 根据签名 判断 是否一致
|
||||
*
|
||||
* @param path apk路径
|
||||
* @return true 可执行安装 false 要卸载已安装的,再执行安装
|
||||
*/
|
||||
public static boolean isCanLaunchSetup(Context context, String path) {
|
||||
String packageName = getPackageNameByPath(context, path);
|
||||
|
||||
boolean isContain = isContain(context, packageName);
|
||||
if (TextUtils.isEmpty(packageName)) {
|
||||
return true;
|
||||
}
|
||||
boolean isContain = com.gh.gamecenter.manager.PackageManager.isInstalled(packageName);
|
||||
if (!isContain) {
|
||||
return true;
|
||||
}
|
||||
@ -229,6 +193,9 @@ public class PackageUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
/*
|
||||
* 获取apk的版本
|
||||
*/
|
||||
public static String getVersionByPackage(Context context, String packageName) {
|
||||
try {
|
||||
return context.getPackageManager().getPackageInfo(packageName,
|
||||
@ -239,12 +206,8 @@ public class PackageUtils {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
/*
|
||||
* 获取所有已安装的软件的包名、版本(非系统应用)
|
||||
*
|
||||
* @param context
|
||||
* 上下文
|
||||
* @return 已安装软件的包名的集合
|
||||
*/
|
||||
public static ArrayList<String> getAllPackageName(Context context) {
|
||||
FilterManager filterManager = new FilterManager(context);
|
||||
@ -263,6 +226,9 @@ public class PackageUtils {
|
||||
return list;
|
||||
}
|
||||
|
||||
/*
|
||||
* 启动应用
|
||||
*/
|
||||
public static void launchApplicationByPackageName(Context context,
|
||||
String packageName) {
|
||||
Intent intent = context.getPackageManager().getLaunchIntentForPackage(
|
||||
@ -294,33 +260,8 @@ public class PackageUtils {
|
||||
* 根据包名,判断是否已安装该游戏
|
||||
*/
|
||||
public static boolean isInstalled(Context context, String packageName) {
|
||||
Intent intent = context.getPackageManager().getLaunchIntentForPackage(
|
||||
packageName);
|
||||
if (intent == null) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static ArrayMap<String, Boolean> map;
|
||||
|
||||
public static boolean isContain(Context context, String packageName) {
|
||||
if (TextUtils.isEmpty(packageName)) {
|
||||
return false;
|
||||
}
|
||||
if (map == null) {
|
||||
map = new ArrayMap<>();
|
||||
List<PackageInfo> infos = context.getPackageManager()
|
||||
.getInstalledPackages(0);
|
||||
for (PackageInfo info : infos) {
|
||||
map.put(info.packageName, true);
|
||||
}
|
||||
}
|
||||
Boolean b = map.get(packageName);
|
||||
if (b != null) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
|
||||
return intent != null;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -347,13 +288,4 @@ public class PackageUtils {
|
||||
return installIntent;
|
||||
}
|
||||
|
||||
public static String getInstalledApkPath(Context context, String packageName) {
|
||||
try {
|
||||
return context.getPackageManager().getApplicationInfo(packageName,
|
||||
0).sourceDir;
|
||||
} catch (NameNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user