地图片段无法在Android

时间:2016-03-21 13:52:28

标签: android google-maps google-maps-api-3 android-manifest android-fragmentactivity

我已经尝试了一千种配置和代码,但我的地图活动坚持不工作。我尝试过的事情:

的AndroidManifest.xml

  • 启用了访问权限(INTERNET,ACCESS_FINE_LOCATION,READ_GSERVICES等);
  • 启用OpenGL(android:glEsVersion =" 0x00020000"等);
  • 提供了两个密钥(com.google.android.geo.API_KEY和com.google.android.maps.v2.API_KEY),其中包含AndroidManifest中的直接密钥,并通过调试和发布文件夹中的xml值引用该密钥(@ string / map_api );
  • 尝试使用地图库(uses-library android:name =" com.google.android.maps");
  • 尝试包含权限标记uses-permission(... permission.MAPS_RECEIVE);
  • 尝试通知服务版本(android:name =" com.google.android.gms.version");
  • 尝试为.android文件夹下的自己的证书和android.keystore生成密钥;
  • 文件:

    <manifest package="com.myapp"
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:anrdroid="http://schemas.android.com/apk/res-auto">
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
        <application
                android:allowBackup="true"
                android:icon="@drawable/logo"
                android:label="@string/name"
                android:supportsRtl="true"
                android:name="android.support.multidex.MultiDexApplication"
        android:theme="@style/Default">
            <meta-data
                    android:name="com.google.android.geo.API_KEY"
                    android:value="@string/google_maps_key"/>
                <activity
                    android:name=".view.MainActivity"
                    android:icon="@drawable/logo"
                    android:label="@string/name">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN"/>
                        <category android:name="android.intent.category.LAUNCHER"/>
                    </intent-filter>
                </activity>
                <activity
                    android:name=".view.ActivityMap"
                    android:icon="@drawable/logo_row"
                    android:label="@string/name">
                </activity>
                ...
            </application>
            </manifest>
    

的build.gradle

  • 尝试了不同的编译和构建配置(23,22,19等);
  • 尝试了不同的库版本(8.4.0,7.80等);
  • 为appcompat库(23.2.1,22.2.1等)尝试了不同的库版本;
  • 仅对地图和依赖项或Google服务完成使用选择性编译;
  • 尝试使用相同和不同的密钥签署调试和发布;
  • 文件:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 23
        buildToolsVersion '23.0.2'
        defaultConfig {
            applicationId "com.myapp"
            minSdkVersion 16
            targetSdkVersion 23
            versionCode 1
            versionName "0.0.1"
            multiDexEnabled true
        }
    
        signingConfigs {
            keystore {
                storeFile file("path_to_keystore")
                storePassword "my_password"
                keyAlias "my_key_alias"
                keyPassword "my_password"
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
                signingConfig signingConfigs.keystore
            }
        }
    
        packagingOptions {
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/io.netty.versions.properties'
            exclude 'META-INF/INDEX.LIST'
        }
    
        dexOptions {
            javaMaxHeapSize "2g"
        }
    }
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.android.support:appcompat-v7:23.2.1'
        compile 'com.android.support:design:23.2.1'
        compile 'com.google.android.gms:play-services-maps:8.4.0'
        compile 'com.datastax.cassandra:cassandra-driver-mapping:3.0.0'
        compile 'com.fasterxml.jackson.core:jackson-core:2.5.4'
        compile 'com.fasterxml.jackson.core:jackson-databind:2.5.4'
    }
    

代码

  • 尝试扩展AppCompat,FragmentActivity;
  • 尝试使用ActivityCompat.requestPermissions();
  • 在api 6中请求权限
  • 尝试调用MapsInitializer.initialize()并检查return;
  • 尝试仅将片段用于布局文件,通知上下文等;
  • 尝试在FragmentLayout中使用片段;
  • 文件:

    public class ActivityMap extends FragmentActivity implements OnMapReadyCallback
    {
        private GoogleMap map;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_map);
            SupportMapFragment fragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.activityMapID);
            fragment.getMapAsync(this);
        }
    
    
        @Override
        public void onMapReady(GoogleMap googleMap)
        {
            map = googleMap;
            map.addMarker(new MarkerOptions().position(new LatLng(-34, 151)).title("Marker in Sydney"));
        }
    }
    

