Урок 138. Определение местоположения. GPS координаты.

Обсуждение уроков
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение Mikhail_dev » 31 май 2014, 10:48

Никак. Это кеш операционной системы и приложение по определению не имеет прав доступа к ней.
Я уверен что есть ответ по этому поводу в интернете. Я как понял вы умеете пользоваться stackoverflow(что является глубочайшей редкостью на этом сайте =) ). Поищите, думаю узнаете истину.
И да, если узнаете, дайте знать. Тоже интересно.

Валакин
Сообщения: 3
Зарегистрирован: 07 июн 2014, 14:29

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение Валакин » 07 июн 2014, 14:35

кто нибудь проверял что выдает getSpeed ?
у меня почему то приходит скорость в два раза большая чем реальная)


Аватара пользователя
n0tb0dy
Сообщения: 135
Зарегистрирован: 14 фев 2014, 09:42

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение n0tb0dy » 07 июн 2014, 19:33

как чистить кэш GPS я так и не нашел, но в своем приложении обошел это чисто логически, как всегда в таких случаях приделывается костыль :)

просто тупо не вывожу данные если нет интернет конекшена, а когда конекшен появляется, то по этому событию инициирую обновление данных и все :) и получаю свеженькие координаты

Аватара пользователя
n0tb0dy
Сообщения: 135
Зарегистрирован: 14 фев 2014, 09:42

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение n0tb0dy » 07 июн 2014, 19:34

спасибо большое за ответы и поддержку на этом форуме

Аватара пользователя
n0tb0dy
Сообщения: 135
Зарегистрирован: 14 фев 2014, 09:42

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение n0tb0dy » 07 июн 2014, 19:40

И кстати, еще один моментик не дает покоя, тот же Navtel на моем Galaxy Tab находит спутники, при старте еще, за несколько секунд, мое же приложение получает данные куда дольше, хотя тоже получает. Чуть меньше минуты проходит, ну или в этих пределах.

Сдается мне в Navitel как то хитрее работают с GPS провайдером, хотя они конечно не одну уже собаку съели на этом деле :)

Валакин
Сообщения: 3
Зарегистрирован: 07 июн 2014, 14:29

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение Валакин » 09 июн 2014, 07:36

Mikhail_dev писал(а):А в чем меряете её?
Мерил в м/с, умножаю на 3,6, получаю км/ч. На машине на скорости 100 км/ч показывает нормально, более менее точно, а вот когда бегу даже 6км/ч, трудно бежать, хотя по времени и расстоянию знаю что у меня скорость около 12км/ч. Возможно у меня где то ошибки в приложении, поэтому ищу тех кто использовал getSpeed, что бы убедиться что с getSpeed можно работать)

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение Mikhail_dev » 09 июн 2014, 13:23

Странные у вас подсчеты бега. На машине проверяйте, где можно посмотреть спидометр, а не в догадки играйте. У нас в программе getSpeed всегда нормальные данные выдает, потому как он получает их от спутников, а не сам какие-то расчеты производит.
Можете скачать наше приложение (у меня в подписи) и побегать с ним, если будет выдавать ту же скорость что и у вас, то всё в порядке.

Аватара пользователя
n0tb0dy
Сообщения: 135
Зарегистрирован: 14 фев 2014, 09:42

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение n0tb0dy » 10 июн 2014, 15:09

Добрый день!

А старшие товарищи могут осветить в этой теме или в новом уроке как получать координаты через Google Play Service Framework?



есть вот такой код на стеке переполненном :)

[syntax=java]
package com.example.fusedLoctionTest.service;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationRequest;

public class FusedLocationService extends Service implements GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener{
private static final LocationRequest REQUEST = LocationRequest.create()
.setInterval(0)
.setFastestInterval(0)
.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
public static final String LOCATION_RECEIVED = "fused.location.received";
private Long now;

private LocationClient mLocationClient;
private final Object locking = new Object();
private Runnable onFusedLocationProviderTimeout;
private Handler handler = new Handler();

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
now = Long.valueOf(System.currentTimeMillis());
mLocationClient = new LocationClient(this, this, this);
mLocationClient.connect();
return START_STICKY;
}

@Override
public void onConnected(Bundle bundle) {
Log.d("FusedLocationService", "Fused Location Provider got connected successfully");
mLocationClient.requestLocationUpdates(REQUEST,this);
onFusedLocationProviderTimeout = new Runnable() {
public void run() {
Log.d("FusedLocationService", "location Timeout");

Location lastbestStaleLocation=getLastBestStaleLocation();
sendLocationUsingBroadCast(lastbestStaleLocation);

if(lastbestStaleLocation!=null)
Log.d("FusedLocationService", "Last best location returned ["+lastbestStaleLocation.getLatitude()+","+lastbestStaleLocation.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis())-now)+" ms");

if(mLocationClient.isConnected())
mLocationClient.disconnect();
}
};
handler.postDelayed(onFusedLocationProviderTimeout, 20000);//20 sec
}

private void sendLocationUsingBroadCast(Location location) {
Intent locationBroadcast = new Intent(FusedLocationService.LOCATION_RECEIVED);
locationBroadcast.putExtra("LOCATION", location);
locationBroadcast.putExtra("TIME", Long.valueOf(System.currentTimeMillis()-now) +" ms");
LocalBroadcastManager.getInstance(this).sendBroadcast(locationBroadcast);
stopSelf();
}

@Override
public void onDisconnected() {
Log.d("FusedLocationService","Fused Location Provider got disconnected successfully");
stopSelf();
}

@Override
public void onLocationChanged(Location location) {
synchronized (locking){
Log.d("FusedLocationService", "Location received successfully ["+location.getLatitude()+","+location.getLongitude()+"] in "+(Long.valueOf(System.currentTimeMillis()-now))+" ms");

handler.removeCallbacks(onFusedLocationProviderTimeout);
if(mLocationClient.isConnected())
mLocationClient.removeLocationUpdates(this);

sendLocationUsingBroadCast(location);

if(mLocationClient.isConnected())
mLocationClient.disconnect();
}
}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d("FusedLocationService", "Error connecting to Fused Location Provider");
}

public Location getLastBestStaleLocation() {
Location bestResult = null;
LocationManager locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location lastFusedLocation=mLocationClient.getLastLocation();
Location gpsLocation = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Location networkLocation = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (gpsLocation != null && networkLocation != null) {
if (gpsLocation.getTime() > networkLocation.getTime())
bestResult = gpsLocation;
} else if (gpsLocation != null) {
bestResult = gpsLocation;
} else if (networkLocation != null) {
bestResult = networkLocation;
}

//take Fused Location in to consideration while checking for last stale location
if (bestResult != null && lastFusedLocation != null) {
if (bestResult.getTime() < lastFusedLocation.getTime())
bestResult = lastFusedLocation;
}

return bestResult;
}

@Override
public IBinder onBind(Intent intent) {
return null;
}
}
[/syntax]

вот если бы по этой теме сделать урок :roll:

все это взято от сюда http://stackoverflow.com/questions/1574 ... d-is-never

все по той же проблеме onLocationChanged is never called - не вызывается иногда onLocationChanged и лечится только перезагрузкой устройства


Валакин
Сообщения: 3
Зарегистрирован: 07 июн 2014, 14:29

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение Валакин » 12 июн 2014, 14:42

Mikhail_dev писал(а):Странные у вас подсчеты бега. На машине проверяйте, где можно посмотреть спидометр, а не в догадки играйте. У нас в программе getSpeed всегда нормальные данные выдает, потому как он получает их от спутников, а не сам какие-то расчеты производит.
Можете скачать наше приложение (у меня в подписи) и побегать с ним, если будет выдавать ту же скорость что и у вас, то всё в порядке.
Спасибо за ответ,
как у сапожника без сапог очень редко имею смарт с андроидом, на эмуляторе не представляю как это можно проверить.
Я в программе использовал код урока 138, могу только надеяться что это было связано с тем что
скорость определяется не только по gps но и по вышкам сотовой связи.

markot
Сообщения: 2
Зарегистрирован: 16 июл 2014, 07:36

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение markot » 16 июл 2014, 07:41

