#android
#Android
Вопрос:
Как следует из названия, я получаю свое текущее местоположение как 0.0, 0.0 при регистрации в LogCat. Я перепробовал все решения, представленные в сети, но не получил никакого решения. Пожалуйста, помогите. Мой код приведен ниже, я также предоставил все разрешения в манифесте. Любая помощь была бы действительно оценена.
MapsActivity.java
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private GPStracker gpsTracker;
private Location mLocation;
double latitude, longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Checking permission is allowed or not
int Permission_All = 1;
String[] Permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION};
if(!hasPermissions(this, Permissions)){
ActivityCompat.requestPermissions(this, Permissions, Permission_All);
}
gpsTracker = new GPStracker(MapsActivity.this);
// checking GPS is enabled or not//
gpsTracker.chkGPSorNetworkEnabled();
mLocation = gpsTracker.getLocation();
if(mLocation!=null) {
latitude = mLocation.getLatitude();
longitude = mLocation.getLongitude();
}
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(latitude, longitude);
mMap.addMarker(new MarkerOptions().position(sydney).title("I'm here..."));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
public static boolean hasPermissions(Context context, String... permissions){
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M amp;amp; context!=null amp;amp; permissions!=null){
for(String permission: permissions){
if(ActivityCompat.checkSelfPermission(context, permission)!= PackageManager.PERMISSION_GRANTED){
return false;
}
}
}
return true;
}
}
GPStracker.java
public class GPStracker extends Service implements LocationListener {
private final Context context;
boolean isGPSEnabled =false;
boolean isNetworkEnabled =false;
boolean canGetLocation = false;
Location location;
protected LocationManager locationManager;
public GPStracker(Context context){
this.context=context;
}
// Class to check GPS/Location is enabled or not //
public void chkGPSorNetworkEnabled(){
locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
isGPSEnabled=locationManager.isProviderEnabled(locationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(locationManager.NETWORK_PROVIDER);
String gpsMsg = "Please Enable your GPS/Location Service";
String netMsg = "Please Enable your Network Service";
if(!isGPSEnabled){
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setMessage(gpsMsg);
dialog.setPositiveButton("GPS Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
context.startActivity(gpsIntent);
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
}else if(!isNetworkEnabled){
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setMessage(netMsg);
dialog.setPositiveButton("Network Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Intent gpsIntent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
context.startActivity(gpsIntent);
}
});
dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
}else{
getLocation();
}
}
//Create a GetLocation Method //
public Location getLocation(){
try{
locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
isGPSEnabled = locationManager.isProviderEnabled(locationManager.GPS_PROVIDER);
isNetworkEnabled=locationManager.isProviderEnabled(locationManager.NETWORK_PROVIDER);
//chkGPSorNetworkEnabled();
if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED ){
if(isGPSEnabled){
if(location==null){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000,10,this);
if(locationManager!=null){
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}
}
}
// if location is not found from GPS than it will found from network //
if(location==null){
if(isNetworkEnabled){
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000,10,this);
if(locationManager!=null){
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
}
}
}
}
}catch(Exception ex){
}
return location;
}
// followings are the default method if we imlement LocationListener //
public void onLocationChanged(Location location){
}
public void onStatusChanged(String Provider, int status, Bundle extras){
}
public void onProviderEnabled(String Provider){
}
public void onProviderDisabled(String Provider){
}
public IBinder onBind(Intent arg0){
return null;
}
}
Комментарии:
1. Можете ли вы показать нам свой манифест, чтобы увидеть все разрешения?
2. вам нужно реализовать
onBind()
и вернуть экземплярIBinder
, иначе служба не будет привязываться.3. Мартин Цайтлер, не могли бы вы рассказать, как, поскольку я новичок в этом.
Ответ №1:
Вы должны использовать метод обратного вызова onLocationChanged () для прослушивания текущих обновлений местоположения. В этом методе location instance предоставит вам как широту, так и долготу. Добавьте маркер на карту также тем же методом. Вам понадобится экземпляр map и отправьте его в класс GPSTracker через конструктор при создании экземпляра в MapsActivity
public void onLocationChanged(Location location){
mMap.clear();
LatLng latlng = new LatLng(location.getLatitude(), location.getLongitude());
mMap.addMarker(new MarkerOptions().position(latlng).title("I'm here..."));
mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
latlng, 17.0f)
}
Ответ №2:
Вместо использования Location API попробуйте использовать FusedLocationProviderApi, который является последним и точным, поскольку оптимизировал способ получения местоположения. и для понимания того, работает код или нет, попробуйте открыть приложение Map, а затем нажмите кнопку GPS, когда получите местоположение, затем попробуйте запустить свое приложение. Дайте мне знать, поможет это или нет.Но я бы настоятельно рекомендовал вам использовать FusedLocationProviderApi.