activity_map.xml:

    <fragment android:id="@+id/activityMapID"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

其他

  • 检查了我的网络连接和防火墙;
  • 检查密钥是否可用且在Google控制台中工作;
  • 尝试多次清理,重建项目并使Android Studio的缓存失效;
  • 尝试擦除数据,重新启动并清理设备(并在多个设备中测试);
  • 使用&#34; adb shell pm clear ...&#34;;
  • 通过adb删除了应用
  • 没有nullpointers,onMapReady返回一个有效的地图和调试代码,一切正常;
  • 如果我使用Android Studio创建新地图应用,一切正常;

在第一次通话中,我有这个日志:

    03-21 09:34:28.478 25570-26174/com.myapp I/LoadedApk: connected(), package name=com.google.android.gms ,class name=com.google.android.gms.maps.auth.ApiTokenService
    03-21 09:34:29.770 25570-25570/com.myapp I/Choreographer: Skipped 127 frames!  The application may be doing too much work on its main thread.
    03-21 09:34:30.020 25570-27391/com.myapp I/b: Sending API token request.
    03-21 09:34:30.090 25570-25633/com.myapp I/LoadedApk: connected(), package name=com.google.android.gms ,class name=com.google.android.location.internal.GoogleLocationManagerService
    03-21 09:34:31.231 25570-27391/com.myapp I/b: Received API Token: AH0uPGGIx9Ygap4ZXq8T8vK7qcPxgyDi5NRIaIPyPauG4xWFn1lI7KQF9IuY2yqbpYMhWitKnTUiU-sZD9tFdJvr1naCVhz3c9APmLbueopuhcD6K5LHpZKnkYCQDEefhrTeGPNOR0fdz0QmC4WD8rkgQTbLmfbnOIA7cvZZBOmn7hFmcyavIVRQZlaY9_OLaPMFxIVFVBml / Expires in: 432000000ms
    03-21 09:34:31.241 25570-27391/com.myapp I/c: Scheduling next attempt in 431700 seconds.
    03-21 09:34:31.251 25570-27391/com.myapp I/d: Saved auth token
    03-21 09:34:31.832 25570-25582/com.myapp I/LoadedApk: connected(), package name=com.google.android.gms ,class name=com.google.android.gms.clearcut.service.ClearcutLoggerService

然后在第二次通话后,我收到了我的密钥无效的消息:

    03-21 09:35:22.596 25570-25633/com.myapp I/LoadedApk: connected(), package name=com.google.android.gms ,class name=com.google.android.gms.clearcut.service.ClearcutLoggerService
    03-21 09:35:37.762 25570-25570/com.myapp I/Google Maps Android API: Google Play services package version: 8703034
    03-21 09:35:37.973 25570-28472/com.myapp E/Google Maps Android API: Failed to load map. Error contacting Google servers. This is probably an authentication issue (but could be due to network errors).
    03-21 09:35:38.363 25570-25582/com.myapp I/LoadedApk: connected(), package name=com.google.android.gms ,class name=com.google.android.location.internal.GoogleLocationManagerService

我真的不知道该怎么做了。有人知道会发生什么吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

最后我发现了问题。

在我的代码的另一部分中,我正在调用

    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

简化我为HTTPS所做的所有调用。问题出在谷歌地图试图调用其服务器时:它使用的是我之前设置的相同SSL上下文,因此无法在地图服务器上连接。

我刚刚评论了该行并将我的代码更改为:

    URLConnection urlConn = new URL(myAddress).openConnection();
    HttpsURLConnection https = (HttpsURLConnection) urlConn;
    https.setSSLSocketFactory(sslContext.getSocketFactory());

一切都像魔术一样!

谢谢大家!

答案 1 :(得分:0)

尝试在build.radle

的末尾添加此行
  

申请插件:'com.google.gms.google-services'

将其添加到manifest标记内:

<uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" >
    </uses-feature>