2017-02-27 4 views
0

Ich bin ratlos auf dieses aktuelle Problem, ich versuche, einen Benutzer Ort aus der Super-Klasse abrufen, um es schließlich zu einem Marker zuweisen. Was bringt mich dazu, wie ich einfach einen Ort aus der Oberklasse heraushole? Ich habe den blauen Punkt in meiner MapsActivity-Superklasse, aber wie übertrage ich ihn?Android Google Maps - NullPointerException - Location.getLatitude()

mLastLocation ist ein Ort Referenz von der Super

Bin ich auf dem richtigen Weg?

Ich bin ziemlich neu zu diesem so alle schnelle Einblicke würde sehr geschätzt werden!

public class CircleSizeActivity extends MapsActivity implements OnMapReadyCallback, OnMarkerDragListener, LocationListener{ 

    Marker mMarkerA; 
    Marker mMarkerB; 
    Polyline mPolyline; 
    GoogleMap mMap = getMap(); 
    private GoogleApiClient mGoogleApiClient; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_circle); 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 

    } 

    protected void onStart() { 
     mGoogleApiClient.connect(); 
     super.onStart(); 

    } 

    protected void onStop() { 
    mGoogleApiClient.disconnect(); 
    super.onStop(); 
    } 

    @Override 
    public void onConnected(Bundle connectionHint) { 
    if (checkLocationPermission() == true) { 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
     if (mLastLocation != null) { 
      System.out.println(mLastLocation.getLatitude()); 
      System.out.println(mLastLocation.getLongitude()); 
     } 

     } 
    } 


    @Override 
    public void onMapReady (GoogleMap googleMap){ 
     mMap = googleMap; 
     mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     if ((ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || 
      ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { 
      mMap.setMyLocationEnabled(true); 

    } 
} 

mit Super

Aktualisiert
public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback, 
    GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener, OnClickListener, View.OnLongClickListener { 

private GoogleMap mMap; 
private GoogleApiClient mGoogleApiClient; 
LocationRequest mLocationRequest; 
Location mLastLocation; 
Marker mCurrLocationMarker; 
Circle circle1; 




CircleOptions circleOptions = new CircleOptions(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map_activity); 
    mapFragment.getMapAsync(this); 







} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    mMap = googleMap; 
    mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
    //Initialize Google Play Services 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(this, 
       android.Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      buildGoogleApiClient(); 
      mMap.setMyLocationEnabled(true); 
     } 
    } else { 
     buildGoogleApiClient(); 
     mMap.setMyLocationEnabled(true); 
    } 
} 



@Override 
public void onConnected(@Nullable Bundle bundle) { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000); 
    mLocationRequest.setFastestInterval(1000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      android.Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

} 

@Override 
public void onLocationChanged(Location location) { 
    mLastLocation = location; 
    if (mCurrLocationMarker != null) { 
     mCurrLocationMarker.remove(); 
    } 

    //Place current location marker 
    LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.title("Current Position").draggable(true); 
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
    mCurrLocationMarker = mMap.addMarker(markerOptions); 

    //move map camera 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mMap.animateCamera(CameraUpdateFactory.zoomTo(11)); 

    //stop location updates 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 


} 

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 

public boolean checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this, 
      android.Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Asking user if explanation is needed 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       android.Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

      //Prompt the user once explanation has been shown 
      ActivityCompat.requestPermissions(this, 
        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
     return false; 
    } else { 
     return true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       // permission was granted. Do the 
       // contacts-related task you need to do. 
       if (ContextCompat.checkSelfPermission(this, 
         android.Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) { 

        if (mGoogleApiClient == null) { 
         buildGoogleApiClient(); 
        } 
        mMap.setMyLocationEnabled(true); 
       } 

      } else { 

       // Permission denied, Disable the functionality that depends on this permission. 
       Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 
    } 
} 
+0

Wo instanziert eigentlich 'mLastLocation'? Ich sehe das nirgendwo. –

+0

Danke! Habe meinen Beitrag gerade bearbeitet, um MapsActivity einzubinden. I – TJBlack31

+0

@TimBiegeleisen Danke! Habe meinen Beitrag gerade bearbeitet, um MapsActivity einzubinden. I – TJBlack31

Antwort

0

Ich verstehe nicht, warum man nicht alles in einer Aktivität haben würde, aber mein Vorschlag ist mLastLocation öffentlich oder geschützt zu machen.

In Ihrem MapsActivity:

public Location mLastLocation; 
+0

In Anbetracht der Tatsache, dass Sie nur eine Aktivität auf einmal öffnen können, sehe ich nicht, wie eine öffentliche oder geschützte Member-Variable helfen würde. –

+0

Nun, das ist die Sache, eine Aktivität scheint die andere zu verlängern. –

+0

Das ist in manchen Fällen sinnvoll, aber nicht wirklich der Code, der angezeigt wird. –