Подскажите, пожалуйста, как заставить программу получать GPS данные, когда телефон находится в спящем режиме.

markot
Сообщения: 2
Зарегистрирован: 16 июл 2014, 07:36

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение markot » 16 июл 2014, 21:07

Внимательно пересмотрел урок, и понял, что нужно в метода onPause убрать locationManager.removeUpdates(locationListener). После чего в спящем режиме GPS данные продолжают поступать.

defond
Сообщения: 1
Зарегистрирован: 29 июл 2014, 09:59

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение defond » 29 июл 2014, 18:09

Здравствуйте.

Подскажите пожалуйста, я хочу сделать АлертДиалог в случае, если отсутствует подключение GPS. Вы можете подсказать в каком месте Активити нужно вставить код вызова АлертДиалога?

Второй вопрос - как сделать автоматический переход к другому Активити в случае, если GPS включен? Опять же интересует место, куда вставлять код вызывающий переход.

Сам код особо не нужен, т.к. хочу попробовать сам. Иначе не научиться.

Заранее спасибо! :)

sashas10071
Сообщения: 4
Зарегистрирован: 25 июл 2014, 11:33

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение sashas10071 » 07 авг 2014, 10:19

День добрый.Прошу о помощи.Приложение после запуска зависает и выдает Unfortunately,haz stopped
Также эта программа зависает не только в эмуляторе но и на современном смартфоне.Я новичок
в програмировании и никак ее не могу запустить.

В Problems 1 warning
Description Resource Path Location Type Implicitly using the default locale is a common
source of bugs: Use String.format(Locale, ...) instead MainActivity.java
/gps/src/ru/startandroid/develop/p1381location line 100 Android Lint Problem

В MainActivity Eclipse подчеркнул красным в строке return String.format слово format.Все
исправления что Eclipse предлагает никчему не приводят.
private String formatLocation(Location location)

{
if (location == null)
return "";
return String.format(
"Coordinates: lat = %1$.4f, lon = %2$.4f,

time = %3$tF %3$tT",
location.getLatitude(),

location.getLongitude(), new Date(
location.getTime()));
}

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение Mikhail_dev » 07 авг 2014, 10:45

Ставьте код в соответствующие теги, а не пишите его сплошным текстом.
Чтобы понять причину ошибки, нужно её найти. Посмотрите у меня в подписи ссылку про LogCat, она ведет на вебинар

sashas10071
Сообщения: 4
Зарегистрирован: 25 июл 2014, 11:33

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение sashas10071 » 07 авг 2014, 11:33

Mikhail_dev писал(а):Ставьте код в соответствующие теги, а не пишите его сплошным текстом.
Чтобы понять причину ошибки, нужно её найти. Посмотрите у меня в подписи ссылку про LogCat, она ведет на вебинар
Вставил код MainActivity в тэги.

[syntax=java]package ru.startandroid.develop.p1381location;

import java.util.Date;

import android.app.Activity;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView tvEnabledGPS;
TextView tvStatusGPS;
TextView tvLocationGPS;
TextView tvEnabledNet;
TextView tvStatusNet;
TextView tvLocationNet;

private LocationManager locationManager;
StringBuilder sbGPS = new StringBuilder();
StringBuilder sbNet = new StringBuilder();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvEnabledGPS = (TextView) findViewById(R.id.tvEnabledGPS);
tvStatusGPS = (TextView) findViewById(R.id.tvStatusGPS);
tvLocationGPS = (TextView) findViewById(R.id.tvLocationGPS);
tvEnabledNet = (TextView) findViewById(R.id.tvEnabledNet);
tvStatusNet = (TextView) findViewById(R.id.tvStatusNet);
tvLocationNet = (TextView) findViewById(R.id.tvLocationNet);

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
}

@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
1000 * 10, 10, locationListener);
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER, 1000 * 10, 10,
locationListener);
checkEnabled();
}

@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(locationListener);
}

