【问题标题】:Adding Google Maps - Only seeing blank screen添加谷歌地图 - 只看到空白屏幕
【发布时间】:2016-08-21 15:42:52
【问题描述】:

我正在尝试添加 Google 地图。但是,在从 Build > Generate Signed apk 构建 apk 并将其安装到真实设备后,该活动仅显示一个空白屏幕,左下方带有 Google 徽标。以下代码有问题吗?

注意事项 API Key 在 google_maps_api.xml 和 strings.xml 中都有,下面代码中的 API Key 没有显示

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.thesis.cutaneous.testapp1">

<permission
    android:name="com.thesis.cutaneous.testapp1.permission.MAPS_RECEIVE"
    android:protectionLevel="signature"/>

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

<uses-permission android:name="com.thesis.cutaneous.testapp1.permission.MAPS_RECEIVE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MapsActivity"
        android:label="@string/title_activity_maps">
        <intent-filter>
            <action android:name="com.thesis.cutaneous.testapp1.MapsActivity" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key" />
</application>
</manifest>

Gradle(模块)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion '24.0.1'

defaultConfig {
    applicationId "com.thesis.cutaneous.testapp1"
    minSdkVersion 16
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.0'
    compile 'com.google.android.gms:play-services-maps:9.4.0'
}

Gradle(项目)

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
        jcenter { url 'http://jcenter.bintray.com/' }
    }
dependencies {
    classpath 'com.android.tools.build:gradle:2.1.3'
}
}

allprojects {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
        jcenter { url 'http://jcenter.bintray.com/' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

MainActivity.java

package com.thesis.cutaneous.testapp1;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static Button btn1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn1 = (Button) findViewById(R.id.button);
        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent("com.thesis.cutaneous.testapp1.MapsActivity"));
        }
    });
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.thesis.cutaneous.testapp1.MainActivity">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    android:id="@+id/textView" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:id="@+id/button"
    android:layout_below="@+id/textView"
    android:layout_centerHorizontal="true" />
</RelativeLayout>

MapsActivity.java

package com.thesis.cutaneous.testapp1;

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
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 MapsActivity extends FragmentActivity implements OnMapReadyCallback {
    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    LatLng Angeles = new LatLng(15.1427956, 120.5977875);
    mMap.addMarker(new MarkerOptions().position(Angeles).title("Marker in Angeles"));
    mMap.moveCamera(CameraUpdateFactory.newLatLng(Angeles));
}
}

activity_maps.xml

<fragment 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:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.thesis.cutaneous.testapp1.MapsActivity" />

【问题讨论】:

  • 如果出现黑屏,我有点怀疑是Android Studio 的问题。您只需在那里编写代码。一旦代码编译完成,它就不受 IDE 的控制
  • 在哪里可以访问它?运行应用时,我只使用未连接到 PC 的设备。
  • 如果 google 标志显示时没有地图,那么很可能是 API 密钥的问题。您确定您使用了新的 API 密钥和签名密钥吗?
  • 我明白了。请说清楚。我仍然不熟悉这些条款和程序。
  • 我认为问题很可能与您的 API 密钥有关。您是否知道调试和生产构建需要不同的密钥?如果您的应用程序在您运行时运行它而不通过 Generate Signed APK 路由但在您运行时却没有运行,那么您可能没有正确设置发布密钥。

标签: android google-maps


【解决方案1】:

空白地图是由不正确的 google_maps_key 引起的。请注意,有 2 个不同的键 - 一个用于调试,一个用于发布构建。您必须在https://console.developers.google.com/ 上注册。要确定您的发布密钥,请在您的项目目录中运行类似的内容:

"c:\Program Files\Java\jdk1.8.0_20\bin"\keytool  -list -v -keystore keystore.jks

【讨论】:

  • 这个解释真的很糟糕,但给了我提示。我的 Google 地图 API 仅限于我的应用程序。构建签名的 apk 时,您必须通过运行此答案中描述的命令从密钥库注册 SHA1(您必须 cd 到文件的位置)。然后你在控制台中保存受限项目的 SHA1
猜你喜欢
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2013-09-07
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
相关资源
最近更新 更多