Я разрабатываю приложение для Android, которое периодически считывает широту и долготу пользователя в фоновом режиме, а затем проверяет, находятся ли широта и долгота в пределах предопределенной границы или нет. Если нет, мы закроем заявку.
Я использую службу Android и locationManager для этих требований, однако приведенный ниже код отлично работает, когда я пытался использовать его в новом проекте Android. но когда я добавляю его в свой исходный проект, метод requestLocationUpdates () никогда не вызывается .. Я потратил 2 дня, пытаясь выяснить, в чем основная причина этой проблемы. Я пробовал все решения в переполнении стека, но у меня ничего не сработало.
Я добавил это разрешение (ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION)
Я добавил эти зависимости
реализация 'com.google.android.gms: play-services-maps: 11.8.0' скомпилировать com.google.maps.android:android-maps-utils:0.5
Я пробовал обоих провайдеров (GPS и сеть)
Звоню в эту услугу по основному виду деятельности
Я добавил службу в свой манифест
Это мой код
public class LocationControService extends Service {
List<LatLng> pointsList = new ArrayList<>();
private LocationManager locationManager;
double lat;
double lng;
LatLng userLocation;
private static Timer timer = new Timer();
// run on another Thread to avoid crash
private Handler mHandler = new Handler();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
// It Should Be A Query From The DB
pointsList.add(new LatLng(24.75057, 46.57516));
pointsList.add(new LatLng(24.81291, 46.74545));
pointsList.add(new LatLng(24.65076, 46.85119));
pointsList.add(new LatLng(24.57335, 46.67404));
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
startService();
}
private void startService()
{
timer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, 10000); }
@Override
public void onDestroy() {
timer.cancel();}
class TimeDisplayTimerTask extends TimerTask {
@Override
public void run() {
// run on another thread
mHandler.post(new Runnable() {
@Override
public void run() {
getUserLocation();
}
});
}
}
private void getUserLocation () {
try {
Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER,0 , 0, new LocationListener() {
@Override
public void onLocationChanged(Location location) {
lat = location.getLatitude();
lng = location.getLongitude();
userLocation = new LatLng( lat,lng);
if (isUserWhithinBoundray(userLocation))
Toast.makeText(getApplicationContext(),"You Are Within The Boundray", Toast.LENGTH_LONG).show();
else {
Toast.makeText(getApplicationContext(), "You Are Out Of The Boundray", Toast.LENGTH_LONG).show();
// SHOW DIALOG MSG .. OPEN SIGNIN INTENT
Intent myIntent = new Intent(LocationControService.this, MyDialog.class);
LocationControService.this.startActivity(myIntent);
}
locationManager.removeUpdates(this);
}
@Override
public void onStatusChanged(String s, int i, Bundle bundle) {
}
@Override
public void onProviderEnabled(String s) {
}
@Override
public void onProviderDisabled(String s) {
Toast.makeText(getApplicationContext(),"Turn the GPS on", Toast.LENGTH_LONG).show();
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(viewIntent);
}
}
);
}
catch (SecurityException e) { }
}
public Boolean isUserWhithinBoundray (LatLng userLocation) {
return PolyUtil.containsLocation(userLocation,pointsList,false);
}
}
Я добавил журналы, упомянутые @CaoMinhVu:
1. распечатайте журнал внутри getUserLocation, прежде чем пытаться
Log.d("Trck","Before Try");
2. распечатайте журнал внутри catch: e.printStackTrace () и также распечатайте журнал здесь.
e.printStackTrace();
Log.d("Trck", e.getMessage() );
3. Распечатайте журнал внутри каждого обратного вызова (я сделал то же самое для каждого обратного вызова)
Log.d("Trck", "onLocationChanged" );
Вот результат:
03-17 08:26:22.192 18559-18559/vigilant.com.vigilant.vigilant D/Trck: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.
03-17 08:26:32.183 18559-18559/vigilant.com.vigilant.vigilant D/Trck: Before Try
03-17 08:26:32.185 18559-18559/vigilant.com.vigilant.vigilant W/System.err: java.lang.SecurityException: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.
03-17 08:26:32.185 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.os.Parcel.readException(Parcel.java:1693)
03-17 08:26:32.185 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.os.Parcel.readException(Parcel.java:1646)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:792)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1205)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at vigilant.com.vigilant.vigilant.LocationControService.getUserLocation(LocationControService.java:100)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at vigilant.com.vigilant.vigilant.LocationControService.access$000(LocationControService.java:30)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at vigilant.com.vigilant.vigilant.LocationControService$TimeDisplayTimerTask$1.run(LocationControService.java:83)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.os.Handler.handleCallback(Handler.java:751)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.os.Looper.loop(Looper.java:154)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6692)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at java.lang.reflect.Method.invoke(Native Method)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
03-17 08:26:32.186 18559-18559/vigilant.com.vigilant.vigilant D/Trck: "network" location provider requires ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission.
@CaoMinhVu Я обновил свой вопрос, большое спасибо за ответ, я очень ценю это!
Теперь все ясно, вам нужно запросить разрешение: ACCESS_CORSE_LOCATION и ACCESS_FINE_LOCATION во время выполнения. Пожалуйста, прочтите это для примера:
https://developer.android.com/training/permissions/requesting.html
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.ACCESS_CORSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
Manifest.permission.ACCESS_CORSE_LOCATION)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed; request the permission
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.ACCESS_CORSE_LOCATION},
0x0);
}
} else {
// Permission has already been granted
}
Не могли бы вы добавить журнал в следующие позиции: 1. распечатайте журнал внутри getUserLocation перед попыткой 2. распечатайте журнал внутри catch: e.printStackTrace () и распечатайте журнал здесь также 3. Распечатайте журнал внутри каждого обратного вызова: onLocationChanged, onStatusChanged ... Прежде чем продолжить, посмотрим, к чему ведет логика.