#android #gps
#Android #gps
Вопрос:
Я хотел бы создать фоновую службу для регистрации местоположения GPS. Когда дело доходит до выполнения, он не дает мне никаких периодических данных, независимо от того, в офисе, на улице или в сельской местности. Не могли бы вы рассказать мне, как получать местоположение GPS каждые n секунд? Иногда я получал исключение, подавленное нарушение политики StrictMode: получено StrictModeDiskReadViolation.
Мой код настроен следующим образом :
public class TaskpointActivity extends FragmentActivity implements LocationListener,
GoogleMap.InfoWindowAdapter {
private static final long POLLING_FREQ = 1000 * 2;
private LocationManager mLocationManager ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
...
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
mLocationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, POLLING_FREQ, 1, this);
mLocationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, POLLING_FREQ, 1, this);
} catch (Exception ex) {
SystemUtils.takeLog(this, ex.getMessage());
ex.printStackTrace();
}
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
Log.i(TAG, "onStatusChanged PROVIDER:" provider " STATUS:" String.valueOf(status));
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
Log.i(TAG, "onProviderEnabled PROVIDER:" provider);
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
Log.i(TAG, "onProviderDisabled PROVIDER:" provider);
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if(mLastLocation !=null) {
deviceSpeed = Math.sqrt( Math.pow(location.getLongitude() - mLastLocation.getLongitude(), 2)
Math.pow(location.getLatitude() - mLastLocation.getLatitude(), 2)
) / (location.getTime() - this.mLastLocation.getTime());
}else{
mLastLocation = location;
}
if (location.hasSpeed())
deviceSpeed = location.getSpeed();
SystemUtils.takeLog(this , "location latitude : " location.getLatitude() );
SystemUtils.takeLog(this , "location longitude : " location.getLongitude() );
SystemUtils.takeLog(this , "location speed device : " location.getSpeed() );
SystemUtils.takeLog(this , "location speed calculated : " deviceSpeed );
LatLng startPosition = markerSingle!=null ? markerSingle.getPosition() :
new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
if(executeFollowMe) {
double latitu = startPosition.latitude;
double longitu = startPosition.longitude ;
int fixed = 30;
for(int i = 0 ; i < 30 ; i ) {
if(i < 10) { // east
longitu = longitu (i 1) * 0.000003;
}else if(i >=10 amp;amp; i < 20) { // curve
int incre = i 1 ;
longitu = longitu incre * 0.000003;
latitu = latitu (fixed- incre) * 0.000003;
}else if(i >=20 amp;amp; i < 30) { // north
latitu = latitu (i 1) * 0.000003;
}
LatLng currentPostion = new LatLng (latitu , longitu) ;
prepareFollowMe(currentPostion);
//startPosition
}
SystemUtils.takeLog(TaskpointActivity.this, markerSingle!=null ? "prepare Follow me mock" : "prepare Follow me real device");
//LatLng positionX
}
}
Ответ №1:
Да, я тоже столкнулся с этой проблемой. Это происходит, когда мы используем
targetSdkVersion 23
в нашем
build.gradle
файл.
Когда вам нужно одновременно получить местоположение пользователя, вам нужно получить разрешение во время выполнения, тогда вы можете использовать
shouldShowRequestPermissionRationale()
этот метод проверяет, дает ли пользователь разрешение на разрешение ранее в нашем приложении, тогда он больше не будет показывать окно разрешений перед пользователем. это показывает, что пользователь дает разрешение в первый раз или если они дают денни ранее.
для получения дополнительной информации проверьте это: https://developer.android.com/training/permissions/requesting.html
и еще один способ решить эту проблему, просто установите
targetSdkVersion 22
вместо
targetSdkVersion 23
.
Комментарии:
1. Я перешел на targetSdkVersion 22 и протестировал с Android 6.0.1. по-прежнему нет периодического отчета о местоположении
2. @Raju Gujarati Создайте одну службу и в onStartCommand() вызовите один пользовательский класс GPSTracker , чтобы получить текущую широту, длину. периодически