【问题标题】:android google map issues安卓谷歌地图问题
【发布时间】:2015-04-15 13:30:43
【问题描述】:

我目前正在构建一个安卓应用程序。我了解基础知识,我做了很多应用程序,但现在我的项目更大了。我的应用程序包含许多包含 NavigationDrawer 的屏幕,这迫使我在我想在我的应用程序上显示的每个类上使用 Fragment 类的扩展。 这是我的问题-前段时间我创建了一个简单的单页谷歌地图屏幕应用程序,它工作得很好。我想在我目前正在开发的应用程序上做同样的事情,但是当我转到页面时它给我的只是左下角屏幕上的谷歌日志,其余的都是灰色的视图(没有显示地图)。我在包括这个网站在内的很多地方搜索了解决方案,我可以得到的答案是它可能与我的 google 给我的 API 密钥有关。我确认了这一点,我很确定它不是来自密钥,因为我将它应用到我的一页谷歌地图应用程序上,它运行良好。我还拥有我检查了 6 次所需的所有权限。所以我的结论是代码中有一些东西阻止了地图的显示。

这是我的代码:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class guide extends Fragment {



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // inflat and return the layout
        View v = inflater.inflate(R.layout.test, container,
                false);

        return v;
    }

    class HoldFragmentPlace extends FragmentActivity{

        private GoogleMap mMap;

        public HoldFragmentPlace(){

        }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // inflat and return the layout
        View v = inflater.inflate(R.layout.test, container,
                false);

        return v;
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

        private void setUpMap() {
            mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
        }


    }

}

我需要让我的 NavigationDrawer 工作的 Fragment 扩展,因此我创建了一个内部类并在那里应用了地图的代码。

这是我的清单中的内容:

     <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="@string/google_maps_key" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission         android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

这是我的地图 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.gms.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        class="com.google.android.gms.maps.SupportMapFragment"
        android:layout_marginTop="-470dp" />

</LinearLayout>

我还尝试了 Java 代码的其他一些变体,其中一些不包含内部类,结果仍然相同。我要么遗漏了一些非常基本的东西,要么误解了有关 Android 的一些概念。如果您已阅读感谢您抽出宝贵的时间!

【问题讨论】:

    标签: java android google-maps


    【解决方案1】:

    检查 APK 签名。您必须在测试中分配一个调试 API 密钥,在发布 APK 时分配一个发布 API 密钥。插入正确的 API 密钥,清理并重建您的项目。

    我已经在那里呆了一年,我可以保证这就是问题所在。仔细检查您的密钥以及它是调试密钥还是释放密钥。

    要检查的另一件事是您的应用程序的包名称... 让我知道你是否这样做并且仍然得到灰色视图而不是

    更新:

    当我意识到您的问题仅在签名阶段时,我试图包含所有内容。

    您只需获取debug keystoreSHA-1指纹并将其放入您的API Key对话框中。相信我,没有什么比 Google 文档更清晰、更丰富的了。

    按照此link 中的步骤获取调试证书SHA-1指纹

    更新 2:

    要获取密钥库的 SHA-1,您可以查看thread

    【讨论】:

    • 04-15 12:42:28.960 1961-2088/********************E/Google Maps Android API: 授权失败。请参阅developers.google.com/maps/documentation/android/start 了解如何正确设置地图。 04-15 12:42:28.960 1961-2088/****************E/Google Maps Android API:在 Google Developer Console (console.developers.google.com) 确保“Google地图 Android API v2" 已启用。确保存在以下 Android 密钥: API 密钥:**************** Android 应用程序 (;): ********** ************************
    • 以及 E/Google Maps Android API:加载地图失败。联系 Google 服务器时出错。这可能是身份验证问题(但可能是由于网络错误)。
    • 好吧,我的包名是正确的,因为我在构建应用程序时已经生成了 API 密钥我的密钥,我假设这是一个调试密钥,除了我不知道如何检查它是否真的是一个。另外,当我去 gradle.app on signingConfigs{} 时,该方法是空的。我在我的.android 文件夹中有一个 debug.keystore 文件。你知道我如何访问它以查看密钥吗?
    • 谢谢!同时,我从 File->Project Structure 创建了一个新的调试密钥库,现在我的 gradle 有以下 signingConfigs { map { keyAlias 'map' keyPassword '*******' storeFile file('C:/Android Key store/key_store.jks') storePassword '*****' } }
    • 我还在 BuildTypes 中将它设置为每次自动启动。但是现在当我运行它时,我在运行时出现此错误错误:任务':app:packageDebug'的执行失败。 > 从密钥库中读取密钥失败
    【解决方案2】:

    我怀疑缺少某些部分:

    (1) 声明使用MAPS_RECEIVE的权限:

    <permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
    <!-- after declare use this -->
    <uses-permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE"/>
    

    (2) 缺少声明 gms 版本变量:

      <meta-data
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />
    

    (3) API_KEY 生成可能有问题:

    <meta-data
        android:name="com.google.android.maps.v2.API_KEY"
        android:value="your_key" />
    

    请先与以上 3 名嫌疑人核对:如果仍然存在错误,您可以从 here 重新确认启用 Google 地图的步骤

    仔细检查API_KEY相关的东西

    【讨论】:

      【解决方案3】:

      您可以使用 SupportMapFragment 在您的片段中显示地图。

      xml应该改成

       <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical" 
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      
      
      <fragment
       android:id="@+id/mapView"
      android:layout_marginTop="-470dp"
      class="com.google.android.gms.maps.SupportMapFragment"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>
      
      </LinearLayout>
      

      你的班级会像下面这样

      public class guide extends Fragment {
      
      private GoogleMap mMap;
      
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
          // inflat and return the layout
          View v = inflater.inflate(R.layout.test, container, false);
      
          ((SupportMapFragment) getFragmentManager()
                  .findFragmentById(R.id.mapView)).getMapAsync (new OnMapReadyCallback(){
                      @Override
                      public void onMapReady(final GoogleMap map) {
                          this.mMap = map;
                          mMap.setMyLocationEnabled(true);
                          setUpMap();
                      }
                  });
      
      
          return v;
      }
      
      private void setUpMap() {
              mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
          }
      
      }
      

      注意:如果您没有找到 SupportMapFragment 的 getMapAsync 方法,请更新您的 google play 服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多