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

Обсуждение уроков
Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 02 янв 2014, 22:57

Digetix писал(а):Если из телефона удалить Сервисы Google Play, то приложение вылетает c NullPointer в onResume и onPause, почему так?
Можно скромный вопрос? О каком приложении речь? А еще лучше было бы если бы вы показали информацию о ошибке, которую вам выдала ваша среда разработки...
Изображение

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 02 янв 2014, 23:45

altwin писал(а):Можно скромный вопрос? О каком приложении речь?
Сделал приложение по уроку. Всё как в уроке

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 02 янв 2014, 23:53

Digetix писал(а):
altwin писал(а):Можно скромный вопрос? О каком приложении речь?
Сделал приложение по уроку. Всё как в уроке
причин может быть много, запустите приложение, когда оно завалится скопируйте то, что есть в окне LogCat и покажите тут. Т.е. eclipse(или любая другая среда) никогда не молчит, информация о ошибке есть там. В противном случае вам нужно обратиться к экстрасенсу ;)

P.S. скорее всего вываливается при попытке обновить данные о локации, работа с которыми без этих сервисов не возможна у вас, а может возможно, но поскольку ранее запускали так - он теперь не может их найти, возможно поможет полное удаление папки .android(не помню как она называется в windows), но в любом случае, перед тем, как что -то делать нужно смотреть логи.
Изображение

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 03 янв 2014, 00:32

altwin писал(а):причин может быть много, запустите приложение, когда оно завалится скопируйте то, что есть в окне LogCat
На эмуляторе не валится. Валится на реальном устройстве.
01-02 23:15:13.349 E/AndroidRuntime(14005): FATAL EXCEPTION: main
01-02 23:15:13.349 E/AndroidRuntime(14005): java.lang.RuntimeException: Unable to resume activity {com.project.test/com.project.test.MainActivity}: java.lang.NullPointerException
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.os.Looper.loop(Looper.java:130)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.main(ActivityThread.java:3687)
01-02 23:15:13.349 E/AndroidRuntime(14005): at java.lang.reflect.Method.invokeNative(Native Method)
01-02 23:15:13.349 E/AndroidRuntime(14005): at java.lang.reflect.Method.invoke(Method.java:507)
01-02 23:15:13.349 E/AndroidRuntime(14005): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
01-02 23:15:13.349 E/AndroidRuntime(14005): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
01-02 23:15:13.349 E/AndroidRuntime(14005): at dalvik.system.NativeStart.main(Native Method)
01-02 23:15:13.349 E/AndroidRuntime(14005): Caused by: java.lang.NullPointerException
01-02 23:15:13.349 E/AndroidRuntime(14005): at com.project.test.MainActivity.onResume(MainActivity.java:110)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.Activity.performResume(Activity.java:3832)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2114)
01-02 23:15:13.349 E/AndroidRuntime(14005): ... 12 more

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 03 янв 2014, 01:04

Digetix писал(а):
altwin писал(а):причин может быть много, запустите приложение, когда оно завалится скопируйте то, что есть в окне LogCat
На эмуляторе не валится. Валится на реальном устройстве.
01-02 23:15:13.349 E/AndroidRuntime(14005): FATAL EXCEPTION: main
01-02 23:15:13.349 E/AndroidRuntime(14005): java.lang.RuntimeException: Unable to resume activity {com.project.test/com.project.test.MainActivity}: java.lang.NullPointerException
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.os.Looper.loop(Looper.java:130)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.main(ActivityThread.java:3687)
01-02 23:15:13.349 E/AndroidRuntime(14005): at java.lang.reflect.Method.invokeNative(Native Method)
01-02 23:15:13.349 E/AndroidRuntime(14005): at java.lang.reflect.Method.invoke(Method.java:507)
01-02 23:15:13.349 E/AndroidRuntime(14005): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
01-02 23:15:13.349 E/AndroidRuntime(14005): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
01-02 23:15:13.349 E/AndroidRuntime(14005): at dalvik.system.NativeStart.main(Native Method)
01-02 23:15:13.349 E/AndroidRuntime(14005): Caused by: java.lang.NullPointerException
01-02 23:15:13.349 E/AndroidRuntime(14005): at com.project.test.MainActivity.onResume(MainActivity.java:110)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.Activity.performResume(Activity.java:3832)
01-02 23:15:13.349 E/AndroidRuntime(14005): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2114)
01-02 23:15:13.349 E/AndroidRuntime(14005): ... 12 more
покажите код, который у вас находится в 110 строке класса MainActivity(для наверняка можно и ту, которая перед ней.) В редакторе эклипса ctr+L чтобы переместиться к нужной линии.
Изображение

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 03 янв 2014, 13:56

altwin писал(а):покажите код, который у вас находится в 110 строке класса MainActivity(для наверняка можно и ту, которая перед ней.)

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

    
    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); // это 110 строка
    
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 10, 10, locationListener);
    
      checkEnabled();
  }

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


Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 03 янв 2014, 16:53

Digetix писал(а):
altwin писал(а):покажите код, который у вас находится в 110 строке класса MainActivity(для наверняка можно и ту, которая перед ней.)

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

    
    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); // это 110 строка
    
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000 * 10, 10, locationListener);
    
      checkEnabled();
  }

  @Override
     protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(locationListener);
  }
предыдущий ответ правильный - просто добавьте проверку, т.е. if( locationManager){ do your code } else{ создайте объект locationManager и далее ваш код }.

