简体   繁体   English

Android SupportMapFragment.getMapAsync不调用OnMapReady

[英]Android SupportMapFragment.getMapAsync Not Invoking OnMapReady

I am currently trying to set up an activity that uses a Google Maps fragment. 我目前正在尝试建立一个使用Google Maps片段的活动。 This is not the main launcher activity, it is called from another activity when the user authenticates. 这不是主要的启动器活动,当用户进行身份验证时会从另一个活动中调用它。 The map shows fine and defaults to viewing Africa at a distance, however it does not move to my specified location in the OnMapReady function because that function is never called. 该地图显示正常,默认情况下可以远距离查看非洲,但是它不会移动到OnMapReady函数中指定的位置,因为从未调用过该函数。 I am invoking SupportMapFragment.getMapAsync, and I believe I have the correct permissions so I'm not sure what the problem might be. 我正在调用SupportMapFragment.getMapAsync,并且我相信我拥有正确的权限,所以我不确定可能是什么问题。

Here is my MapsActivity.java file. 这是我的MapsActivity.java文件。

package com.dizydev.wayfare;

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);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(MapsActivity.this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }
}

Here is my activity_maps.xml file. 这是我的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.dizydev.wayfare.MapsActivity" />

Here is my AndroidManifests.xml file. 这是我的AndroidManifests.xml文件。

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

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

    <!-- Permissions -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key" />

        <activity
            android:name=".SignInActivity"
            android:label="@string/title_activity_maps">
            <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" />
    </application>
</manifest>

And here is my build.gradle file. 这是我的build.gradle文件。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.dizydev.wayfare"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.google.android.gms:play-services-maps:10.2.1'
    compile 'com.google.android.gms:play-services-auth:10.2.1'
    compile 'com.google.firebase:firebase-auth:10.2.1'
    compile 'com.google.firebase:firebase-database:10.2.1'
    compile 'com.google.android.gms:play-services-location:10.2.1'
    compile 'com.google.android.gms:play-services-ads:10.2.1'
    testCompile 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'

Again, the issue is that the OnMapReady function in my MapsActivity.java file is not being called. 同样,问题是我的MapsActivity.java文件中的OnMapReady函数没有被调用。 I have verified this by putting a logging statement in and it was never put out to LogCat. 我已经通过放入日志记录语句来验证了这一点,但从未将其发布到LogCat中。 So if anyone knows why this might be happening I would greatly appreciate some help. 因此,如果有人知道为什么会发生这种情况,我将不胜感激。

I have figured it out! 我想通了!

Apparently I needed to actually invoke the startActivity function to switch to a new activity instead of just setting the content view. 显然,我实际上需要调用startActivity函数以切换到新的活动,而不仅仅是设置内容视图。

startActivity(new Intent(SignInActivity.this, MapsActivity.class));

It was previously this 以前是这个

setContentView(R.layout.activity_maps);

This would not have invoked the MapsActivity.java file at all. 这根本不会调用MapsActivity.java文件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM