【问题标题】:onMapReady is not called未调用 onMapReady
【发布时间】:2020-08-06 16:00:11
【问题描述】:

我遵循了 Youtube 上的教程,他展示了制作谷歌地图应用程序的步骤。所以我按照那个教程,在这段代码中遇到了一个逻辑错误。

package com.example.mymap;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;

import java.lang.ref.SoftReference;

public class MapActivity extends AppCompatActivity implements OnMapReadyCallback {



    private static final String TAG = "MapActivity";
    private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    private static final String COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;

    private boolean mLocationPermissionsGranted = false;
    private GoogleMap mMap;
    @Override

    public void onMapReady(GoogleMap googleMap){

        mMap = googleMap;
        Toast.makeText(MapActivity.this, "Map is Ready", Toast.LENGTH_SHORT).show();
        Log.d(TAG,"onMapReady : Map is Ready");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        getLocationPermission();
    }

    private void initMap(){
        Log.d(TAG,"initMap: initializing map");
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(MapActivity.this);
    }

    private void getLocationPermission(){
        Log.d(TAG,"getLocationPermissoin : getting Location Permssions");
        String[] permissions =
                {Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION};

        if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                    COARSE_LOCATION )== PackageManager.PERMISSION_GRANTED) {
                mLocationPermissionsGranted = true;
            }
            else{
                ActivityCompat.requestPermissions(this,
                        permissions,
                        LOCATION_PERMISSION_REQUEST_CODE);
            }
        }
        else{
            ActivityCompat.requestPermissions(this,
                    permissions,
                    LOCATION_PERMISSION_REQUEST_CODE);}
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d(TAG,"onRequestPermssionsResults: called...");
        mLocationPermissionsGranted = false;
        switch (requestCode){
            case LOCATION_PERMISSION_REQUEST_CODE : {
                if (grantResults.length>0){
                    for (int i = 0; i< grantResults.length;i++ ){
                        if (grantResults[i] != PackageManager.PERMISSION_GRANTED){
                            mLocationPermissionsGranted = false;
                            Log.d(TAG,"onRequestPermissionsResults: permissions failed");
                            return;
                        }
                    }
                        mLocationPermissionsGranted  =true;
                        Log.d(TAG,"onRequestPermissionsResults: permissions Success");
                        //initialize map
                    initMap();
                }
            }
        }
    }
}

这是我的地图活动,问题是它没有向我显示 onMapReady 方法的任何 toast 或日志。当被要求获得权限时,它被显示给我一次。但是如果我关闭并重新打开地图 toast 后,onMapReady 方法不会显示。我认为如果 onMapReady 没有执行,那么地图将不会显示给我。但地图显示给我,但没有吐司。我希望您能理解,在每次启动时都会显示地图,但是当我被要求获得权限时,toast 只会显示一次。

帮我解决这个问题。我找不到确切的问题。

【问题讨论】:

    标签: android google-maps dictionary permissions


    【解决方案1】:

    OnMapReady() 由在您的MapFragment 上调用getMapAsync() 触发。

    要调用OnMapReady,请将以下内容附加到您的onCreate()

      MapFragment mapFragment = (MapFragment) 
      getFragmentManager().findFragmentById(R.id.map);
    

    然后打电话给getMapAsync()谁打电话给OnMapReady()

      mapFragment.getMapAsync(MapDisplay.this);
    

    在您的代码中,您调用 initMap() 的代码仅在 onRequestPermissionsResult() 中调用 getMapAsync(),因此仅在请求权限时触发 OnMapReady()

    或在您的OnCreate() 中调用initMap() 或在许可的情况下应该可以工作

    【讨论】:

    • 是的...我做了同样的事情。阅读您的答案后,我了解了情况,并以自己的方式编辑了代码。谢谢你
    【解决方案2】:

    我了解了情况并处理了它。问题是,如果已经授予权限,则 Map 没有初始化。所以如果已经授予权限,我调用 initMap() 方法。

    if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                    FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                if (ContextCompat.checkSelfPermission(this.getApplicationContext(),
                        COARSE_LOCATION )== PackageManager.PERMISSION_GRANTED) {
                    mLocationPermissionsGranted = true;
    
                    initMap();
    

    【讨论】:

    • 我很高兴您找到了解决方案,我在回答中详细解释了相同的想法以及为什么未调用 onMapReady()。您的 initMap() 方法仅在获得许可时调用..
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多