Android 使用代码获取签名信息

在使用百度地图,微信分享等等第三方SDK的时候,都需要在对应的网站上注册应用信息,其中之一就是通过包名和签名生成一个MD5或者SHA1编码的字符串。

通常情况下,这些信息可以通过ADT工具或者keytool命令工具去获取,这两种方式百度有很多就不再累述了。主要说一下怎么使用代码获取这些信息,然后也方便使用,不像微信提供的签名工具那么抠,都不能复制这些信息,极为不方便。

首先看一下使用keytool获取的签名信息:


证书指纹有3个类型,一般要求是前两个。这里就直接贴上代码获取这些证书指纹。

<span style="font-family: Arial, Helvetica, sans-serif;">/**</span>
 * 应用签名信息
 * Created by Carlton on 2014/11/27.
 */
public class AppSigning
{
    public final static String MD5    = "MD5";
    public final static String SHA1   = "SHA1";
    public final static String SHA256 = "SHA256";

    /**
     * 返回一个签名的对应类型的字符串
     *
     * @param context
     * @param packageName
     * @param type
     *
     * @return
     */
    public static ArrayList<String> getSingInfo(Context context, String packageName, String type)
    {
        ArrayList<String> result = new ArrayList<String>();
        try
        {
            Signature[] signs = getSignatures(context, packageName);
            for (Signature sig : signs)
            {
                String tmp = "error!";
                if (MD5.equals(type))
                {
                    tmp = getSignatureString(sig, MD5);
                }
                else if (SHA1.equals(type))
                {
                    tmp = getSignatureString(sig, SHA1);
                }
                else if (SHA256.equals(type))
                {
                    tmp = getSignatureString(sig, SHA256);
                }
                result.add(tmp);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 返回对应包的签名信息
     *
     * @param context
     * @param packageName
     *
     * @return
     */
    public static Signature[] getSignatures(Context context, String packageName)
    {
        PackageInfo packageInfo = null;
        try
        {
            packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
            return packageInfo.signatures;
        }
        catch (PackageManager.NameNotFoundException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 获取相应的类型的字符串(把签名的byte[]信息转换成16进制)
     *
     * @param sig
     * @param type
     *
     * @return
     */
    public static String getSignatureString(Signature sig, String type)
    {
        byte[] hexBytes = sig.toByteArray();
        String fingerprint = "error!";
        try
        {
            MessageDigest digest = MessageDigest.getInstance(type);
            if (digest != null)
            {
                byte[] digestBytes = digest.digest(hexBytes);
                StringBuilder sb = new StringBuilder();
                for (byte digestByte : digestBytes)
                {
                    sb.append((Integer.toHexString((digestByte & 0xFF) | 0x100)).substring(1, 3));
                }
                fingerprint = sb.toString();
            }
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }

        return fingerprint;
    }
}
如果你的keystore里面就只有一个签名信息,那么可以这样获取,以获取MD5为例:
String md5Info= AppSigning.<span style="font-family: Arial, Helvetica, sans-serif;">getSingInfo(context, "com.xxx",AppSigning.MD5).get(0);</span>
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值