private LocationListener locationListener = new LocationListener() {

@Override
public void onLocationChanged(Location location) {
showLocation(location);
}

@Override
public void onProviderDisabled(String provider) {
checkEnabled();
}

@Override
public void onProviderEnabled(String provider) {
checkEnabled();
showLocation(locationManager.getLastKnownLocation(provider));
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
if (provider.equals(LocationManager.GPS_PROVIDER)) {
tvStatusGPS.setText("Status: " + String.valueOf(status));
} else if (provider.equals(LocationManager.NETWORK_PROVIDER)) {
tvStatusNet.setText("Status: " + String.valueOf(status));
}
}
};

private void showLocation(Location location) {
if (location == null)
return;
if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
tvLocationGPS.setText(formatLocation(location));
} else if (location.getProvider().equals(
LocationManager.NETWORK_PROVIDER)) {
tvLocationNet.setText(formatLocation(location));
}
}

private String formatLocation(Location location) {
if (location == null)
return "";
return String.format(
"Coordinates: lat = %1$.4f, lon = %2$.4f, time = %3$tF %3$tT",
location.getLatitude(), location.getLongitude(), new Date(
location.getTime()));
}

private void checkEnabled() {
tvEnabledGPS.setText("Enabled: "
+ locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER));
tvEnabledNet.setText("Enabled: "
+ locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
}

public void onClickLocationSettings(View view) {
startActivity(new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
};

}[/syntax]

bartle96
Сообщения: 37
Зарегистрирован: 04 окт 2014, 13:49

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение bartle96 » 16 окт 2014, 18:49

Сколько строк кода.. Ужас.
Я новичок в java, помогите пожалуйста.
Мне не нужно создавать потоки или проверять изменения координат или обновлять их каждый раз в какой то промежуток времени.
Мне нужно просто один раз желательно в onCreate записать в переменные геоданные.
Причем не важно каким провайдером. Если включен gps и есть к нему доступ, то через него иначе через сеть.
Нашел что то подобное

Код: Выделить всё

public class GeoService extends Service implements LocationListener {
    LocationManager lm;
    public IBinder onBind(Intent arg0) {
    return null;
}
public void onCreate() {
   lm = (LocationManager) getSystemService(LOCATION_SERVICE);
       lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                60000, 0, this); // пытаемся получить данные каждые 60 секунд

}

public void onLocationChanged(Location location) {
// получили требуемые данные:
double latitude = location.getLatitude();
double longitude = location.getLongitude();

if(need_refresh){ //разовое событие, сигнализирущее об обновлении параметров    
    lm.removeUpdates(this);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
            120000,0, this);}       
}
Но как то не актив :?

bartle96
Сообщения: 37
Зарегистрирован: 04 окт 2014, 13:49

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение bartle96 » 16 окт 2014, 20:10

Вот нашел это, но некоторые переменные светятся красным так как это фрагмент кода(

Код: Выделить всё

public Location getLocation() {
	try {         
	mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);

		// getting GPS status
		boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

		// getting network status
		boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

		if (!isGPSEnabled && !isNetworkEnabled) {
			// no network provider is enabled
		} else {
			// First get location from Network Provider
			if (isNetworkEnabled) {                   
			mLocationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER,  MIN_TIME_BW_UPDATES,  MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
				Log.d("Network", "Network");
				if (mLocationManager != null) {                        
				location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
					if (location != null) {                     
					lat = location.getLatitude();                      
					lng = location.getLongitude();
					}
				}
			}
			//get the location by gps
			if (isGPSEnabled) {
				if (location == null) {                  
				mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
					Log.d("GPS Enabled", "GPS Enabled");
					if (mLocationManager != null) {
						location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
						if (location != null) {  
						
							lat = location.getLatitude();         
							lng = location.getLongitude();
						}
					}
				}
			}
		}

	} catch (Exception e) {   
		e.printStackTrace();
	}

	return location;
}
Не могли бы вы мне восстановить картину?

bartle96
Сообщения: 37
Зарегистрирован: 04 окт 2014, 13:49

Re: Урок 138. Определение местоположения. GPS координаты.

Сообщение bartle96 » 18 окт 2014, 20:54

Что ж мне никто не поможет(

Ответить