一般项目中有防盗版的需求,必须是正版软件才能使用,这就需要获取当前安装包的签名信息和提前规定的签名,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 布局很简单 因此不再多说了 不说了上图 比如获取微博的签名信息。