AS自定义keystore获取SHA1

why?

根据项目需求地图使用高德地图,学习其开发文档时遇到了如何去获取应用的SHA1值的问题.虽然先前有操作过获取SHA1值的相关步骤,但记忆终究是模糊的.于是就想借此机会,认真仔细的将整个流程重新正规的学习一遍,并记录于此,以便日后需要.

How?

1.学习链接:  http://blog.csdn.net/nimasike/article/details/51457229
2.高德开发文档:  http://lbs.amap.com/faq/top/hot-questions/249

keystore 文件为 Android 签名证书文件


步骤开始:

A:keystore的XXX.jks以及apk的创建

1.我在workspace文件夹的附近单独新建了一个属于keystore的文件夹,统一放置所有应用自定义生成的keystore(例如:XXX.jks).以 便日后管理.当然也可根据个人喜好将应用的key store path选择在当前应用比较好找的位置下.
2.创建新的keystore :  Build --->> Generate Signed APK
3.点击对话框的Create New
4.填写相应信息:
key store path: 选择路径 --->> 如步骤1
key store password:密钥库密码
key Alias:别名
key password:秘钥密码
First  and Last Name:根据自己喜好随意填写一个名字
5.步骤4结束后将直接弹出一个需要输入刚刚所设置的密码的界面,输入密码完毕后Next.
6.选择发布app的路径,默认即可.选择release方式发布.
应用的apk就成功生成了,可到对应的文件夹下找到该apk

B:如何在debug时,配置使用自定义的keystore.
1.用刚刚创建的keystore
2.右键项目,选择 Open Module Settings 看图操作 --->> 右边信息填写


3.分别选择debug和release 都设置为刚才填进去的keystore,比如我刚刚上图填写的Name:gaodeditu  看图操作


4.查看APP的配置文件



C:测试apk是否使用了自定义的keystore

1.打开Android Studio的Terminal工具

2.输入命令:keytool -v -list -keystore keystore文件路径(D:\android\workspace\keystore\gaodeditu.jks)

3.输入Keystore密码,便可查看到SHA1值  看图



4.代码获取SHA1值

//这个是获取SHA1的方法  
public static String getSHA1(Context context) {  
    //获取包管理器  
    PackageManager pm = context.getPackageManager();  
    //获取当前要获取SHA1值的包名,也可以用其他的包名,但需要注意,  
    //在用其他包名的前提是,此方法传递的参数Context应该是对应包的上下文。  
    String packageName = context.getPackageName();  
    //返回包括在包中的签名信息  
    int flags = PackageManager.GET_SIGNATURES;  
    PackageInfo packageInfo = null;  
    try {  
        //获得包的所有内容信息类  
        packageInfo = pm.getPackageInfo(packageName, flags);  
    } catch (PackageManager.NameNotFoundException e) {  
        e.printStackTrace();  
    }  
    //签名信息  
    Signature[] signatures = packageInfo.signatures;  
    byte[] cert = signatures[0].toByteArray();  
    //将签名转换为字节数组流  
    InputStream input = new ByteArrayInputStream(cert);  
    //证书工厂类,这个类实现了出厂合格证算法的功能  
    CertificateFactory cf = null;  
    try {  
        cf = CertificateFactory.getInstance("X509");  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    //X509证书,X.509是一种非常通用的证书格式  
    X509Certificate c = null;  
    try {  
        c = (X509Certificate) cf.generateCertificate(input);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    String hexString = null;  
    try {  
        //加密算法的类,这里的参数可以使MD4,MD5等加密算法  
        MessageDigest md = MessageDigest.getInstance("SHA1");  
        //获得公钥  
        byte[] publicKey = md.digest(c.getEncoded());  
        //字节到十六进制的格式转换  
        hexString = byte2HexFormatted(publicKey);  
    } catch (NoSuchAlgorithmException e1) {  
        e1.printStackTrace();  
    } catch (CertificateEncodingException e) {  
        e.printStackTrace();  
    }  
    return hexString;  
}  
//这里是将获取到得编码进行16进制转换  
private static String byte2HexFormatted(byte[] arr) {  
    StringBuilder str = new StringBuilder(arr.length * 2);  
    for (int i = 0; i < arr.length; i++) {  
        String h = Integer.toHexString(arr[i]);  
        int l = h.length();  
        if (l == 1)  
            h = "0" + h;  
        if (l > 2)  
            h = h.substring(l - 2, l);  
        str.append(h.toUpperCase());  
        if (i < (arr.length - 1))  
            str.append(':');  
    }  
    return str.toString();  
}  

这是高德开发文档提供的获取SHA1值的代码.

publicstatic String getSHA1(Context context) {
    try {
        PackageInfo info = context.getPackageManager().getPackageInfo(
            context.getPackageName(), PackageManager.GET_SIGNATURES);
        byte[] cert = info.signatures[0].toByteArray();
        MessageDigest md = MessageDigest.getInstance("SHA1");
        byte[] publicKey = md.digest(cert);
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < publicKey.length; i++) {
            String appendString = Integer.toHexString(0xFF & publicKey[i])
                .toUpperCase(Locale.US);
            if (appendString.length() == 1)
                hexString.append("0");
                hexString.append(appendString);
                hexString.append(":");
        }
        String result = hexString.toString();
        return result.substring(0, result.length()-1);
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

以上两种获取方式,亲测可用!!!

end~~~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值