Статьи

Приложение для определения местоположения Android — GPS местоположение

Благодаря внедрению GPS-устройств в смартфоны, Location Based Services (LBS) стали довольно популярными в последние несколько лет. IPhone был первым, кто оказал огромное влияние на подобные приложения, и теперь Android продолжает идти по тому же пути. В этом уроке я покажу вам, как создать ваше первое приложение LBS для Android. Первым шагом является получение текущего местоположения пользователя, а затем использование его координат для предоставления данных для этого местоположения. Как правило, определение местоположения пользователя на карте возможно одним из следующих способов:

  1. Использование устройства GPS, которое поставляется с мобильным
  2. Используя идентификатор ячейки, которой в данный момент обслуживается пользователь

Первый намного проще и точнее (так как второй дает только приближение). Поскольку в наши дни на большом количестве телефонов есть GPS-устройства, мы будем использовать первый способ. Эмулятор Android SDK может эмулировать изменения местоположения пользователя и предоставлять фиктивные данные для его координат.

Давайте начнем с создания нового Android-проекта в Eclipse. Я дал ему причудливое имя «AndroidLbsGeocodingProject» и использовал свойства, как показано на следующем рисунке:

Обратите внимание, что я использовал версию платформы Android 1.5 и «3» в качестве минимальной версии SDK. Приложение не будет использовать какой-либо из новых супер-API, поэтому я решил использовать одну из первых версий для обратной совместимости. Как правило, рекомендуется поддерживать как можно больше версий. Вы можете найти информацию о версиях платформы и их соответствующей доле рынка здесь .

Для начала мы добавим только кнопку, которая будет вызывать получение координат текущего местоположения от поставщика местоположения. Таким образом, файл «main.xml» для интерфейса приложения будет таким простым:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
 android:id="@+id/retrieve_location_button"
 android:text="Retrieve Location"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 />
</LinearLayout>

Чтобы начать работу с возможностями определения местоположения в API-интерфейсе Android, первым делом необходимо обратиться к классу LocationManager , который предоставляет доступ к системным службам определения местоположения. Это делается с помощью getSystemService нашей деятельности (фактически она наследует его от родительского класса Context ). Затем мы запрашиваем обновления местоположения устройства с помощью метода requestLocationUpdates . В этом методе мы предоставляем имя предпочтительного поставщика местоположения (в нашем случае GPS), минимальный интервал времени для уведомлений (в миллисекундах), минимальный интервал расстояния для уведомлений (в метрах) и, наконец, класс, реализующий интерфейс LocationListener . Этот интерфейс объявляет методы для обработки изменений в местоположении пользователя, а также изменений в статусе поставщика местоположения. Все вышеперечисленное можно перевести в код, как показано ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.javacodegeeks.android.lbs;
 
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
public class LbsGeocodingActivity extends Activity {
     
    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds
     
    protected LocationManager locationManager;
     
    protected Button retrieveLocationButton;
     
    @Override
    public void onCreate(Bundle savedInstanceState) {
         
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);
         
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
         
        locationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER,
                MINIMUM_TIME_BETWEEN_UPDATES,
                MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
                new MyLocationListener()
        );
         
    retrieveLocationButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                showCurrentLocation();
            }
    });       
         
    }   
 
    protected void showCurrentLocation() {
 
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
 
        if (location != null) {
            String message = String.format(
                    "Current Location \n Longitude: %1$s \n Latitude: %2$s",
                    location.getLongitude(), location.getLatitude()
            );
            Toast.makeText(LbsGeocodingActivity.this, message,
                    Toast.LENGTH_LONG).show();
        }
 
    }  
 
    private class MyLocationListener implements LocationListener {
 
        public void onLocationChanged(Location location) {
            String message = String.format(
                    "New Location \n Longitude: %1$s \n Latitude: %2$s",
                    location.getLongitude(), location.getLatitude()
            );
            Toast.makeText(LbsGeocodingActivity.this, message, Toast.LENGTH_LONG).show();
        }
 
        public void onStatusChanged(String s, int i, Bundle b) {
            Toast.makeText(LbsGeocodingActivity.this, "Provider status changed",
                    Toast.LENGTH_LONG).show();
        }
 
        public void onProviderDisabled(String s) {
            Toast.makeText(LbsGeocodingActivity.this,
                    "Provider disabled by the user. GPS turned off",
                    Toast.LENGTH_LONG).show();
        }
 
        public void onProviderEnabled(String s) {
            Toast.makeText(LbsGeocodingActivity.this,
                    "Provider enabled by the user. GPS turned on",
                    Toast.LENGTH_LONG).show();
        }
 
    }
     
}

Для интерфейса LocationListener мы реализовали внутренний класс MyLocationListener. Методы в этом классе просто используют Toast для предоставления информации о состоянии GPS или любых изменениях местоположения. Единственный элемент интерфейса — это кнопка, которая подключается к OnClickListener, и при нажатии на нее вызывается метод showCurrentLocation. Затем выполняется getLastKnownLocation экземпляра LocationManager, возвращая последнее известное расположение . Из объекта Location мы можем получить информацию о высоте , широте , долготе , скорости и т. Д. Пользователя. Для того, чтобы запустить приведенный выше код, необходимо предоставить необходимые разрешения. Эти:

Включите их в файл AndroidManifest.xml, который будет выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
 
      package="com.javacodegeeks.android.lbs"
      android:versionCode="1"
      android:versionName="1.0">
       
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".LbsGeocodingActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
    </application>
     
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     
    <uses-sdk android:minSdkVersion="3" />
 
</manifest>

Затем используйте AVD Manager для создания нового устройства Android и убедитесь, что поддержка GPS включена в функции:

Затем используйте «Выполнить -> Запустить конфигурации…», чтобы создать новую конфигурацию для проекта:

Если вы нажмете Run, эмулятор запустится, но на самом деле ничего не произойдет при нажатии кнопки. Это связано с тем, что при запуске эмулятора последнее известное местоположение не извлекается (возвращаемый экземпляр Location равен нулю).

Мы должны кормить эмулятор некоторыми фиктивными данными. Перейдите в DDMS- представление Eclipse и найдите вкладку «Управление эмуляцией ». Там, помимо прочего, вы найдете раздел «Управление местоположением», который может отправлять данные эмуляции местоположения в эмулятор. На вкладке «Вручную» просто нажмите кнопку «Отправить», там уже установлены некоторые координаты.

Когда данные отправляются на устройство GPS эмулятора, наш слушатель будет запущен, и текущее местоположение будет напечатано на экране в виде уведомления о тосте .

Теперь существует последнее известное местоположение, поэтому, если вы нажмете кнопку «Восстановить местоположение», будет выбрано ненулевое местоположение, и координаты снова будут напечатаны на экране:

Вот и все. Теперь вы можете эмулировать изменения в местоположении пользователя и получать обновления о них. В следующем уроке я покажу вам, как использовать эти координаты для предоставления полезных данных пользователю. Сейчас вы можете найти проект Eclipse здесь .

Удачного кодирования !!!

Статьи по Теме :
Связанные фрагменты: