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~~~