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

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

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

Сообщение Mikhail_dev » 27 апр 2015, 13:50

Только делать запрос в интернет с указанием необходимых координат. Вот тема
http://stackoverflow.com/questions/1995 ... d-latitude
ну или использовать Google Play Services для определения местоположения, и там есть возможность узнать высоту над уровнем моря, так сказать с коробки

Genka_Volkov
Сообщения: 8
Зарегистрирован: 27 апр 2015, 13:20

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

Сообщение Genka_Volkov » 27 апр 2015, 14:54

POST запросом?
да


Genka_Volkov
Сообщения: 8
Зарегистрирован: 27 апр 2015, 13:20

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

Сообщение Genka_Volkov » 27 апр 2015, 15:01

Mikhail_dev писал(а):Ну вот и действуйте! =)
в этом то вся проблема, что я не знаю как начать даже :(

Genka_Volkov
Сообщения: 8
Зарегистрирован: 27 апр 2015, 13:20

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

Сообщение Genka_Volkov » 27 апр 2015, 15:03

Mikhail_dev писал(а):Ну вот и действуйте! =)
дело в том, что я только по урокам пока могу разбираться. может где то есть какие нибудь примеры?

trubasyava
Сообщения: 4
Зарегистрирован: 27 апр 2015, 12:04

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

Сообщение trubasyava » 02 май 2015, 18:01

Mikhail_dev писал(а):Только делать запрос в интернет с указанием необходимых координат. Вот тема
http://stackoverflow.com/questions/1995 ... d-latitude
ну или использовать Google Play Services для определения местоположения, и там есть возможность узнать высоту над уровнем моря, так сказать с коробки
спасибо, попробовав это я узнал, что это устаревший код, который уже не компилится в андроид студио, посмотрел как по-новому будет, в общем вот, что написал, но приложение крашится, first - метод-обработчик нажатия на кнопку, нажимая на кнопку, приложение сразу выкидывает ошибку и закрывается, я вообще не понимаю в чём проблема, даже ворнингов нет

В МАНИФЕСТЕ прописал всё, что надо

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

public class MainActivity extends ActionBarActivity {

    //String result = null;

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

    public void first(View view)
    {
        String stringUrl = "http://maps.googleapis.com/maps/api/elevation/xml?locations=47.237222,39.712222&sensor=true";
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            new DownloadTask().execute(stringUrl);
        } else {
            Toast.makeText(this,"НЕТ СЕТИ ИЛИ типатого",Toast.LENGTH_SHORT).show();
        }

    }



    private class DownloadTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {

            // params comes from the execute() call: params[0] is the url.
            try {
                String str = downloadUrl(urls[0]);
                Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
                return str;
            } catch (IOException e) {
                Toast.makeText(MainActivity.this,"НЕВОЗМОЖНО ПОДКЛ К URL",Toast.LENGTH_SHORT).show();
                return "Unable to retrieve web page. URL may be invalid.";
            }
        }
        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
        }

        private String downloadUrl(String myurl) throws IOException {
            InputStream is = null;
            // Only display the first 500 characters of the retrieved
            // web page content.
            BufferedReader reader = null;

            try {
                URL url = new URL(myurl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                // Starts the query
                conn.connect();
                int response = conn.getResponseCode();
                Toast.makeText(MainActivity.this,"The response is: " + response,Toast.LENGTH_SHORT).show();
                is = conn.getInputStream();

                // Convert the InputStream into a string
                String contentAsString;
                reader = new BufferedReader(new InputStreamReader(is));


                contentAsString=reader.readLine();//просто прочитал, чтоб хоть что-то было

                return contentAsString;

                // Makes sure that the InputStream is closed after the app is
                // finished using it.
            }
            finally {
                if (is != null) {
                    is.close();
                }
                if (reader != null) {
                    reader.close();
                }
            }
        }
    }
}
Последний раз редактировалось trubasyava 02 май 2015, 18:50, всего редактировалось 1 раз.

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

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

Сообщение doter.ua » 02 май 2015, 18:12

Используй code для вставки кода на форум.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

trubasyava
Сообщения: 4
Зарегистрирован: 27 апр 2015, 12:04

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

Сообщение trubasyava » 02 май 2015, 22:41

trubasyava писал(а):
Mikhail_dev писал(а):Только делать запрос в интернет с указанием необходимых координат. Вот тема
http://stackoverflow.com/questions/1995 ... d-latitude
ну или использовать Google Play Services для определения местоположения, и там есть возможность узнать высоту над уровнем моря, так сказать с коробки
спасибо, попробовав это я узнал, что это устаревший код, который уже не компилится в андроид студио, посмотрел как по-новому будет, в общем вот, что написал, но приложение крашится, first - метод-обработчик нажатия на кнопку, нажимая на кнопку, приложение сразу выкидывает ошибку и закрывается, я вообще не понимаю в чём проблема, даже ворнингов нет

В МАНИФЕСТЕ прописал всё, что надо

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

public class MainActivity extends ActionBarActivity {

    //String result = null;

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

    public void first(View view)
    {
        String stringUrl = "http://maps.googleapis.com/maps/api/elevation/xml?locations=47.237222,39.712222&sensor=true";
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        if (networkInfo != null && networkInfo.isConnected()) {
            new DownloadTask().execute(stringUrl);
        } else {
            Toast.makeText(this,"НЕТ СЕТИ ИЛИ типатого",Toast.LENGTH_SHORT).show();
        }

    }



    private class DownloadTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {

            // params comes from the execute() call: params[0] is the url.
            try {
                String str = downloadUrl(urls[0]);
                Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show();
                return str;
            } catch (IOException e) {
                Toast.makeText(MainActivity.this,"НЕВОЗМОЖНО ПОДКЛ К URL",Toast.LENGTH_SHORT).show();
                return "Unable to retrieve web page. URL may be invalid.";
            }
        }
        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {
            Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
        }

        private String downloadUrl(String myurl) throws IOException {
            InputStream is = null;
            // Only display the first 500 characters of the retrieved
            // web page content.
            BufferedReader reader = null;

            try {
                URL url = new URL(myurl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                // Starts the query
                conn.connect();
                int response = conn.getResponseCode();
                Toast.makeText(MainActivity.this,"The response is: " + response,Toast.LENGTH_SHORT).show();
                is = conn.getInputStream();

                // Convert the InputStream into a string
                String contentAsString;
                reader = new BufferedReader(new InputStreamReader(is));


                contentAsString=reader.readLine();//просто прочитал, чтоб хоть что-то было

                return contentAsString;

                // Makes sure that the InputStream is closed after the app is
                // finished using it.
            }
            finally {
                if (is != null) {
                    is.close();
                }
                if (reader != null) {
                    reader.close();
                }
            }
        }
    }
}


в общем сделал рабочий вариант, делается запрос по координатам географическим и показывается инфа

может кому пригодится код

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

public class MainActivity extends ActionBarActivity {

    //String result = null;
    TextView tv=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button but_first=(Button)findViewById(R.id.button1);
        tv=(TextView)findViewById(R.id.textView);
        but_first.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String stringUrl = "http://maps.googleapis.com/maps/api/elevation/xml?locations=47.237222,39.712222&sensor=true";
                ConnectivityManager connMgr = (ConnectivityManager)
                        getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isConnected()) {
                    AsTask_Get ag=new AsTask_Get();
                    ag.execute(stringUrl);
                } else {
                    Toast.makeText(MainActivity.this, "НЕТ СЕТИ ИЛИ ХЗ КРЧ", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }


    public class AsTask_Get extends AsyncTask<String, Void, String> {
    String messsage="[пустая строка]";
        @Override
        protected String doInBackground(String... params) {
            StringBuilder contentAsString = new StringBuilder();

            InputStream is = null;
            // Only display the first 500 characters of the retrieved
            // web page content.
            BufferedReader reader = null;

            try {
                URL url = new URL(params[0]);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000);
                conn.setConnectTimeout(15000 );
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                // Starts the query
                conn.connect();
                //int response = conn.getResponseCode();
                is = conn.getInputStream();

                // Convert the InputStream into a string
                reader = new BufferedReader(new InputStreamReader(is));

                String line;

                while ((line = reader.readLine()) != null) {
                    contentAsString.append(line);
                }

            }
            catch (MalformedURLException e)
            {
                messsage= "ОШИБКА 111";
            }
            catch(IOException e)
            {
                messsage="ОШИБКА 222";
            }
            finally {
                try {
                    if (is != null) {
                        is.close();
                    }
                    if (reader != null) {
                        reader.close();
                    }
                }
                catch(IOException e)
                {
                    messsage="ОШИБКА 333";
                }
            }
            return contentAsString.toString();
        }

        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if(result!=null)
                tv.setText(result);
            else
                tv.setText(messsage);
        }
    }



}


Genka_Volkov
Сообщения: 8
Зарегистрирован: 27 апр 2015, 13:20

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

Сообщение Genka_Volkov » 13 май 2015, 11:20

Здравствуйте еще раз! у меня следующая проблема. Все пытаюсь передать координаты на сервер.

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

public void send()
    {
     HttpClient httpclient = new DefaultHttpClient();
     HttpPost httppost = new HttpPost("http://location.aiq.ru/index2.php");

      try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("???", "???"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

          httpclient.execute(httppost);


    }
catch (ClientProtocolException ignored) {

}catch (IOException ignored) {
      }
У меня следующие вопросы.
1. Подскажите пожалуйста, какие строки я должен передать, вместо "???" ?
2. отправятся ли данные вообще?
3. нужно ли на сервере в php прописывать код обработки?

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

Ssnake707
Сообщения: 1
Зарегистрирован: 06 авг 2015, 15:53

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

Сообщение Ssnake707 » 06 авг 2015, 15:58

Подскажите почему программа не запускается?
есть код

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

 public void onResume() {
        super.onResume();
        // работа с сенсором
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_LIGHT), sm.SENSOR_DELAY_UI);
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_PRESSURE), sm.SENSOR_DELAY_UI);

        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,100*10,10,ll);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000*10, 10,ll);
        checkEnabled();
    }
если убрать
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,100*10,10,ll);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000*10, 10,ll);
то программа запускается.
Листинг ll

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

 LocationListener ll = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            showLocation(location);
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
            if (s.equals(LocationManager.GPS_PROVIDER)){
                stat.setText(String.valueOf(i));
            }else if (s.equals(LocationManager.NETWORK_PROVIDER)){
                stat2.setText(String.valueOf(i));
            }
        }

        @Override
        public void onProviderEnabled(String s) {
            showLocation(lm.getLastKnownLocation(s));
        }

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

mercuriy94
Сообщения: 16
Зарегистрирован: 02 апр 2013, 22:44

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

Сообщение mercuriy94 » 02 сен 2015, 20:17

Здравствуйте) хотелось бы поинтересоваться, после того как получил координаты, каким образом я могу получить свой точный адрес ? нашёл в хелпе http://developer.android.com/intl/ru/tr ... dress.html . но увы с английским траблы, может кто занимался данным вопросом и чем может поможет)

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

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

Сообщение Mikhail_dev » 03 сен 2015, 00:03

Есть такая вещь как геокодеры, которые преобразуют координаты в адрес и наоборот (прямой и обратный геокодинг). Вообще эта штука у гугла вроде как под лицензией идёт, и там стоят ограничения в коммерческой разработке, точнее на количество запросов в сутки (25 тысяч вроде).
Но то другой геокодер, а по той ссылке что вы дали, там есть такой
http://developer.android.com/intl/ru/re ... coder.html
Я его не пробовал. Поищите примеры по его использованию.

И вообще можете погуглить что за чудо такие геокодеры и как с ними в андроиде работать. Знаю еще один геокодер: Nominatim

danek130995
Сообщения: 42
Зарегистрирован: 25 янв 2015, 18:57

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

Сообщение danek130995 » 16 ноя 2015, 20:03

1)В методе onSensorChanged приложения Acceleration мы "вычислительным фильтром" получаем из датчика ускорения чистую гравитацию и чистое ускорение:

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

  valuesAccelGravity[i] = (float) (0.1 * event.values[i] + 0.9 * valuesAccelGravity[i]);
                        valuesAccelMotion[i] = event.values[i]
                                - valuesAccelGravity[i];
Как получаем чистое ускорение - это понятно-просто вычитаем гравитацию. А вот почему именно таким способом получаем гравитацию-не пойму. Почему на 0.1 умножаем, почему на 0.9 умножаем valuesAccelGravity, ведь мы именно ему присваиваем значение, у нас вроде нет еще значения на предыдущем шаге?
2) У меня в третьем приложении (Orientation) почему то данные совпадают для Orientation и Orientation2(с учетом поворота экрана и без). Не знаете, почему?
3)Непонятно, как работает определение угла по оси Y. По оси X-понятно, отклонение от горизонтального положения(экраном вверх). Ось Z-тоже понятно, отклонение от севера. А вот ось Y-когда я вращаю экраном вправо-влево(как будто перелистываю страницу)-значения меняются, но если устройство расположить в вертикальном положении и начать крутится по кругу, то они приобретают странный смысл-меняются, а потом иногда возвращаются обратно.
4)Почему мы в getActualDeviceOrientation() в

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

 case (Surface.ROTATION_180):
                y_axis = SensorManager.AXIS_MINUS_Y;
меняем только ось Y на отрицательную при повороте устройства вверх ногами? Ось X то тоже меняться должна! У нее тоже изменится направление на противоположное!
Прошу ответить тех, кто знает. Спасибо заранее!

tran trung
Сообщения: 2
Зарегистрирован: 06 ноя 2015, 22:06

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

Сообщение tran trung » 26 ноя 2015, 06:59

Помогите пожалуйста Mikhail_dev. Например: через 10с мы получим ноыве координаты. Через 1минуту, получим 6 новых координат. Вопрос: Как сохраниьт 6 новых координат (и больше значении) в файле и потом можно работать в Word? Спасибо большое!


tran trung
Сообщения: 2
Зарегистрирован: 06 ноя 2015, 22:06

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

Сообщение tran trung » 27 ноя 2015, 04:08

Спасибо уважаемему Mikhail_dev, а как полученные координаты автоматически сохраняют в базу SQLite не надо никакой кпопки нажать? (на уроке 34 должен нажать кпопку Add чтобы сохранить и кпопку Read чтобы читать). Я хочу корпировать такие заначения из файла базы SQLite (data/data/ru.startandroid.develop.../databases/myDB), вставить в Word и в нем работаю. Зарание спасибо!

kunstkamera
Сообщения: 5
Зарегистрирован: 17 июл 2015, 14:17

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

Сообщение kunstkamera » 17 янв 2016, 16:21

Здравствуйте!
Я пишу приложение с сервисом, в котором (в сервисе) определяются текущее местоположение с помощью locationListener.

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

Criteria c = new Criteria();
            c.setAccuracy(Criteria.ACCURACY_FINE);

            final String PROVIDER = locationManager.getBestProvider(c, true);
            locationManager.requestLocationUpdates(PROVIDER, 60*1000, 0, locationListener);
Появилась проблема.
Код с locationListener-ом в активити или в фрагменте замечательно определяет координаты, принимает location и т.д. Но этот-же код в службе может не принимать координаты часами, потом, принять 60 новых location за 60 секунд и снова заснуть на 10 минут.
Сервис объявил как Foreground, добавил

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

PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);

        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep");
Жду советов\ исправлений.

Батька Андройд
Сообщения: 8
Зарегистрирован: 20 авг 2015, 10:17

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

Сообщение Батька Андройд » 04 фев 2016, 09:58

Здравствуйте. Один маленький вопрос, код полностью абсолютно такой же как в уроке, но у меня network_provider включается только тогда, когда включишь и gps на телефоне. Если GPS выключен, то network ни в какую не работает, ни с обычным инетом, ни с wi-fi. В коде разобрался, не пойму почему.

garic
Сообщения: 1
Зарегистрирован: 27 дек 2016, 12:40

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

Сообщение garic » 27 дек 2016, 12:46

Добрый день.
Полностью повторил урок. GPS работает нормально, данные приходят и обновляются. Но по сети данных нет, пробовал и через wifi и через мобильный интернет, их нет. Может быть сейчас появились другие способы получения координат через сеть? Тестирую на устройстве с 6 андроидом.

SiberianHusky
Сообщения: 1
Зарегистрирован: 29 июл 2017, 12:28

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

Сообщение SiberianHusky » 29 июл 2017, 13:35

Здравствуйте! Я новичок в Android, пытаюсь писать приложение для бега и рассчета дистанции,
столкнулся с тем, что скачут gps координаты, дистанцию пробовал считать с помощью distanceTo по точкам, получается сидишь на месте, локация меняется и дистанция соответственно.
Mikhail_dev писал(а): Варианты решения проблемы с неправильными точками GPS:
1. Самый простой: 4 спутника и более (причем данные брать с протокола NMEA), при этом "Индикатор качества GPS сигнала" должен быть>0, при этом качество GPS координат лучше 250
Попробовал по советам в StackOverflow использовать анонимный класс OnNmeaMessageListener(), чтобы получить хотя бы
строку $GPGGA, а потом уже разбираться с ней, android studio предлагает его обернуть в if
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N),

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

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            locationManager.addNmeaListener(new OnNmeaMessageListener() {
                @Override
                public void onNmeaMessage(String message, long timestamp) {

                    String lowerNmea = message.toLowerCase(Locale.ENGLISH);
                    if(message.startsWith("$GPGGA"))
                    {
                        if(lowerNmea.indexOf(",e,")>0 || lowerNmea.indexOf(",w,")>0)

                            // тут textView не для этого предназначалось, поэтому название не соответствует, пока
                           // пытаюсь вывести строку
                            // и посмотреть как эта строка выглядит
                            tvTemp.setText(message.trim());
                    }
                    else
                    {
                        tvTemp.setText("not");
                    }
                }
            });
        }

        else
        {
            Toast.makeText(this, "app version isn't high", Toast.LENGTH_SHORT).show();
        }

также я обработал else и выходит, что на моем устройстве (тестирую на своем телефоне android 5.1) не поддерживается
получение nmea данных или нужен другой слушатель, чтобы получить эту строку, распарсить ее, получить количество спутников и индикатор качества gps сигнала?

провайдер- gps, разрешение в манифесте есть

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

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Пожалуйста, помогите!

Ответить