Android-位置情報サービス
AndroidロケーションAPIを使用すると、基盤となるロケーションテクノロジーの詳細に集中することなく、ロケーション認識アプリケーションを簡単に構築できます。
これはの助けを借りて可能になります Google Play services、自動化された位置追跡、ジオフェンシング、およびアクティビティ認識により、アプリに位置認識を追加しやすくなります。
このチュートリアルでは、APPで位置情報サービスを使用して現在地を取得する方法、定期的に位置情報を更新する方法、住所を検索する方法などを示します。
ロケーションオブジェクト
ザ・ Locationオブジェクトは、緯度、経度、タイムスタンプ、および方位、高度、速度などの他の情報で構成される地理的位置を表します。Locationオブジェクトで使用して場所固有の情報を取得できる次の重要なメソッドがあります-
シニア番号 | 方法と説明 |
---|---|
1 | float distanceTo(Location dest) この場所と指定された場所の間のおおよその距離をメートル単位で返します。 |
2 | float getAccuracy() この場所の推定精度をメートル単位で取得します。 |
3 | double getAltitude() 可能な場合は、海抜メートル単位で高度を取得します。 |
4 | float getBearing() 方位を度で取得します。 |
5 | double getLatitude() 緯度を度で取得します。 |
6 | double getLongitude() 経度を度で取得します。 |
7 | float getSpeed() 利用可能な場合は、地上でメートル/秒単位で速度を取得します。 |
8 | boolean hasAccuracy() この場所に精度がある場合はTrue。 |
9 | boolean hasAltitude() この場所に標高がある場合はTrue。 |
10 | boolean hasBearing() この場所に方位がある場合はtrue。 |
11 | boolean hasSpeed() この場所に速度がある場合はTrue。 |
12 | void reset() 場所の内容をクリアします。 |
13 | void setAccuracy(float accuracy) この場所の推定精度をメートルで設定します。 |
14 | void setAltitude(double altitude) 海抜メートルで高度を設定します。 |
15 | void setBearing(float bearing) 方位を度単位で設定します。 |
16 | void setLatitude(double latitude) 緯度を度単位で設定します。 |
17 | void setLongitude(double longitude) 経度を度単位で設定します。 |
18 | void setSpeed(float speed) 地上での速度をメートル/秒で設定します。 |
19 | String toString() このオブジェクトの簡潔で人間が読める説明を含む文字列を返します。 |
現在地を取得する
現在の場所を取得するには、次のような場所クライアントを作成します LocationClient オブジェクト、を使用して位置情報サービスに接続します connect() メソッド、そしてそれを呼び出す getLastLocation()方法。このメソッドは、最新の場所を次の形式で返します。Location上で説明したように、緯度と経度の座標およびその他の情報を含むオブジェクト。アクティビティでロケーションベースの機能を使用するには、2つのインターフェイスを実装する必要があります-
- GooglePlayServicesClient.ConnectionCallbacks
- GooglePlayServicesClient.OnConnectionFailedListener
これらのインターフェイスは、アクティビティクラスに実装する必要がある次の重要なコールバックメソッドを提供します-
シニア番号 | コールバックの方法と説明 |
---|---|
1 | abstract void onConnected(Bundle connectionHint) このコールバックメソッドは、ロケーションサービスがロケーションクライアントに正常に接続されたときに呼び出されます。使用しますconnect() ロケーションクライアントに接続する方法。 |
2 | abstract void onDisconnected() このコールバックメソッドは、クライアントが切断されたときに呼び出されます。使用しますdisconnect() ロケーションクライアントから切断する方法。 |
3 | abstract void onConnectionFailed(ConnectionResult result) このコールバックメソッドは、クライアントをサービスに接続するときにエラーが発生したときに呼び出されます。 |
でロケーションクライアントを作成する必要があります onCreate() アクティビティクラスのメソッドを接続し、 onStart()、これにより、位置情報サービスは、アクティビティが完全に表示されている間、現在の場所を維持します。でクライアントを切断する必要があります onStop()アプリが表示されていないときに位置情報サービスが現在の場所を維持しないようにする方法。これは、バッテリーの電力を大幅に節約するのに役立ちます。
更新された場所を取得する
場所の更新を希望する場合は、上記のインターフェースとは別に、実装する必要があります LocationListenerインターフェースも。このインターフェースは、アクティビティクラスに実装する必要がある次のコールバックメソッドを提供します-
シニア番号 | コールバックの方法と説明 |
---|---|
1 | abstract void onLocationChanged(Location location) このコールバックメソッドは、場所が変更されたときにLocationClientから通知を受信するために使用されます。 |
場所のサービス品質
ザ・ LocationRequest オブジェクトは、からの位置更新のサービス品質(QoS)を要求するために使用されます。 LocationClient。QoSの処理に使用できる便利なセッターメソッドは次のとおりです。Androidの公式ドキュメントで確認できる同等のゲッターメソッドが利用可能です。
シニア番号 | 方法と説明 |
---|---|
1 | setExpirationDuration(long millis) このリクエストの期間をミリ秒単位で設定します。 |
2 | setExpirationTime(long millis) 要求の有効期限を、起動からのミリ秒単位で設定します。 |
3 | setFastestInterval(long millis) ロケーション更新の最速間隔をミリ秒単位で明示的に設定します。 |
4 | setInterval(long millis) アクティブな場所の更新に必要な間隔をミリ秒単位で設定します。 |
5 | setNumUpdates(int numUpdates) 位置情報の更新回数を設定します。 |
6 | setPriority(int priority) リクエストの優先度を設定します。 |
たとえば、アプリケーションで高精度の位置情報が必要な場合は、次のコマンドで位置情報リクエストを作成する必要があります。 setPriority(int) PRIORITY_HIGH_ACCURACYに設定し、 setInterval(long)5秒まで。また、より大きな間隔やPRIORITY_LOW_POWERなどの他の優先度を使用して「都市」レベルの精度を要求したり、PRIORITY_BALANCED_POWER_ACCURACYを使用して「ブロック」レベルの精度を要求したりすることもできます。
アクティビティでは、バックグラウンドに入るときに(たとえば、onPause()で)すべてのロケーション要求を削除することを強く検討するか、少なくとも要求をより大きな間隔とより低い品質に交換して、電力消費を節約する必要があります。
住所の表示
あなたが持ったら Location オブジェクト、あなたは使用することができます Geocoder.getFromLocation()指定された緯度と経度の住所を取得するメソッド。このメソッドは同期的であり、作業に時間がかかる可能性があるため、からメソッドを呼び出す必要があります。doInBackground() の方法 AsyncTask クラス。
ザ・ AsyncTask 使用するにはサブクラス化する必要があり、サブクラスはオーバーライドされます doInBackground(Params...) バックグラウンドでタスクを実行する方法と onPostExecute(Result)メソッドは、バックグラウンド計算が終了した後、結果を表示するときにUIスレッドで呼び出されます。AyncTaskで利用できるもう1つの重要なメソッドがあります。execute(Params... params)、このメソッドは、指定されたパラメーターを使用してタスクを実行します。
例
次の例は、アプリで位置情報サービスを使用して現在の場所とそれに相当する住所などを取得する実際的な方法を示しています。
この例を試すには、最新のAndroid OSを搭載した実際のモバイルデバイスが必要です。そうでない場合は、エミュレーターで苦労する必要があり、動作しない可能性があります。
Androidアプリケーションを作成する
ステップ | 説明 |
---|---|
1 | Android Studio IDEを使用してAndroidアプリケーションを作成し、com.example.tutorialspoint7.myapplicationパッケージの下にTutorialspointという名前を付けます。 |
2 | 追加のsrc / GPSTracker.javaのファイルを、必要なコードを追加します。 |
3 | src / MainActivity.javaファイルを変更し、以下に示すように必要なコードを追加して、現在の場所とそれに相当するアドレスを取得します。 |
4 | レイアウトXMLファイルres / layout / activity_main.xmlを変更して、場所/住所を表示する3つのボタンと2つのテキストビューを含むすべてのGUIコンポーネントを追加します。 |
5 | res / values / strings.xmlを変更して、必要な定数値を定義します |
6 | 以下に示すようにAndroidManifest.xmlを変更します |
7 | アプリケーションを実行してAndroidエミュレーターを起動し、アプリケーションで行われた変更の結果を確認します。 |
変更されたメインアクティビティファイルの内容は次のとおりです MainActivity.java。
package com.example.tutorialspoint7.myapplication;
import android.Manifest;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.test.mock.MockPackageManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
Button btnShowLocation;
private static final int REQUEST_CODE_PERMISSION = 2;
String mPermission = Manifest.permission.ACCESS_FINE_LOCATION;
// GPSTracker class
GPSTracker gps;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
if (ActivityCompat.checkSelfPermission(this, mPermission)
!= MockPackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{mPermission},
REQUEST_CODE_PERMISSION);
// If any permission above not allowed by user, this condition will
execute every time, else your else part will work
}
} catch (Exception e) {
e.printStackTrace();
}
btnShowLocation = (Button) findViewById(R.id.button);
// show location button click event
btnShowLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// create class object
gps = new GPSTracker(MainActivity.this);
// check if GPS enabled
if(gps.canGetLocation()){
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
// \n is for new line
Toast.makeText(getApplicationContext(), "Your Location is - \nLat: "
+ latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();
}else{
// can't get location
// GPS or Network is not enabled
// Ask user to enable GPS/network in settings
gps.showSettingsAlert();
}
}
});
}
}
変更されたメインアクティビティファイルの内容は次のとおりです GPSTracker.java。
package com.example.tutorialspoint7.myapplication;
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;
public class GPSTracker extends Service implements LocationListener {
private final Context mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker(Context context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
* */
public void stopUsingGPS(){
if(locationManager != null){
locationManager.removeUpdates(GPSTracker.this);
}
}
/**
* Function to get latitude
* */
public double getLatitude(){
if(location != null){
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
/**
* Function to get longitude
* */
public double getLongitude(){
if(location != null){
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
/**
* Function to check GPS/wifi enabled
* @return boolean
* */
public boolean canGetLocation() {
return this.canGetLocation;
}
/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
* */
public void showSettingsAlert(){
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
以下の内容になります res/layout/activity_main.xml ファイル-
<?xml version = "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:orientation = "vertical" >
<Button
android:id = "@+id/button"
android:layout_width = "fill_parent"
android:layout_height = "wrap_content"
android:text = "getlocation"/>
</LinearLayout>
以下の内容になります res/values/strings.xml 2つの新しい定数を定義する-
<?xml version = "1.0" encoding = "utf-8"?>
<resources>
<string name = "app_name">Tutorialspoint</string>
</resources>
以下はのデフォルトコンテンツです AndroidManifest.xml −
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.tutorialspoint7.myapplication">
<uses-permission android:name = "android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name = "android.permission.INTERNET" />
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
あなたを実行してみましょう Tutorialspoint応用。実際のAndroidモバイルデバイスをコンピューターに接続したと思います。Android Studioからアプリを実行するには、プロジェクトのアクティビティファイルの1つを開き
ここで場所を確認するには、次のように場所情報を表示する[場所を取得]ボタンを選択します-