Android Google Maps Direction Api - Api 密钥限制不起作用

Posted

技术标签:

【中文标题】Android Google Maps Direction Api - Api 密钥限制不起作用【英文标题】:Android Google Maps Direction Api - Api key restriction not working 【发布时间】:2018-02-21 00:36:26 【问题描述】:

当我们为 Google Maps Direction Api 设置 密钥限制NONE 时,它可以正常工作。

但是当我们将 密钥限制 设置为 android 应用程序 并提供正确的包名称和 SHA-1 证书 - 它说请求被 Google Api 响应拒绝。

任何已知的解决方案?

【问题讨论】:

调试还是上线? 两者都不起作用。 【参考方案1】:

Directions API 是一项网络服务。适用于 Web 服务的 API 密钥的限制是 IP 限制。

假设 Web 服务请求在您的后端服务器上执行。如果您需要限制 API 密钥,解决方法是创建中间服务器。您的 Android 应用程序应向中间服务器发送请求,中间服务器应向 Google 发送请求并将响应传回您的应用程序。在这种情况下,您可以通过中间服务器的 IP 地址来限制 API 密钥。

看看这个文件:

https://developers.google.com/maps/faq#using-google-maps-apis

希望这能澄清您的疑问。

【讨论】:

所以我得出的结论是,没有中间服务器的任何一个拥有Api key的人都可以发出请求并获得Direction Api的成功响应。但是他们要求的 SHA-1 指纹呢?应该只有 2 个选项:A)无 B)服务器 IP 地址 带有 SHA1 的 Android 应用限制仅用于 Google Maps Android API,IP 限制用于网络服务(Geocoding API、Directions API 等)。为了保护 Web 服务使用的 API 密钥,您必须从您拥有的服务器发送请求并将其 IP 用作限制。 我觉得奇怪的是,Google Map Direction Api 密钥不能通过提供唯一指纹来受到 Android App 本身的限制。但到目前为止,这是我能得到的最好答案。所以我很感谢你并接受你的回答。【参考方案2】:

您通常会拥有多个证书。一个用于调试,一个用于发布。

确保您添加了两个指纹,或者您使用的证书指纹与您指定的 buildType 匹配

【讨论】:

我做了那个哥们。我只尝试过调试 - 但经过不成功的努力,我确实选择了发布。但两者都失败了。【参考方案3】:

请尝试 编译'com.akexorcist:googledirectionlibrary:1.1.1' 流文档或尝试此方法 第二种方法为动画相机设置 CameraWithCoordinationBounds:

private void drawMap(double s_lat,double s_lng,double e_lat,double e_lng) 
        GoogleDirectionConfiguration.getInstance().setLogEnabled(true);
        Log.e("map", "++");
        List<LatLng> waypoints = Arrays.asList(

                new LatLng(22.626390800000003, 88.4313014), new LatLng(22.619708499999998, 88.4369083)
        );
        GoogleDirection.withServerKey("AIz... your google api key")
                .from(new LatLng(s_lat, s_lng))
                .and(waypoints)
                .to(new LatLng(e_lat, e_lng))
                .transportMode(TransportMode.DRIVING)
                .execute(new DirectionCallback() 
                    @Override
                    public void onDirectionSuccess(Direction direction, String rawBody) 
                        if (direction.isOK()) 
                            mMap.setMinZoomPreference(8f);
                            com.akexorcist.googledirection.model.Route route = direction.getRouteList().get(0);
                            int legCount = route.getLegList().size();
                            for (int index = 0; index < legCount; index++) 
                                Log.e("map", "++++" + index);
                                Leg leg = route.getLegList().get(index);
                                // mMap.addMarker(new MarkerOptions().position(leg.getStartLocation().getCoordination()));

                                if (index == 0) 
                                    Log.e("position","0" + leg.getStartLocation().getCoordination());
                                    //   mMap.addMarker(new MarkerOptions().position(leg.getEndLocation().getCoordination()).title("User"));
                                    mMap.addMarker(new MarkerOptions().position(leg.getStartLocation().getCoordination()).icon(BitmapDescriptorFactory
                                            .fromResource(R.drawable.start_pointer)));
                                 else if (index == legCount - 1) 
                                    //   mMap.addMarker(new MarkerOptions().position(leg.getEndLocation().getCoordination()).title("User"));
                                    mMap.addMarker(new MarkerOptions().position(leg.getEndLocation().getCoordination()).icon(BitmapDescriptorFactory
                                            .fromResource(R.drawable.stop_pointer)));
                                 else 
                                    mMap.addMarker(new MarkerOptions().position(leg.getEndLocation().getCoordination()).icon(BitmapDescriptorFactory
                                            .fromResource(R.drawable.user_point)));
                                
                                List<Step> stepList = leg.getStepList();
                                ArrayList<PolylineOptions> polylineOptionList = DirectionConverter.createTransitPolyline(MainActivity.this, stepList, 5, Color.RED, 3, Color.BLUE);
                                for (PolylineOptions polylineOption : polylineOptionList) 
                                    mMap.addPolyline(polylineOption);
                                
                            
                            setCameraWithCoordinationBounds(route); // animateCamera

                        
                    

                    @Override
                    public void onDirectionFailure(Throwable t) 

                        Log.e("error", t.getLocalizedMessage() + t.getMessage() + "");
                        // Do something
                    
                );
    

  private void setCameraWithCoordinationBounds(com.akexorcist.googledirection.model.Route route) 
        LatLng southwest = route.getBound().getSouthwestCoordination().getCoordination();
        LatLng northeast = route.getBound().getNortheastCoordination().getCoordination();
        LatLngBounds bounds = new LatLngBounds(southwest, northeast);
        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));
    

【讨论】:

您能否从您的回答中解释一下如何限制密钥?

以上是关于Android Google Maps Direction Api - Api 密钥限制不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android studio v0.3.2, gradle, google maps v2.0 找不到类“com.google.android.gms.maps.MapFragment

com.google.android.gms.maps.MapFragment:无法解析符号“地图”

import com.google.android.maps.geopoint 无法解析

com.google.android.maps 在 Android Studio 中不存在

膨胀类 com.google.android.maps.MapView 时出错

Google Maps Android API V2 检查 Google Maps 应用程序是不是被禁用