簡體   English   中英

GoogleMaps 是 null 在活動后導致 android

[英]GoogleMaps is null after onactivityresult in android

我在 onActivityResult() 中收到另一個活動的結果,並試圖在 map 上放置一個標記。 但它讓我跟隨 RuntimeException:

java.lang.RuntimeException: Unable to resume activity {My Package Name/My Package Name.MapsActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=1, data=Intent { (has extras) }} to activity {My Package Name} java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.GoogleMap.moveCamera(com.google.android.gms.maps.CameraUpdate)' on a null object reference

這是我的 onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (data != null) {
        if (requestCode == HOSPITAL_LOCATION_RESULT_CODE) {
            String hospitalName = data.getStringExtra("HospitalName");
            hospitalLocation = data.getExtras().getParcelable("HospitalLatLng");
            hospitalCity = data.getStringExtra("HospitalCity");

            hospitalAddressEditText.setText(hospitalName);
            hospitalAddressEditText.setTextColor(Color.parseColor("#212121"));
   

            //Exception Thrown Here
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(hospitalLocation, 1));
            displayRoutes();

            if (currMarker != null)
                currMarker.remove();

            markerDrop = mMap.addMarker(new MarkerOptions().position(hospitalLocation));    
         } else {
            Toast.makeText(MapsActivity.this, "Error Displaying Selected Location", Toast.LENGTH_SHORT).show();
         }
    }
}

在調用 onActivityResult 之前, mMap (GoogleMaps 對象)似乎沒有同步。 但不確定。 你們能幫幫我嗎?

編輯:這是我的 onCreate():

private static final String TAG = "MapsActivity";
private GoogleMap mMap;
private FusedLocationProviderClient fusedLocationProviderClient;
private Location lastKnownLocation;

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

    mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    Places.initialize(getApplicationContext(), "AIzaSyDTyvJynXqJrLBN8BIFk");
    fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
    
    if (mapFragment != null) {
          mapFragment.getMapAsync(this);
    }
 
    hospitalPoint.setOnClickListener(v -> {
         if(lastKnownLocation != null) {

                //This is where I'm calling another activity for result, and processing the result in the onactivityresult function
                Intent pickupPointClickIntent = new Intent(MapsActivity.this, HospitalSearch.class);
                pickupPointClickIntent.putExtra("PickupLatLng", lastKnownLocation);
                startActivityForResult(pickupPointClickIntent, HOSPITAL_LOCATION_RESULT_CODE);
         } else {
                Toast.makeText(MapsActivity.this, "Error Fetching Your Location! Please turn on the Location in your phone", Toast.LENGTH_SHORT).show();
         }
    });
       
}

我在 onMapReady() 中沒有做太多事情:

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

這是 getCurrentDeviceLocation():

private void getCurrentDeviceLocation() {
        try {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

                Task<Location> locationResult = fusedLocationProviderClient.getLastLocation();
                locationResult.addOnCompleteListener(this, task -> {
                    if (task.isSuccessful()) {

                        lastKnownLocation = task.getResult();
                        if (lastKnownLocation != null) {
                            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
                                    new LatLng(lastKnownLocation.getLatitude(),
                                            lastKnownLocation.getLongitude()), CURRENT_LOCATION_ZOOM));


                            if(currMarker == null)
                                currMarker = mMap.addMarker(new MarkerOptions().title("Current Location")
                                    .icon(getLocationMarkerBitmap())
                                    .position(new LatLng(lastKnownLocation.getLatitude(), lastKnownLocation.getLongitude())));


                            locationSelectionLayout.setVisibility(View.VISIBLE);
                        } else {
                            Log.e(TAG, "Error Fetching Current Location");
                            Toast.makeText(MapsActivity.this, "Current Location Couldn't be fetched", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        Log.e(TAG, "Error Fetching Current Location");
                        Toast.makeText(MapsActivity.this, "Current Location Couldn't be fetched", Toast.LENGTH_SHORT).show();
                    }
                });
            } else {
                Toast.makeText(MapsActivity.this, "Location Permission Denied", Toast.LENGTH_LONG).show();
            }
        } catch (Exception e) {
            Log.e("Exception: %s", e.getMessage(), e);
        }
    }

您必須在使用前在onMapReady()初始化nMap

public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
     
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM