我试图在Android中使用LocationListener方法获取当前设备位置。在某些手机中,它不起作用或onlocationchanged没有被调用。在这种情况下如何获得位置? 在oncreate:
mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 0, this);
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
和这个
@Override
public void onLocationChanged(Location location) {
latitude = location.getLatitude();
longitude = location.getLongitude();
Log.e("TAG","lat and long "+latitude+" "+longitude);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
但是在Marshmallow
下面的版本中没有调用onLocationChanged答案 0 :(得分:2)
使用此代码在所有设备中运行并进行测试:
private void getCurrentLocation() {
// Log.e("getLocation","Called");
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
mlat = location.getLatitude();
mlon = location.getLongitude();
String mLogn = Double.toString(mlon);
String mLatd = Double.toString(mlat);
// Log.e("mLogn",""+mLogn);
// Log.e("mLatd",""+mLatd);
mLogn=mLogn.trim();
mLatd=mLatd.trim();
if (mLatd==null || mLogn==null) {
if (mLatd.isEmpty()) {
mLatd = "No data found";
}
if (mLogn.isEmpty()) {
mLogn = "No data found";
}
}
// Log.e("Location",""+mlon+" "+mlat);
// Toast.makeText(CampaignTrain.this, "your location is " + mLogn + " " + mLatd, Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
}
};
String locationProvide = LocationManager.NETWORK_PROVIDER;
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},COARSE_LOCATION_REQUEST_CODE);
return;
}
}
if ( ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},FINE_LOCATION_REQUEST_CODE);
return;
}
}
locationManager.requestLocationUpdates(locationProvide, 0, 0, locationListener);
Location lastLocation=locationManager.getLastKnownLocation(locationProvide);
}
并设置运行时权限:
int FINE_LOCATION_REQUEST_CODE=101;
int COARSE_LOCATION_REQUEST_CODE=102;
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode)
{
case COARSE_LOCATION_REQUEST_CODE:
{
if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
}
else
{
mLatd="User denied location";
mLogn="User denied location";
}
return;
}
case FINE_LOCATION_REQUEST_CODE:
{
if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED)
{
}
else
{
mLatd="User denied location";
mLogn="User denied location";
}
return;
}
}
}