2016-11-16 171 views
-1

我正在使用GPS在Android應用程序中獲取我的位置。但是當我創建一個LocationManager時,它返回空指針異常。即使權限是在androidMainFest.xml和應用程序上設置的,它仍會返回以下異常。任何人都可以提前幫忙。謝謝!LocationManager返回null

代碼:

package com.example.pavsaranga.scat; 

import android.content.Context; 
import android.content.pm.PackageManager; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.FragmentActivity; 
import android.widget.Toast; 

import com.google.android.gms.location.LocationListener; 
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 Map extends FragmentActivity implements OnMapReadyCallback, LocationListener { 

    private GoogleMap mMap; 
    double longitude, latitude; 
    String bestProvider; 
    LocationManager lm; 
    Location location; 
    Criteria criteria; 
    LocationListener locList; 

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

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 
     mMap.getUiSettings().setZoomGesturesEnabled(true); 
     try { 
      boolean permissionGranted = ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; 
      if (permissionGranted) { 
       setMyLocation(); 
      } else { 
       ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 200); 
      } 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    private void setMyLocation() { 
     try { 
      lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
      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) { 
       Toast.makeText(Map.this, "Please Grant Permission.", Toast.LENGTH_SHORT).show(); 
      } else { 
       criteria = new Criteria(); 
       bestProvider = String.valueOf(lm.getBestProvider(criteria, true)).toString(); 
       location = lm.getLastKnownLocation(bestProvider); 
       if (location != null) { 
        latitude = location.getLatitude(); 
        longitude = location.getLongitude(); 
       } 
       else{ 
        lm.requestLocationUpdates(bestProvider, 2000, 0, (android.location.LocationListener) locList); 
       } 
       LatLng myLocation = new LatLng(latitude, longitude); 
       mMap.addMarker(new MarkerOptions().position(myLocation).title("You Are Here!")); 
       mMap.moveCamera(CameraUpdateFactory.newLatLng(myLocation)); 
      } 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case 200: { 
       if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        Toast.makeText(Map.this, "Thank You, Permission Granted!.", Toast.LENGTH_SHORT).show(); 
        setMyLocation(); 
       } 
      } 
     } 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 
    } 
} 

例外:

java.lang.IllegalArgumentException: invalid listener: null 

MainFest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
+0

你是一個硬件設備或AVD上測試此之前初始化loclist? –

+0

在我的手機上測試過 –

回答

0

您聲明locList並將其傳遞到lm.requestLocationUpdates(bestProvider, 2000, 0, (android.location.LocationListener) locList);方法。它看起來並不像你正在初始化它。 這就是它告訴你的例外情況,你正在期待偵聽器在null中傳遞。

您可以刪除locList聲明,並嘗試做如下改變:

變化

lm.requestLocationUpdates(bestProvider, 2000, 0, (android.location.LocationListener) locList);

lm.requestLocationUpdates(bestProvider, 2000, 0, new LocationListener(){ 
    // @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     /* 
     * Called when the provider status changes. 
     * This method is called when a provider is unable to fetch a location 
     * or if the provider has recently become available after a period of unavailability. 
     */ 
    } 

    // @Override 
    public void onLocationChanged(Location location) { 
     /* 
     * Called when the location has changed. 
     */ 
    } 
}); 
+0

我沒有得到它,請你告訴我該怎麼做?我是新到Android –

+0

@VimukthiSaranga我添加了一個例子給你 – SeanKelleyx

+0

但隨後會返回錯誤,無法保存代碼 –

1

LocationManager沒有返回null。錯誤是你通過了一個nullLocationListener

你需要將它傳遞給requestLocationUpdates

+0

我沒有明白你能告訴我如何去做吧?我是Android新手 –