【问题标题】:Can I somehow get errors occur during getMapAsync call?我可以在 getMapAsync 调用期间以某种方式出现错误吗?
【发布时间】:2020-02-01 02:08:50
【问题描述】:

如果我故意断开设备与互联网的连接或输入错误的 API 密钥,则调用 SupportMapFragment.getMapAsync GoogleMaps 只会显示灰屏

似乎没有办法从 GoogleMaps SDK 获得或多或少的描述性错误。

我尝试调用MapsInitializer.initialize(context),但它总是返回ConnectionResult.SUCCESS,即使设备离线,MapFragment 也只是显示灰屏。

那么有什么方法可以从 Google Maps SDK 中获取一些描述性错误,而不仅仅是灰屏?

【问题讨论】:

    标签: android google-maps


    【解决方案1】:

    无论如何,您可以为您的密钥启用一些通过 URL(路线、静态地图等)访问的 API,例如对于Places API

    https://maps.googleapis.com/maps/api/place/details/json?place_id=ChIJN1t_tDeuEmsRUsoyG83frY4&fields=name,rating,formatted_phone_number&key=YOUR_API_KEY
    

    并尝试通过HttpURLConnection 请求使用它。在HttpURLConnection 回复中,你得到了你需要的东西。如果 API 密钥无效,例如:

    {
       "error_message" : "You must use an API key to authenticate each request to Google Maps Platform APIs. For additional information, please refer to http://g.co/dev/maps-no-account",
       "html_attributions" : [],
       "status" : "REQUEST_DENIED"
    }
    

    更新:

    移动原生静态地图(Maps SDK for Android 或 Maps SDK for iOS 移动应用程序中的 Google 地图对象)has no usage limits,因此无需检查是否超出地图使用限制。其他问题,如没有互联网连接、没有安装 Google Play 服务等,您可以测试其他方式。例如。 this 用于 Internet 连接测试(您也可以 ping https://www.google.com/maps),that 用于检测已安装的 Google Play 服务,无论如何,您可以在将其显示给用户之前检测“灰屏”,例如,将相机位置设置为放置具有完全已知的“非灰色” - 颜色(海洋或森林)位置并检查屏幕像素颜色。要在后台获取地图位图,您可以使用that 之类的解决方案。

    【讨论】:

    • 感谢您的建议!它回答了这个问题,但只是部分回答了这个问题。仍然不知道如何处理超出地图使用限制。我几乎不相信 Places API 限制在某种程度上与 GoogleMaps API 使用限制有关。也仍然不知道如何处理developers.google.com/android/reference/com/google/android/gms/…中列出的其他可能的问题
    • 似乎 Maps SDK for Android 本身没有使用限制。限制有certain APIs
    • 要检查灰色区域,您只需执行googleMap.snapshot { bitmap -> }
    • @AndriiOmelchenko 好吧,gmap 是否有限制仍然无关紧要。如果某些团队成员不小心撤销了 gmaps 密钥或谷歌这样做了,或者发生了其他事情,这个答案仍然只是一种解决方法。我不想经历所有可能发生的事情,我只想有一个简单的机制来通知移动开发人员 gmaps 没有显示并且只是用某种错误代码或类似任何其他 API 的东西变灰。遗憾的是,但似乎无法从 gmaps API 获取错误详细信息。
    • @EugeneBrusov 是的,它只是解决方法。但是,如果您的目标不是从 gmaps API 获取错误详细信息,而是在将其显示给用户之前检测“灰屏”,您可以成功使用它:)
    【解决方案2】:

    MapsInitializer.initialize(context) 初始化适用于 Android 的 Google Maps SDK,以便其类可供使用。如果您正在使用 MapFragment 或 MapView 并且已经通过对这些类中的任何一个调用 getMapAsync() 获得(非空)GoogleMap,则没有必要调用它。

    检查谷歌地图对象是否为空

    @Override
        public void onMapReady(GoogleMap map) {
    if(map!=null)
            map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
      else
    

    { //不工作 } }

    在 ready 事件上试试这个。

     public boolean isInternetAvailable() {
            try {
                InetAddress ipAddr = InetAddress.getByName("google.com"); 
                //You can replace it with your name
                    return !ipAddr.equals("");
    
                } catch (Exception e) {
                    return false;
            }
        }
    

    【讨论】:

    • 不确定它是否为之前的答案增加了任何价值。即使某些团队成员撤销 gmap 密钥或 Google 执行此操作,或者发生其他无法通过简单的互联网可用性检查处理的事情,地图对象也始终为 NOT-null。
    猜你喜欢
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-06-14
    • 2019-05-29
    • 2017-04-07
    • 1970-01-01
    相关资源
    最近更新 更多