SHAR1,获取不同,release版本SHAR1,debug版本SHAR1,导致定位失败,经纬度获取为0

来源:互联网 发布:淘宝渠道管理在哪里 编辑:程序博客网 时间:2024/06/10 01:31

问题:

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版本的秘钥

总结来说:打包程序,(必须要使用开发者自己创建的key文件,是release版本的key)获取的shar1是根据release版本的key生成的;————–;不打包程序,(是直接点击开发工具运行到手机上的,使用的是默认系统给出的系统默认的debug版本的key)是根据debug版本的key生成的,【两个shar1肯定是不同的,】debug版本的shar1,直接运行到APP上就可以获取服务,但是打包后就获取不到服务了,release版本的shar1打包后可以获取到服务,但是直接运行到手机上是不能获取到服务的

这里写图片描述

你瞧,default debug keystore: debug.keystore异常的亮眼啊。。。。不是事情太诡异,而是我们没有太仔细,是我们没有太细心,任何时候,都要仔细,细心,耐心的分析问题产生的原因,慌乱解决不了问题,只会让事情更糟糕,让心情更暴躁,让同事更觉得你是个low逼,寻根究底,一探究竟,原来问题是如此的简单。。。。。。