问题:
1,获取的shar1不同
2,直接运行到手机上没有服务,比如定位失败,导航失败;打包后是有服务的,有时候,直接运行上去又服务,打包后没有服务了,APP要上线了,出这样的问题,毫无头绪,好着急,好尴尬啊,好慌乱啊。。。。。
定位失败,导航失败,获取经纬度失败,都是这个shar1惹的祸。。。
Android studio,eclipse开发中,会经常使用到第三方的比如定位等,百度定位,导航,高德定位导航等等的服务功能,使用这个第三方的服务
首先,需要在高德或者百度的开发者官方注册账号,
然后,需要生成一个key
但是在生成这个key的过程中,需要提供一个SHAR1值,如果是eclipse开发还需要提供一个包名,如果是as开发还需要提供applicationId(在app目录下面的build.gradle里面),
最后,生成了key,在APP的配置文件中加以配置,这个key就相当于一把钥匙,钥匙需要第三方服务知道这是一个合法的key,然后第三方才会给APP提供服务,这个key第三方获取到以后怎么判断合法不合法????,就是通过这个shar1进行判断的。所以,shar1是可以得到第三方服务的关键,必须保证这个shar1的正确性
今天的重点就是讨论这个SHAR1的问题,
先说说shar1的获取方式:
方式1:直接获取
eclipse的话:
直接点击window–>preferences–>android–>build
方式2:使用 keytool(jdk自带工具)获取 SHA1
打开电脑命令行,依次输入命令:
1,cmd
2,cd .android
3,keytool -list -v -keystore 打包秘钥文件路径\秘钥
比如:keytool -list -v -keystore C:\Users\company\key\ditudemo_key.jks
4,输入秘钥库口令(就是打包时候的密码)
回车就搞定了
如果是Android studio
方式3,
打开as的terminal
依次输入命令
1,keytool -list -v -keystore 打包秘钥文件路径\秘钥
比如:keytool -list -v -keystore C:\Users\company\key\ditudemo_key.jks
2,输入秘钥库口令(就是打包时候的密码)
方式4,(高德官方提供的)
public static String sHA1(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;
}
但是问题的重点不是这怎么获取这个shar1,而是shar1,不同的获取方式得到的结果不同,明明是通过正确的方式获取的shar1,正确的shar1,怎么就获取不到服务呢?这是为什么呢?
其实,①第一种获取方式和最后一种获取方式,可以看成是同一种,得到的结果也是相同的,②第二种第三种也是得到的相同的结果,然而,①②两大类的获取到的结果是不同的,这是为什么呢?
要回答这个问题,就得知道这个shar1到底是什么,它是怎么产生的,它的产生和什么有关系?????????
其实是因为,①大类获取shar1的方式是default的方式,是没有打包的,是和签名文件也就是秘钥文件没有产生关联的,就算是有关联也是debug版本的key,debug版本的秘钥,这个debug版本的秘钥是系统自动生成的;
②大类的shar1获取过程是明确通过秘钥文件生成的,因为你看到了啊,明确给出了秘钥的路劲和秘钥文件这个秘钥是开发者自己创建的,是release版本的key,release版本的秘钥