Android 根据包名,获取应用程序的签名

前言

最近在做一键分享功能。集成微信分享时,需要获取应用程序的签名,微信开放平台也提供了相应的小工具(下载地址),帮助我们获得签名。坑就坑在,这个小工具直接把签名字符串写在了 TexView ,不开源,不输出日志,不能拷贝,只能手抄。这点是非常不舒服的。

在这里插入图片描述

所以,我花了点时间,根据它的源代码,另外做了一个小工具。核心代码基本是参考微信的,没有做改动。

核心代码

MainActivity.Java

  /**
     * 输出成功信息
     * @param code
     */
    private void stdout(String code) {
    
    
        mTvSuccessResult.setText(code);
 
        // 输出正确日志
        Log.d(TAG, "stdout() called with: " + "code = [" + code + "]");
    }
 
    /**
     * 输出错误信息
     * @param reason
     */
    private void errout(String reason) {
    
    
        mTvErrorResult.setText(reason);
 
        // 输出错误日志
        Log.d(TAG, "errout() called with: " + "reason = [" + reason + "]");
    }
 
    private Signature[] getRawSignature(Context paramContext, String paramString) {
    
    
        if ((paramString == null) || (paramString.length() == 0)) {
    
    
            errout("获取签名失败,包名为 null");
            return null;
        }
        PackageManager localPackageManager = paramContext.getPackageManager();
        PackageInfo localPackageInfo;
        try {
    
    
            localPackageInfo = localPackageManager.getPackageInfo(paramString, PackageManager.GET_SIGNATURES);
            if (localPackageInfo == null) {
    
    
                errout("信息为 null, 包名 = " + paramString);
                return null;
            }
        } catch (PackageManager.NameNotFoundException localNameNotFoundException) {
    
    
            errout("包名没有找到...");
            return null;
        }
        return localPackageInfo.signatures;
    }
 
    /**
     * 开始获得签名
     * @param packageName 报名
     * @return
     */
    private void getSign(String packageName) {
    
    
        Signature[] arrayOfSignature = getRawSignature(this, packageName);
        if ((arrayOfSignature == null) || (arrayOfSignature.length == 0)){
    
    
            errout("signs is null");
            return;
        }
 
        stdout(Md5.getMessageDigest(arrayOfSignature[0].toByteArray()));
    }

MD5.java

public final class Md5
{
    
    
    public static final String getMessageDigest(byte[] paramArrayOfByte)
    {
    
    
        char[] arrayOfChar1 = {
    
     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102 };
        try
        {
    
    
            MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
            localMessageDigest.update(paramArrayOfByte);
            byte[] arrayOfByte = localMessageDigest.digest();
            int i = arrayOfByte.length;
            char[] arrayOfChar2 = new char[i * 2];
            int j = 0;
            int k = 0;
            while (true)
            {
    
    
                if (j >= i)
                    return new String(arrayOfChar2);
                int m = arrayOfByte[j];
                int n = k + 1;
                arrayOfChar2[k] = arrayOfChar1[(0xF & m >>> 4)];
                k = n + 1;
                arrayOfChar2[n] = arrayOfChar1[(m & 0xF)];
                j++;
            }
        }
        catch (Exception localException)
        {
    
    
        }
        return null;
    }
 
    public static final byte[] getRawDigest(byte[] paramArrayOfByte)
    {
    
    
        try
        {
    
    
            MessageDigest localMessageDigest = MessageDigest.getInstance("MD5");
            localMessageDigest.update(paramArrayOfByte);
            byte[] arrayOfByte = localMessageDigest.digest();
            return arrayOfByte;
        }
        catch (Exception localException)
        {
    
    
        }
        return null;
    }
}

效果

在这里插入图片描述

在这里插入图片描述

到此完成,谢谢惠顾

猜你喜欢

转载自blog.csdn.net/zxz_zxz_zxz/article/details/131044868