مشخصات مقاله
-
2397
-
0.0
-
10468
-
0
-
1
مثال برنامه مکان یابی در اندروید
دوره آموزش برنامه نویسی اندروید
کلیه حقوق مادی و معنوی این مقاله متعلق به آموزشگاه تحلیل داده می باشد و هر گونه استفاده غیر قانونی از آن پیگرد قانونی دارد.
مثال برنامه مکان یابی در اندروید
رابط برنامه سازی کاربردی مکان یابی اندروید (Android Location API )
فصل پیش رو کاربرد API location اندروید را برای شما تشریح می کند. بر اساس Eclipse 3.7، java 1.6 و Android 4.0 (ice cream sandwich) نوشته شده است.
فهرست محتوا
1. رابط برنامه سازی کاربردی مکان یابی اندروید (android location API )
کشف موقعیت جغرافیایی جاری
کلاس LocationManager چه کارایی دارد ؟
کلاس LocationProvider چه کاربردی دارد ؟
انتخاب LocationProvider با استفاده از شی Criteria
هشدار مجاورت (proximity alert)
آموزش کلاس Geocoder
امنیت
اعلان به کاربر برای فعال سازی GPS
2. بهره گیری از GPS و تعیین مکان فعلی
فعال سازی GPS بر روی شبیه ساز
تعیین موقعیت جغرافیایی
3. آموزش : استفاده از رابط برنامه سازی کاربردی مکان یابی اندروید
ایجاد پروژه
افزودن مجوزهای لازم
Activity
مرحله ی اجرا و تست
1. رابط برنامه سازی کاربردی مکان یابی اندروید (android location API)
کشف موقعیت جغرافیایی جاری
عمده ی دستگاه های اندروید قابلیت تعیین موقعیت جغرافیایی فعلی را دارند. این امر را می توان از طریق شبکه های wi-fi، ماژول GPS (global positioning system = سامانه ی موقعیت یابی جهانی) و تکنولوژی مثلث بندی برج های مخابراتی (cell tower triangulation) امکان پذیر ساخت.
اندروید حاوی پکیج android.location می باشد که رابط برنامه سازی کاربردی لازم را برای تعیین موقعیت جغرافیایی فعلی فراهم می کند.
کلاس LocationManager چه کارایی دارد؟
کلاس LocationManager دسترسی به سرویس مکان یابی اندروید (Android location service) را فراهم می سازد. سرویس های مذکور امکان دسترسی به مکان یاب ها (location provider)، ثبت گوش فراخوان هایی (listener) ویژه ی بروز رسانی مکان نماها و هشدارهای مجاورت (proximity alert) را فراهم می کند.
کلاس LocationProvider چه کاربردی دارد؟
کلاس LocationProvider در حقیقت همان کلاس ارشد یا superclass کلاس های location provider گوناگون است که اطلاعاتی در رابطه با مکان کنونی شما ارائه می دهند. اطلاعات بدست آمده سپس در کلاس location ذخیره می گردند.
دستگاه اندروید ممکن است LocationProvider های متعددی در دسترس داشته باشد که برنامه نویس بنا به نیاز خود کلاس یا کلاس های مربوطه را انتخاب می کند. در بیشتر موارد LocationProvider های زیر برای برنامه نویس قابل استفاده می باشند.
|
مکان یاب ها |
توصیف |
|
network |
از شبکه ی موبایل یا wi-fi جهت یافتن بهترین موقعیت یا مکان بهره می گیرد. در فضاهای بسته نسبت به gps از دقت بیشتری برخوردار می باشد. |
|
gps |
از گیرنده ی GPS موجود در دستگاه های اندروید به منظور یافتن بهترین موقعیت فیزیکی به وسیله ی ماهواره ها بهره می گیرد. معمولاً در مقایسه با شبکه از دقت بالاتری برخوردار می باشد. |
|
passive |
اجازه می دهد بدون نیاز به مکان یابی، مکان کنونی را از بروز رسانی هایی دیگر مولفه یا کامپوننت ها انجام داده و مکان جدید را دریافت کند که در نتیجه منجر به صرف جویی در مصرف انرژی می گردد. |
انتخاب LocationProvider با استفاده از شی Criteria
برای انتخاب بهترین مکان یاب به صورت انعطاف پذیر می توان از شی Criteria بهره گرفت که به وسیله ی آن می توان تعیین کرد provider مورد نظر چگونه انتخاب شود.
می توانید یک شی LocationListener با کلاس LocationManager ثبت یا رجیستر کنید تا بدین وسیله موقعیت جغرافیایی را به طور متناوب دریافت کنید.
هشدار مجاورت (proximity alert)
همچنین می توان یک Intent ثبت کرد که امکان تعریف proximity alert را فراهم می کند. هشدار مذکور در صورت قرار گیری دستگاه مورد نظر در طول و عرض جغرافیایی و شعاع تعیین شده فعال می شود.
آموزش کلاس Geocoder
کلاس Geocoder امکان کشف موقعیت و مختصات جغرافیایی یک آدرس معین را برای شما فراهم می کند.
از این فرایند به عنوان forward and reverse geocoding نیز یاد می شود. کلاس مزبور برای انجام عملیات لازمه از سرویس آنلاین گوگل بهره می گیرد.
امنیت
اگر می خواهید به حس گر GPS دسترسی پیدا کنید، در آن صورت به مجوز ACCESS_FINE_LOCATION نیاز پیدا می کنید، در غیر این صورت به مجوز ACCESS_COARSE_LOCATION نیاز دارید.
اعلان به کاربر برای فعال سازی GPS
کاربر می تواند تصمیم بگیرد آیا GPS فعال شود یا خیر.
از طریق متد isProviderEnabled() می توان دریافت آیا LocationManager فعال سازی شده یا خیر. چنانچه LocationManager فعال نشده بود، در آن صورت برنامه نویس می تواند به وسیله ی Intent ی با عملیات Settings.ACTION_LOCATION_SOURCE_SETTINGS برای کلاس android.provider.Settings کاربر را به تنظیمات ارجاع دهد.
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean enabled = service
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// check if enabled and if not send user to the GSP settings
// Better solution would be to display a dialog and suggesting to
// go to the settings
if (!enabled) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
به طور معمول برنامه نویس اعلان AlarmDialog را باز می کند تا از این طریق از کاربر بپرسد آیا مایل است GPS را فعال کند یا اینکه برنامه ی مربوطه که به ماژول ذکر شده احتیاج دارد بسته شود.
برنامه نویس این اجازه را ندارد که GPS را در کد فعال کند، بلکه این امکان فقط مختص کاربر می باشد.
2. بهره گیری از GPS و تعیین مکان فعلی
فعال سازی GPS بر روی شبیه ساز
باید ماژول GPS را بر روی دستگاه آزمایشی خود فعال کنید. در صورت انجام تست بر روی شبیه ساز، چنانچه GPS فعال نشده باشد و اگر شما از LocationManager استفاده کنید "NULL" برگردانده می شود.
Activity برنامه ی Google Maps به طور طبیعی خود باید اتوماتیک وار وسیله ی GPS را در شبیه ساز فعال سازی کند، اما چنانچه تمایل دارید location manager را خود به طور مستقیم بکار ببرید، این کار را نیز باید خود انجام دهید. در حال حاضر به نظر می رسد مشکلی در این زمینه ی بخصوص وجود دارد.
برنامه ی Google Maps را روی شبیه ساز راه اندازی کرده و موقعیت جغرافیایی کنونی را درخواست کنید، این کار به شما اجازه می دهد GPS را فعال کنید. حال مختصات جدید GPS را به شبیه ساز اندروید ارسال کنید.
تعیین موقعیت جغرافیایی
شما می توانید "DDMS" Perspective محیط برنامه نویسی Eclipse را جهت ارسال موقعیت جغرافیایی خود به شبیه ساز یا دستگاه متصل مورد استفاده قرار دهید. به منظور باز کردن این Perspective کافی است Window → Open Perspective → Other... → DDMS را انتخاب کنید.
در بخش Emulator Control شما می توانید مختصات جغرافیایی را وارد کرده و دکمه ی Send را فشار دهید.
می توان موقعیت جغرافیایی را در شبیه ساز اندروید از طریق telnet انجام داد. یک پنجره ی فرمان (console) باز کرده و به دستگاه مربوطه متصل شوید. شماره ی پورت دستگاه شما در قسمت بالایی (نوار عنوان) شبیه ساز نمایان می باشد.
telnet localhost 5554
موقعیت را به وسیله ی فرمان زیر انتخاب و تنظیم کنید.
geo fix 13.24 52.31
3. آموزش : استفاده از رابط برنامه سازی کاربردی مکان یابی اندروید
ایجاد پروژه
پروژه ی جدیدی به نام de.vogella.android.locationapi.simple با activity ی به نام ShowLocationActivity ایجاد کنید.
این مثال از Google Maps استفاده نکرده و اجرای آن روی یک دستگاه معمولی اندروید نیز ممکن می باشد.
فایل layout خود موجود در پوشه ی res/layout را به کد زیر اصلاح کنید.
<?xml version="1.0" encoding="utf-8" ?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<linearlayout android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margintop="40dip"
android:orientation="horizontal">
<textview android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="10dip"
android:layout_marginright="5dip"
android:text="Latitude: "
android:textsize="20dip">
</TextView>
<textview android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="unknown"
android:textsize="20dip">
</TextView>
</linearlayout>
<linearlayout android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<textview android:id="@+id/TextView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="10dip"
android:layout_marginright="5dip"
android:text="Longitute: "
android:textsize="20dip">
</TextView>
<textview android:id="@+id/TextView04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="unknown"
android:textsize="20dip">
</TextView>
</LinearLayout>
</LinearLayout>
افزودن مجوزهای لازم
مجوزهای زیر را به برنامه ی کاربردی خود موجود در فایل AndroidManifest.xml اضافه کنید.
INTERNET
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
Activity
ShowLocationActivity را به زیر تغییر دهید. از Location Manager پرس و جو کرده (query گرفته)، سپس مقادیر پرس و جو (query values) را در activity مربوطه به نمایش می گذارد.
package de.vogella.android.locationsapi.simple;
import android.app.Activity;
import android.content.Context;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class ShowLocationActivity extends Activity implements LocationListener {
private TextView latituteField;
private TextView longitudeField;
private LocationManager locationManager;
private String provider;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
latituteField = (TextView) findViewById(R.id.TextView02);
longitudeField = (TextView) findViewById(R.id.TextView04);
// Get the location manager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria، false);
Location location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields
if (location != null) {
System.out.println("Provider " + provider + " has been selected.");
onLocationChanged(location);
} else {
latituteField.setText("Location not available");
longitudeField.setText("Location not available");
}
}
/* Request updates at startup */
@Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider، 400، 1، this);
}
/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
int lat = (int) (location.getLatitude());
int lng = (int) (location.getLongitude());
latituteField.setText(String.valueOf(lat));
longitudeField.setText(String.valueOf(lng));
}
@Override
public void onStatusChanged(String provider، int status، Bundle extras) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(this، "Enabled new provider " + provider،
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(this، "Disabled provider " + provider،
Toast.LENGTH_SHORT).show();
}
}
مرحله ی اجرا و تست
در صورت استفاده از شبیه ساز تعدادی از مختصات جغرافیایی را به دستگاه خود ارسال کنید. مختصات جغرافیایی مزبور باید به مجرد زدن دکمه ی مورد نظر نمایش داده شوند.
