در این مقاله نحوه استفاده از خدمات مکان در اندروید را آموزش خواهیم داد.
رابط مکان اندروید به شما امکان ایجاد نرم افزار هایی بر پایه مکان را میدهد، بدون این ابزار هم میتوان این کار را انجام داد ولی این ابزار شما را از جزئیات مربوط به تکنولوژی مکان یابی بی نیاز میکند.
این امکان با کمک سرویس Google play services محیا شده است. که امکان آگاهی از مکان location awareness را با کمک آن میتوان به نرم افزار افزود. با کمک این ابزار نرم افزار شما بطور اتوماتیک امکانات : ردگیری مکان ،مرزهای جغرافیایی geofencing ، تشخیص فعالیت ها را فعال می کند.
در این آموزش به شما یاد خواهیم داد که چگونه از سرویس مکان در نرم افزار خود استفاده کنید. تا با کمک این سرویس، مکان را مشخص کنید، مکان های مختلف را بروز رسانی کنید ، آدرسی را بیابید و غیره .
شیئ 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():
اطلاعات مکان را بصورت خلاصه و قابل درک برای انسان بازگردانی می کند.
|
دریافت مکان فعلی:
برای داشتن موقعیت فعلی ، یک location client که یک شیئ LocationClient است ایجاد کنید. به سرویس مکان متصل شوید، برای اینکار از متد connect() استفاده کنید. حالا باید متد getLastLocation() را فراخوانی کنید. این متد آخرین مکان ها را در فرم شیئ Locationبازگردانی می کند. این مکان ها داری طول و عرض جغرافیایی و سایر مشخصاتی هستند که در بالا توضیح داده شد. برای داشتن عمگرهایی بر اساس موقعیت مکانی در اکتویتی ، شما باید دو رابط زیر را بکار بگیرید.
GooglePlayServicesClient.ConnectionCallbacks
GooglePlayServicesClient.OnConnectionFailedListener
این رابط ها دارای متد های فراخوانی زیر هستن که باید در کلاس اکتیویتی بکار گرفته شوند.
شماره
|
متد فراخوانی و توضیح
|
1
|
abstract void onConnected(Bundle connectionHint)
این متد فراخوانی وقتی که سرویس location به مکان مشتری با موفقیت متصل شود فراخوانی می شود. شما از متد connect() برای اتصال به مکان مشتری استفاده خواهید کرد.
|
2
|
abstract void onDisconnected()
این متد Callback هنگامی فراخوانی میشود که مشتری به اینترنت متصل نیست . شما از متد disconnect() برای قطع ارتباط از مکان مشتری میتوانید استفاده کنید.
|
3
|
abstract void onConnectionFailed(ConnectionResult result)
این متد هنگامیکه در اتصال یک مشکل وجود داشته باشد فراخوانی میشود.
|
در چرخه حیات سرویس شما مکان را در متد onCreate() در کلاس اکتیویتی ایجاد میکنید، حالا به این مکان از طریق متد onStart() متصل میشوید، در گام بعد با Location Services مکان فعلی را دریافت می کنید.برای خروج از سرویس شما باید از متدonStop() برای قطع اتصال خود استفاده کنید. اگر نرم افزار در حالت فعال نباشد اتصال با موقعیت مکانی قطع شده و از مصرف بی رویه باطری جلوگیری میشود.
دریافت موقعیت مکانی بروز شده
اگر شما بخواهید که موقعیت مکانی بروز شده خود را داشته باشید، شما باید LocationListener را بکار ببرید این رابط دارای متد های فراخوانی زیر است که شما باید در کلاس اکتیویتی خود بکار ببرید.
شماره
|
متد فراخوانی و توضیحات
|
1
|
abstract void onLocationChanged(Location location)
این متد فراخوانی برای دریافت موقعیت مکانی دستگاه در هنگامی است که موقعیت مکانی او درحال تغییر است.
|
کیفیت سرویس موقعیت یاب
شیئ LocationRequest برای درخواست یک کیفیت سرویس QoS برای بروزرسانی موقعیت مکانی LocationClient بکار میرود. متدهای تنظیم کننده مفیدی برای سرویس QoS وجود دارد.
متدهای متعادل کننده Getter را نمیتوان در این مقاله توضیح داده برای توضیحات آن به مقالات اندروید مراجعه کنید:
شماره
|
متد و توضیحات
|
1
|
setExpirationDuration(long millis)
زمان درخواست ، برحسب میلی ثانیه را مشخص می کند.
|
2
|
setExpirationTime(long millis)
زمان انقضاء درخواست را برحسب میلی ثانیه از زمان بارگزاری باز میگرداند.
|
3
|
setFastestInterval(long millis)
سریع ترین فاصله زمانی برای بروزرسانی موقعیت مکانی را بر حسب میلی ثانیه بیان می کند.
|
4
|
setInterval(long millis)
فاصله زمانی دلخواه برای بروز رسانی موقعیت مکانی را برحسب میلی ثانیه تنظیم می کند.
|
5
|
setNumUpdates(int numUpdates)
تعداد بروز رسانی های موقعیت مکانی را تنظیم می کند.
|
6
|
setPriority(int priority)
اولویت درخواست را تنظیم می کند.
|
حالا برای مثال، اگر نرم افزار شما یک high accuracy location بخواهد اینکار را باید، با یک درخواست مکان به وسیله setPriority(int) انجام دهد تا PRIORITY_HIGH_ACCURACY تنظیم و setInterval(long) روی 5 ثانیه تنظیم شود. شما میتوانید یک مقیاس بزرگتر و یا سایر ویژگی ها مانند PRIORITY_LOW_POWER را برای درخواست city بعنوان سطح دقت و یا PRIORITY_BALANCED_POWER_ACCURACY برای درخواست block بعنوان سطح دقت استفاده کنید.
اکتیویتی باید با قدرت تمام بتواند تمام درخواست های موقعیت را در هنگامی که نرم افزار به پس زمینه میرود را حذف کند و یا سرویس را به حالت onPause() ببرد. اینکار میتواند بصورت افزایش زمان محاسبه تغییرات مکانی و کم کردن کیفیت نیز انجام شود تا باتری سیستم بیهوده هدر نشود.
نمایش آدرس یک مکان
بعد از اینکه یک شئی Location ایجاد کردید ، میتوانید از متد Geocoder.getFromLocation() برای دریافت یک آدرس از طول و عرض جغرافیایی استفاده کنید. این متد نیاز به همگام شدن دارد و ممکن است اجرای آن زمانبر باشد. شما باید این متد را از طریق متد doInBackground() در کلاس AsyncTask انجام دهید.
کلاس AsyncTask باید بصورت یک subclassed باشد و این زیر کلاس باید بتواند متد doInBackground(Params...) را ویرایش کند. تا با اینکار متد در پس زمینه اجرا شود. در متد onPostExecute(Result) زمان اجرا در پس زمینه به پایان رسیده و مکان به کاربر نمایش داده میشود. متد دیگر در کلاس AyncTask عبارت است از متد execute(Params... params) این متد دستور را با پارامتری خواص اجرا می کند.
مثال:
مثال زیر به مان نشان میدهد که چگونه از سرویس مکان استفاده کنیم و در نرم افزار خود مکان فعلی ، آدرس و غیره را دریافت کنیم.
برای انجام این پروژه لازم است که یک موبایل با آخرین نسخه اندروید داشته باشید، چرا که این دستورات روی شبیه ساز کار نمی کند.
ایجاد نرم افزار اندرویدی:
گام
|
توضیح
|
1
|
با نرم افزار اندورید استودیو یک نرم افزار به نام Sargonco در پوشه com.example.tutorialspoint7.myapplication ایجاد کنید.
|
2
|
فایل src/GPSTracker.java را ایجاد و کد های مورد نیاز را اضافه کنید.
|
3
|
فایل src/MainActivity.java را ویرایش کرده و کدهای لازم را اضافه کنید. بعد از جدول ما توضیحات کامل این فایل را خواهیم داد شما باید در این فایل مکان فعلی را بیابید
|
4
|
فایل Xml res/layout/activity_main.xml که مربوط به Layout است را تغییر دهید. همه کامپونت های GUI را اضافه کنید. سه دکمه و دو کادر متن برای نمایش آدرس یا مکان اضافه کنید.
|
5
|
فایل res/values/strings.xml را ویرایش کنید.
|
6
|
ویرایش AndroidManifest.xml بر طبق کد های زیر ویرایش کنید.
|
7
|
نرم افزار را اجرا کنید اگر مشکلی خاصی نباشد شبیه ساز نرم افزار را نصب و اجرا خواهد کرد.
|
کد های زیر کد های فایل 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 برای تعریف دو ثابت جدید میباشد:
<?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>
برای اجرای این نرم افزار بهتر است از یک موبایل استفاده کنید. روی کلید RUN در نرم افزار کلیک کرده و پنجره زیر برای شما باز میشود. که میتوانید محل اجرای پروژه را مشخص کنید.
حالا برای دیدن مکان روی دکمه Get Location Button کلیک کنید اطلاعات بصورت زیر برای شما نمایش داده میشود.
براي بهره مندي از مشاوره تخصصي در زمینه برنامه نویسی اندروید در کرج با شرکت سارگون تماس بگيريد