P.S. хотя если честно я бы попробовал сделать так:
[syntax=java]
LocationManager mgr =
(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
[/syntax]
вместо locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

P.S. теоретически, вы создали объект в onCreate, и не использовали до вызова onResume, возможно к тому времени он уже был удален.
Изображение

Аватара пользователя
LesliStr
Сообщения: 105
Зарегистрирован: 31 окт 2013, 09:31
Откуда: Минск

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

Сообщение LesliStr » 07 янв 2014, 00:43

Возникла проблемка. Помогите, если можно. Получаю координаты, формирую стринг.
...............
String ltln = String.format("%1$.5f", location.getLatitude(), location.getLongitude());
...............
Теперь мне надо послать широковещательный запрос
...............
intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse("geo:"+ltln));
startActivity(intent);
................
И вот тут грабли. Дело в том, что в зависимости от локали, при выводе чисел с плавающей точкой, в качестве разделителя может выводиться как точка так и запятая.
53.89551,27.58708
53,89551,27,58708
У вас на скриншоте выводится точка (и тогда всё нормально, запрос пройдёт), у меня запятая и естественно координаты будут инвалидными, карта откроется но местоположение не покажет. Как обойти эту проблемму и в стринге, вне зависимости от локали, гарантированно получать точку ?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 07 янв 2014, 12:09

метод replaceAll(), может получать регулярное выражение и соответственно заменить символ.
Изображение

Аватара пользователя
LesliStr
Сообщения: 105
Зарегистрирован: 31 окт 2013, 09:31
Откуда: Минск

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

Сообщение LesliStr » 07 янв 2014, 12:13

Первое, что приходит в голову это принимать широту и долготу по отдельности
...........
String lt = String.format("%1$.5f", location.getLatitude());
String ln = String.format("%2$.5f", location.getLongitude());
...........
Затем проверяем на запятую и если она присутствует, меняем на точку
...........
if (lt.contains(",") & ln.contains(",")) {
ltw.setText(lt.replace(",", "."));
lnw.setText(ln.replace(",", "."));
// Здесь надо сделать преобразование в стринг и объединить String ltln
// Как это сделать ?
}
else {
ltln = lt + ln;
};

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 07 янв 2014, 12:25

что то вроде такого
[syntax=java5]
str.replaceAll("/.$/", ",");
[/syntax]

хотя лучше поискать в google regexp правильный.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 07 янв 2014, 12:34

но вообще парить мозг регэкспами не обязательно - поместите строку в массив символов, если есть ',' - замените на '.' или наоборот и потом заберите свою строку назад.
Изображение

Аватара пользователя
LesliStr
Сообщения: 105
Зарегистрирован: 31 окт 2013, 09:31
Откуда: Минск

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

Сообщение LesliStr » 07 янв 2014, 14:08

Ну вроде такой вариант.
.......
if (lt.contains(",") & ln.contains(",")) {
ltw.setText(lt.replace(",", "."));
lnw.setText(ln.replace(",", "."));
ltln=ltw.toString() + lnw.toString();
}
else {
ltln = lt + ln;
};
.......
Сейчас проверяю его.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 07 янв 2014, 14:22

лучше использовать StringBuilder, но в принципе главное сейчас, чтобы работало.
Изображение

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

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

Сообщение Mikhail_dev » 07 янв 2014, 15:08

Ни разу не видел чтобы приходили данные с запятой, работая в разных локациях. А Вы уверены что это не ваши преобразования с форматом или еще чем? Вы пробовали выводить в лог до всяких преобразований?

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 07 янв 2014, 15:11

m090050 писал(а):Ни разу не видел чтобы приходили данные с запятой, работая в разных локациях. А Вы уверены что это не ваши преобразования с форматом или еще чем? Вы пробовали выводить в лог до всяких преобразований?
мне почему то сразу показалось, что это прикол какой -то китайской прошивки :)
Изображение

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

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

Сообщение Digetix » 07 янв 2014, 16:43

m090050 писал(а):locationListener или locationManager не инициализированы.
Вообще-то инициализированы. Я просто привел
altwin писал(а):(для наверняка можно и ту, которая перед ней.)

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

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

Сообщение altwin » 07 янв 2014, 18:19

Digetix писал(а):
m090050 писал(а):locationListener или locationManager не инициализированы.
Вообще-то инициализированы. Я просто привел
altwin писал(а):(для наверняка можно и ту, которая перед ней.)
ответ уже был выше, каков результат после добавления if блока? То, что вы создали объект в onCreate ни о чем не говорит, после перехода приложения в состоянии паузы ваш объект мог как не используемый быть уничтожен сборщиком, потому -нужна проверка и если его нет - создать заново.
Изображение

Аватара пользователя
LesliStr
Сообщения: 105
Зарегистрирован: 31 окт 2013, 09:31
Откуда: Минск

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

Сообщение LesliStr » 07 янв 2014, 19:54

m090050 писал(а):Ни разу не видел чтобы приходили данные с запятой, работая в разных локациях. А Вы уверены что это не ваши преобразования с форматом или еще чем? Вы пробовали выводить в лог до всяких преобразований?
Уверен. Выводил в лог. Данные приходят с запятой. Более того, если верить вики, то можно получить в зависимости от локали вообще хрен знает что "Вывод чисел с плавающей запятой
В зависимости от текущей локали, при выводе чисел с плавающей запятой может использоваться как запятая, так и точка (а, возможно, и другой символ). Поведение printf в отношении разделяющего дробную и целую часть числа символа определяется использующейся локалью (точнее, переменной LC NUMERIC).
[15]"

Ответить