转载请标明出处: 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(); }
/** 获取非预装的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