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 中不存在