2014-11-06 67 views
-2

其實我寫了一個按鈕的onclick方法下面的代碼在GPS上找到位置,但它給空指針異常,plzz幫助如何通過我的手機

public void submit(View v) 
{ 

LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location= locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    double mesg1=location.getLatitude(); 
    double mesg2=location.getLongitude(); 
} 
+0

你有權限嗎? – 2014-11-06 17:08:34

+0

是access_fine_locations之一,有它。 – radhika 2014-11-08 00:37:38

回答

0

hey按照幾個步驟來獲取正確和準確的當前位置。 這種方式提供您當前的位置以及inteps以及gps。

第1步。

將此類放入您的代碼中。 GetCurLocation.java

public class GetCurLocation implements LocationListener, 
    GooglePlayServicesClient.ConnectionCallbacks, 
    GooglePlayServicesClient.OnConnectionFailedListener { 

public static LocationClient mLocationClient; 
LocationRequest mLocationRequest; 
public static LocationManager locationmanager; 
float accuracy = 500; 
Activity context; 
boolean getLocRegularly = false; 
int interval = 1000; 
float Radius; 
GoogleMap gmap; 

SetOnLocationFoundListner OLF; 

public interface SetOnLocationFoundListner { 
    public void onLocationFound(Location location, boolean getLocRegularly, 
      GoogleMap gmap); 
} 

public void RemoveUpdates() { 
    try { 
     if (mLocationClient != null) 
      mLocationClient.removeLocationUpdates(this); 
     if (locationmanager != null) 
      locationmanager.removeUpdates(LocUpByLocMgr); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

/* 
* radius should be in meters 
*/ 
public GetCurLocation(Activity activity, int interval, 
     boolean getLocRegularly, GoogleMap gmap, 
     SetOnLocationFoundListner OLF, float Radius) { 
    this.OLF = OLF; 
    this.gmap = gmap; 
    this.context = activity; 
    this.getLocRegularly = getLocRegularly; 
    this.interval = interval; 
    this.Radius = Radius; 
    if (servicesConnected()) { 
     mLocationClient = new LocationClient(context, this, this); 
     mLocationClient.connect(); 
     mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setInterval(interval); 
     mLocationRequest 
       .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setFastestInterval(interval); 
    } 

    locationmanager = (LocationManager) context 
      .getSystemService(Context.LOCATION_SERVICE); 
    Criteria cr = new Criteria(); 
    String provider = locationmanager.getBestProvider(cr, true); 
    locationmanager.requestLocationUpdates(provider, interval, 0, 
      LocUpByLocMgr); 
} 

private boolean servicesConnected() { 
    int resultCode = GooglePlayServicesUtil 
      .isGooglePlayServicesAvailable(context); 
    if (ConnectionResult.SUCCESS == resultCode) { 
     return true; 
    } else { 
     Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, 
       (Activity) context, 0); 
     if (dialog != null) { 
     } 
     return false; 
    } 
} 

@Override 
public void onConnectionFailed(ConnectionResult result) { 

} 

@Override 
public void onConnected(Bundle connectionHint) { 
    try { 
     Location location = mLocationClient.getLastLocation(); 
     Log.e("testing", 
       location.getLatitude() + "," + location.getLongitude() 
         + "," + location.getAccuracy()); 
     if (location.getAccuracy() < Radius) { 
      OLF.onLocationFound(location, getLocRegularly, gmap); 
      locationmanager.removeUpdates(LocUpByLocMgr); 
     } else 
      mLocationClient.requestLocationUpdates(mLocationRequest, this); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onDisconnected() { 
} 

@Override 
public void onLocationChanged(Location location) { 
    try { 
     if (location.getAccuracy() > Radius) { 
      Log.e("testing LC", location.getAccuracy() 
        + " Its Not Accurate"); 
     } else { 
      Log.e("testing LC", location.getAccuracy() + " Its Accurate"); 
      try { 
       OLF.onLocationFound(location, getLocRegularly, gmap); 
       if (!getLocRegularly) { 
        mLocationClient.removeLocationUpdates(this); 
        locationmanager.removeUpdates(LocUpByLocMgr); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

android.location.LocationListener LocUpByLocMgr = new android.location.LocationListener() { 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

     try { 
      if (location.getAccuracy() > Radius) { 
       Log.e("testing LM", location.getAccuracy() 
         + " Its Not Accurate"); 
      } else { 
       Log.e("testing LM", location.getAccuracy() 
         + " Its Accurate"); 

       try { 
        OLF.onLocationFound(location, getLocRegularly, gmap); 
        if (!getLocRegularly) { 
         mLocationClient 
           .removeLocationUpdates(GetCurLocation.this); 
         locationmanager.removeUpdates(LocUpByLocMgr); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

}

步驟2.

實現你想要的當前位置類setonlocationfoundlistener,

,並在您的OnCreate後你會得到一個declear多個方法一個位置找到方法並返回位置,您可以獲取location.getlatitude和location.getlongitude。

GetCurLocation gcl = new GetCurLocation(activity, 0, true, null, this, 
       2000); 

步驟3.化妝許可

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

多數民衆贊成。謝謝

+0

實際上,我想獲取按鈕onclick方法的位置,所以我只想知道如何在代碼中實際調用此GetCurLocation.java類,請指導,因爲我是android.I的新手,只是想分享我的我用onclick方法編寫的代碼。 – radhika 2014-11-08 00:35:23

+0

請查看我發佈的代碼,並在該代碼中說明問題。 – radhika 2014-11-08 01:12:53

+0

我會檢查你的代碼,並讓你知道。在我的代碼中,你需要在你的onclick中調用getlocation方法,並且你有更多的選擇,比如你獲得位置reguraly。 – Saveen 2014-11-08 03:29:42

0
public void loc1(View v) 
{ 

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
       // Called when a new location is found by the network location provider. 
       String longitude = String.valueOf(location.getLongitude()); 
       String latitude = String.valueOf(location.getLatitude()); 
       Toast.makeText(getApplicationContext(), "latitude",Toast.LENGTH_LONG).show(); 
       Toast.makeText(getApplicationContext(), "longitude",Toast.LENGTH_LONG).show(); 
     } 

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

     public void onProviderEnabled(String provider) { 
     } 

     public void onProviderDisabled(String provider) { 
     } 
}; 

// getting GPS status 
boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

// check if GPS enabled 
if (isGPSEnabled) { 

     Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

     if (location != null) { 
      String longitude = String.valueOf(location.getLongitude()); 
       String latitude = String.valueOf(location.getLatitude()); 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener); 
     } else { 
       location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

       if (location != null) { 
         String longitude = String.valueOf(location.getLongitude()); 
        String latitude = String.valueOf(location.getLatitude()); 
         locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener); 
       } else { 
         String longitude = "0.00"; 
        String latitude = "0.00"; 
       } 
     } 
} 


} 
+0

請看這個,我已經在我的代碼中添加了這個,但是它沒有顯示任何輸出。我在我的代碼中只添加了一個權限,並且是access_fine_locations中的一個權限。 – radhika 2014-11-08 01:11:40