转载请标明出处: http://write.blog.csdn.net/postedit/45721779 作者:skay
一般项目中有防盗版的需求,必须是正版软件才能使用,这就需要获取当前安装包的签名信息和提前规定的签名,Md5值做验证,或者发布时候要检验apk签名信息以防止发错包,造成不必要的损失。
获取签名信息,通过遍历已安装的apk 获得安装过的对应apk是否与已知apk签名一致
,包名你也可以指定任意已安装过的apk,可以获取第三方apk的签名.
/**
* 获取签名信息
*
* @param aContext
* Context
* @return 签名String
*/
@SuppressWarnings("unused")
private byte[] getSign(String mPakgeName) {
List<PackageInfo> apps = pManager.getInstalledPackages(PackageManager.GET_SIGNATURES);
Iterator<PackageInfo> iter = apps.iterator();
PackageInfo info;
while (iter.hasNext()) {
info = iter.next();
if (TextUtils.equals(info.packageName, mPakgeName)) {
if (info.signatures.length > 0) {
return info.signatures[0].toCharsString().getBytes();
}
}
}
return null;
}
2 得到字节后 ,需要转化出成md5
/** 得到签名.
* @param mPakgeName
* @return
*/
private String getgetSignMd5(String mPakgeName) {
byte[] signatture = getSign(mPakgeName);
if (signatture == null) {
return null;
}
if (TextUtils.isEmpty(signatture.toString())) {
return null;
}
try {
digest = MessageDigest.getInstance("Md5");
digest.update(signatture);
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//此处为第三方应用使用的签名算法
byte[] b = digest.digest();
char[] HEXCHAR = {
//列举一个签名算法 ,此处应是你方应用自己的算法
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};
StringBuilder sb = new StringBuilder(b.length * 2);
for (int i = 0; i < b.length; i++) {
sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);
sb.append(HEXCHAR[(b[i] & 0x0f)]);
}
return sb.toString();
}
3 有时候我们需要获得非系统apk应用信息
/** 获取非预装的app
* @return
*/
public static List<PackageInfo> getAllApps() {
apps = new ArrayList<PackageInfo>();
paklist = pManager.getInstalledPackages(0);
for (int i = 0; i < paklist.size(); i++) {
PackageInfo pak = (PackageInfo) paklist.get(i);
//判断是否为非系统预装的应用程序
if ((pak.applicationInfo.flags & pak.applicationInfo.FLAG_SYSTEM) <= 0) {
apps.add(pak);
}
}
return apps;
}
xml 布局很简单 因此不再多说 不说了。比如获取微博的签名信息(传入微博的包名即可)。
apk下载地址:http://download.csdn.net/detail/sk719887916/8828765