2017-03-14 5 views
0

Hallo Ich bin neu bei Android und frage mich, ob mir jemand helfen kann. Ich habe eine MapsActivity, die beim Navigieren abstürzt. Ich glaube, ich habe genau darauf geachtet, wo es liegt, wenn ich die Fehler durchschaue, aber ich kann nicht herausfinden, was ich ändern soll. Ich habe die gesamte MapsActivity-Klasse hinzugefügt. Das Problem tritt in der onConnected-Methode in dieser Zeile mLocationManager.requestLocationUpdates(provider, 5000, 0, this); auf. Android Studio empfiehlt, "this" in LocationListener zu übertragen, aber dies funktioniert nicht und der Fehler, den ich dadurch erhalte, wird unter dem MapsActivity-Code aufgeführt. Ich habe auch versucht, mlacationListener anstelle von "this" einzugeben, funktioniert aber nicht und es werden Fehler angezeigt, die ebenfalls unten aufgeführt sind.MapsActivity stürzt auf Last

JEDE HILFE IST GROSS ANERKANNT. VIELEN DANK!

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener { 

    private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1; 
    private static final int MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 2; 
    private GoogleMap mMap; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationManager mLocationManager; 
    private Location mLastLocation; 
    private LocationListener mLocationListener; 
    private String mLatitude; 
    private String mLongitude; 


    @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(this); 

     // Create an instance of GoogleAPIClient. 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(this) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 
     //create instance of location manager and get location service 
     mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    } 
    /** 
    * 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)); 
    } 

    @Override 
    protected void onStart() { 
     mGoogleApiClient.connect(); 
     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     mGoogleApiClient.disconnect(); 
     //mLocationManager.removeUpdates((LocationManager) this); 
     super.onStop(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Criteria criteria = new Criteria(); 
     criteria.setAccuracy(Criteria.ACCURACY_FINE); 
     criteria.setAltitudeRequired(true); 
     criteria.setBearingRequired(true); 
     criteria.setCostAllowed(true); 
     criteria.setPowerRequirement(Criteria.POWER_LOW); 
     String provider = mLocationManager.getBestProvider(criteria, true); 

     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      mLocationManager.requestLocationUpdates(provider, 5000, 0, this); 
      mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      if(mLastLocation != null){ 
       mLatitude = String.valueOf(mLastLocation.getLatitude()); 
       mLongitude = String.valueOf(mLastLocation.getLongitude()); 
       Toast.makeText(this, mLatitude + " , " + mLongitude, Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      Toast.makeText(this, "Permission denied, please accept permission..", Toast.LENGTH_SHORT).show(); 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 
     } 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){ 
     switch (requestCode){ 
      case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION:{ 
       //if request cancelled the results array is empty 
       if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        //do task you wish to do 
        //Intent intent = (new Intent(this, MapsActivity.class)); 
        //startActivity(intent); 
       }else{ 
        //permission denied, disable functionality(GPS) 
       } 
       return; 
      } 
      //other cases go here 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

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

    } 

    @Override 
    public void onLocationChanged(Location location) { 

    } 
} 

Casting Fehler -

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.a8460p.locationotes, PID: 23305 
       java.lang.ClassCastException: com.example.a8460p.locationotes.MapsActivity cannot be cast to android.location.LocationListener 
        at com.example.a8460p.locationotes.MapsActivity.onConnected(MapsActivity.java:106) 
        at com.google.android.gms.common.internal.zzm.zzq(Unknown Source) 
        at com.google.android.gms.internal.zzaal.zzo(Unknown Source) 
        at com.google.android.gms.internal.zzaaj.zzvE(Unknown Source) 
        at com.google.android.gms.internal.zzaaj.onConnected(Unknown Source) 
        at com.google.android.gms.internal.zzaan.onConnected(Unknown Source) 
        at com.google.android.gms.internal.zzzy.onConnected(Unknown Source) 
        at com.google.android.gms.common.internal.zzl$1.onConnected(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zzj.zzwZ(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zza.zzc(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zza.zzu(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zze.zzxa(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zzd.handleMessage(Unknown Source) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:234) 
        at android.app.ActivityThread.main(ActivityThread.java:5526) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Ersetzen 'this' mit mLocationListener Fehler -

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: com.example.a8460p.locationotes, PID: 24073 
       java.lang.IllegalArgumentException: invalid listener: null 
        at android.location.LocationManager.checkListener(LocationManager.java:1733) 
        at android.location.LocationManager.requestLocationUpdates(LocationManager.java:461) 
        at com.example.a8460p.locationotes.MapsActivity.onConnected(MapsActivity.java:106) 
        at com.google.android.gms.common.internal.zzm.zzq(Unknown Source) 
        at com.google.android.gms.internal.zzaal.zzo(Unknown Source) 
        at com.google.android.gms.internal.zzaaj.zzvE(Unknown Source) 
        at com.google.android.gms.internal.zzaaj.onConnected(Unknown Source) 
        at com.google.android.gms.internal.zzaan.onConnected(Unknown Source) 
        at com.google.android.gms.internal.zzzy.onConnected(Unknown Source) 
        at com.google.android.gms.common.internal.zzl$1.onConnected(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zzj.zzwZ(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zza.zzc(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zza.zzu(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zze.zzxa(Unknown Source) 
        at com.google.android.gms.common.internal.zzf$zzd.handleMessage(Unknown Source) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:234) 
        at android.app.ActivityThread.main(ActivityThread.java:5526) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Antwort

0

für die ersten Absturz: Dieser Absturz wird auftreten aufgrund des falschen Import für Standort-Listener-Klasse, die Sie implementiert, um Ihre Activity haben.

ändern com.google.android.gms.location.LocationListener mit android.location.LocationListener

und für die zweiten Crash-Einsatz unten LocationListener wird dieser Absturz aufgrund Ihrer Null-Referenz Standort Listener-Objekts auftritt.

private LocationListener mLocationListener = new LocationListener() { 
    @Override 
    public void onLocationChanged(Location location) { 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 
}; 
+0

Vielen Dank, hat perfekt funktioniert – Gus

+0

happy coding (Y) –

1

Make MapsActivity implementiert android.location.LocationListener statt com.google.android.gms.location.LocationListener von

0

Ihre requestLocationUpdates Instanz nicht finden konnten, Zuhörer so fügen MapsActivity.this zu requestLocationUpdates

if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      mLocationManager.requestLocationUpdates(provider, 5000, 0, MapsActivity.this);//Changed here 
      mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
      if(mLastLocation != null){ 
       mLatitude = String.valueOf(mLastLocation.getLatitude()); 
       mLongitude = String.valueOf(mLastLocation.getLongitude()); 
       Toast.makeText(this, mLatitude + " , " + mLongitude, Toast.LENGTH_SHORT).show(); 
      } 
     } else { 
      Toast.makeText(this, "Permission denied, please accept permission..", Toast.LENGTH_SHORT).show(); 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); 
     }