android - 未检索到纬度和经度

标签 android gps location latitude-longitude

当 GPS 被禁用时,您可以使用 Intent Intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 启用它,但是当我返回到 Activity 时,我没有得到任何结果。我必须重新启动该 Activity ,换句话说,我必须返回到上一个 Activity ,然后重新打开它。请你帮助我好吗?

这是我的 doInBackground 方法:

@Override
protected String doInBackground(String... uri){

    final GPSTracker gpsTracker = new GPSTracker(myactivity);
    final String[] latitudine = {null};
    final String[] longitudine = {null};

    if(gpsTracker.canGetLocation())
    {
        latitudine[0] = String.valueOf(gpsTracker.latitude);
        longitudine[0] = String.valueOf(gpsTracker.longitude);
    }
    else
    {
        myactivity.runOnUiThread(new Runnable() {
            public void run() {

                final Dialog dialog = new Dialog(myactivity);
                dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                dialog.setContentView(R.layout.position_alert_dialog);

                Button dialogButton_deny = (Button) dialog.findViewById(R.id.deny);
                Button dialogButton_allow = (Button) dialog.findViewById(R.id.allow);

                dialogButton_allow.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        myactivity.startActivity(intent);
                        dialog.dismiss();

                        if(gpsTracker.canGetLocation())
                        {
                            latitudine[0] = String.valueOf(gpsTracker.latitude);
                            longitudine[0] = String.valueOf(gpsTracker.longitude);

                        }else{

                            latitudine[0] = "34.0522300";
                            longitudine[0] = "-118.2436800";

                        }

                    }
                });

                dialogButton_deny.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        dialog.dismiss();
                    }
                });

                dialog.show();

            }
        });
    }

GPSTracker:

public class GPSTracker extends Service implements LocationListener {
    private final Context mContext;

    boolean isGPSEnabled = false;

    boolean isNetworkEnabled = false;

    boolean canGetLocation = false;

    Location location;
    double latitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 meters

    private static final long MIN_TIME_BW_UPDATES = 1000 * 60; // 1 minute

    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

            isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

            isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
            } else {
                this.canGetLocation = true;
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this, Looper.getMainLooper());

                    Log.d("Network", "Network");

                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        updateGPSCoordinates();
                    }
                }
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                        Log.d("GPS Enabled", "GPS Enabled");

                        if (locationManager != null) {
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            updateGPSCoordinates();
                        }
                    }
                }
            }
        } catch (Exception e) {
            //e.printStackTrace();
            Log.e("Error : Location", "Impossible to connect to LocationManager", e);
        }

        return location;
    }

    public void updateGPSCoordinates() {
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
        }
    }

    public void stopUsingGPS() {
        if (locationManager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
                    // 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 Activity#requestPermissions for more details.
                    return;
                }
            }
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    public double getLatitude()
    {
        if (location != null)
        {
            latitude = location.getLatitude();
        }

        return latitude;
    }

    public double getLongitude()
    {
        if (location != null)
        {
            longitude = location.getLongitude();
        }

        return longitude;
    }

    public boolean canGetLocation()
    {
        return this.canGetLocation;
    }

    public List<Address> getGeocoderAddress(Context context)
    {
        if (location != null)
        {
            Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
            try
            {
                return geocoder.getFromLocation(latitude, longitude, 1);
            }
            catch (IOException e)
            {
                //e.printStackTrace();
                Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e);
            }
        }

        return null;
    }

    public String getAddressLine(Context context)
    {
        List<Address> addresses = getGeocoderAddress(context);
        if (addresses != null && addresses.size() > 0)
        {
            Address address = addresses.get(0);

            return address.getAddressLine(0);
        }
        else
        {
            return null;
        }
    }

    public String getLocality(Context context)
    {
        List<Address> addresses = getGeocoderAddress(context);
        if (addresses != null && addresses.size() > 0)
        {
            Address address = addresses.get(0);

            return address.getLocality();
        }
        else
        {
            return null;
        }
    }

    public String getSubLocality(Context context)
    {
        List<Address> addresses = getGeocoderAddress(context);
        if (addresses != null && addresses.size() > 0)
        {
            Address address = addresses.get(0);

            return address.getSubLocality();
        }
        else
        {
            return null;
        }
    }

    public String getPostalCode(Context context)
    {
        List<Address> addresses = getGeocoderAddress(context);
        if (addresses != null && addresses.size() > 0)
        {
            Address address = addresses.get(0);

            return address.getPostalCode();
        }
        else
        {
            return null;
        }
    }

    public String getCountryName(Context context)
    {
        List<Address> addresses = getGeocoderAddress(context);
        if (addresses != null && addresses.size() > 0)
        {
            Address address = addresses.get(0);

            return address.getCountryName();
        }
        else
        {
            return null;
        }
    }

    @Override
    public void onLocationChanged(Location location)
    {
    }

    @Override
    public void onProviderDisabled(String provider)
    {
    }

    @Override
    public void onProviderEnabled(String provider)
    {
    }    

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

    @Override
    public IBinder onBind(Intent intent)
    {
        return null;
    }
}

编辑

public class GPSTracker extends Service implements LocationListener, GoogleApiClient.ConnectionCallbacks {
private final Context mContext;

boolean isPlayServicesEnabled = false;

boolean isGPSEnabled = false;

boolean isNetworkEnabled = false;

boolean canGetLocation = false;

Location location;
double latitude;
double longitude;

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 meters

private static final long MIN_TIME_BW_UPDATES = 1000 * 60; // 1 minute

protected LocationManager locationManager;

public GPSTracker(Context context) {
    this.mContext = context;
}

public Location getLocation() {
    try {
        locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);

        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this, Looper.getMainLooper());

                Log.d("Network", "Network");

                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    updateGPSCoordinates();
                }
            }
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                    Log.d("GPS Enabled", "GPS Enabled");

                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        updateGPSCoordinates();
                    }
                }
            }
        }
    } catch (Exception e) {
        //e.printStackTrace();
        Log.e("Error : Location", "Impossible to connect to LocationManager", e);
    }

    return location;
}

public void updateGPSCoordinates() {
    if (location != null) {
        latitude = location.getLatitude();
        longitude = location.getLongitude();
    }
}

public void stopUsingGPS() {
    if (locationManager != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
                // 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 Activity#requestPermissions for more details.
                return;
            }
        }
        locationManager.removeUpdates(GPSTracker.this);
    }
}

public double getLatitude() {
    if (location != null) {
        latitude = location.getLatitude();
    }

    return latitude;
}

public double getLongitude() {
    if (location != null) {
        longitude = location.getLongitude();
    }

    return longitude;
}

public boolean canGetLocation() {
    return this.canGetLocation;
}

public List<Address> getGeocoderAddress(Context context) {
    if (location != null) {
        Geocoder geocoder = new Geocoder(context, Locale.ENGLISH);
        try {
            return geocoder.getFromLocation(latitude, longitude, 1);
        } catch (IOException e) {
            //e.printStackTrace();
            Log.e("Error : Geocoder", "Impossible to connect to Geocoder", e);
        }
    }

    return null;
}

public String getAddressLine(Context context) {
    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0) {
        Address address = addresses.get(0);

        return address.getAddressLine(0);
    } else {
        return null;
    }
}

public String getLocality(Context context) {
    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0) {
        Address address = addresses.get(0);

        return address.getLocality();
    } else {
        return null;
    }
}

public String getSubLocality(Context context) {
    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0) {
        Address address = addresses.get(0);

        return address.getSubLocality();
    } else {
        return null;
    }
}

public String getPostalCode(Context context) {
    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0) {
        Address address = addresses.get(0);

        return address.getPostalCode();
    } else {
        return null;
    }
}

public String getCountryName(Context context) {
    List<Address> addresses = getGeocoderAddress(context);
    if (addresses != null && addresses.size() > 0) {
        Address address = addresses.get(0);

        return address.getCountryName();
    } else {
        return null;
    }
}

@Override
public void onLocationChanged(Location location) {

    this.location = location;

}

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

}

@Override
public void onProviderDisabled(String provider) {
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onConnected(Bundle connectionHint) {
    isPlayServicesEnabled = true;
    getLocation();
}

@Override
public void onConnectionSuspended(int cause) {
    isPlayServicesEnabled = false;
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

这是我调用 AsyncTask 的地方:

public class Weather extends AppCompatActivity{

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.meteo_nuovo);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_layout);
    setSupportActionBar(toolbar);

    toolbar.setPadding(0, getStatusBarHeight(), 0, 0);

    assert getSupportActionBar() != null;

    this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);    
    this.getSupportActionBar().setDisplayShowTitleEnabled(false);  

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }

    new WeatherApi(this).execute();  // the doInBackground method above is from this class

}

public int getStatusBarHeight() {
    int result = 0;

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
    }
    return result;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

}

最佳答案

据我遇到过这个问题,但我已经用自己的方式解决了。

在您的 GPSTracker 类中创建一个方法。

public void onActivityResult(int requestCode, int resultcode, Intent data) {

}

现在使用 startActivityForResult 而不是 startActivity 启动 Activity ,

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivityForResult(intent, 0);

现在,当您返回 onActivityResult 方法时,您的 Activity 中

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    gpsTracker.onActivityResult(requestCode, resultCode, data);// This line is more important 

    if (requestCode == 0) {

        handler.sendEmptyMessage(0);

    }
}

现在处理程序

android.os.Handler handler = new android.os.Handler(new android.os.Handler.Callback() {
    @Override
    public boolean handleMessage(Message message) {
        try {
              Location location = gpsTracker.getLocation();
              latitude = location.getLatitude();
              longitude = location.getLongitude();
        } catch (Exception e) {
            Log.v("Error:", "Location is null");
        }
        return false;
    }
});

使用这个你可以立即知道我得到的位置。也许会有帮助。就我而言,它工作正常。

关于android - 未检索到纬度和经度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34571942/

相关文章:

iOS 等待位置管理器初始化

android - 如何获取未在 Android Activity 中单击的按钮的时间

java - 线程间共享数据

nginx - 使用 Nginx 从 URL 中删除索引文件

ios - 通过 GPS 提高测量距离的准确性

java - Android 位置 api 不工作

android - 在后台获取过于频繁的位置更新

java - 安排多个重复警报

java - 如何在android中找到两个区域之间的距离

android - 谷歌安卓 map v2 MetersToEquatorPixel