随笔-348  评论-598  文章-0  trackbacks-0
之前写了一片文章介绍了应用内外的签名比较(在Android系统外部和内部读取Android应用的签名),发现在某些机器上,读取安装包的签名有的时候为空,所以找了其他办法。
    public static String getPathWithPackageName(Context paramContext,
            String paramString) {
        PackageManager pm = paramContext.getPackageManager();
        try {
            PackageInfo pi = pm.getPackageInfo(paramString, 1);
            System.out.println(pi.applicationInfo.publicSourceDir);
            return pi.applicationInfo.publicSourceDir;
        } catch (PackageManager.NameNotFoundException localNameNotFoundException) {

        }
        return null;
    }

    public static String getFileSignatureMd5(String filePath) {
        try {
            JarFile jarFile = new JarFile(filePath);
            JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml");
            if (jarEntry != null) {
                try {
                    Certificate[] certs = jarEntry.getCertificates();
                    byte[] certBytes = certs[0].getEncoded();
                    String main = StringUtilities
                            .bytesToHexString(CryptoUtilities
                                    .encryptByMD5(certBytes));
                    System.out.println("new to Char " + main.length() + " apk:"
                            + main);
                    return main;
                } catch (CertificateEncodingException localCertificateEncodingException) {

                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    Handler handler3;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        String installedPath = getPathWithPackageName(this,
                "cn.emagsoftware.gamehall");
        System.out.println("installedPath=" + installedPath);
        String installedSig = getFileSignatureMd5(installedPath);
        System.out.println("installedSig=" + installedSig);

        String apk = "/sdcard/1.apk";
        String remoteSig = getFileSignatureMd5(apk);
        System.out.println("remoteSig=" + remoteSig);
        System.out.println(installedSig.equals(remoteSig));
    }










---------------------------------------------------------
专注移动开发

Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2012-07-04 21:18 TiGERTiAN 阅读(1647) 评论(0)  编辑  收藏 所属分类: Android

只有注册用户登录后才能发表评论。


网站导航: