آموزش  ایجاد نقشه گوگل در اندروید استودیو

آموزش ایجاد نقشه گوگل در اندروید استودیو

در این مطلب ما با گوگل مپ و طریقه نمایش محل کاربر بر روی نقشه گوگل در موبایل های اندرویدی آشنا خواهیم شد و پس از آن به راحتی قادر خواهیم بود مختصات کاربر را گرفته و در نقشه گوگل نمایش دهیم. در این مطلب همچنین مطالب مربوط به Permission ها در نسخه های بالای 6 برای نمایش نقشه گوگل نیز بررسی و رفع شده است.

باسلام

 

در این مطلب قصد دارم طریقه ایجاد و نمایش نقشه گوگل رو در برنامه نویسی اندروید و محیط اندروید استودیو برای شما دوستان و علاقه مندان به برنامه نویسی اندروید توضیح بدم.

 

در انتهای این آموزش شما قادر خواهید بود یک صفحه در موبایل برای کاربران نمایش دهید و با کمک نقشه گوگل مکان آنها را نمایش دهید.

 

خوب برای شروع ابتدا باید یک API_KEY گوگل داشته باشیم. همانطور که می دانید گوگل جدیدا برای ایجاد api هزینه ای دریافت می کند.در هرصورت اگر نتوانستید از api گوگل استفاده نمایید می توانید از دیگر نقشه های موجود و رایگان استفاده کنید.

 

خوب پس از دریافت api_key حالا نرم افزار اندروید استودیو را باز کنید و مراحل را مطابق تصاویر زیر ادامه دهید:

یک پروژه جدید یا نام و دیگر موارد دلخواه خود ایجاد نمایید:

 

 

بر روی دکمه Next کلیک کنید در صفحه جدید sdk مورد نظر خود را انتخاب و روی دکمه next کلیک کنید( اگر با تنظیمات این بخش آشنایی ندارید نیازی به تغییر نمی باشد)

 

در مرحله بعد روی اکتیوتی Google Maps Activity را انتخاب کرده و روی دکمه Next کلیک کنید 

البته می توان گزینه Empty Activty را نیز انتخاب کرد اما خوب بخاطر راحتی کار خودمون گزینه Google Maps Activity رو انتخاب می کنیم تا بخشی از کدها رو خود اندروید استودیو برای ما بسازه! پس یادتون نره اکتویتی گوگل مپ رو مطابق تصویر زیر انتخاب کنید:

با کلیک بر روی دکمه Next در تصویر بالا، در صفحه جدید می توانید نام دلخواه برای activity یا layout  خود انتخاب کنید یا بدون تغییر بر روی دکمه Finish کلیک کنید

پس از کلیک بر روی دکمه finish پروژه ایجاد و آماده کد نویسی خواهد شد.

در اولین مرحله باید api_key گوگل مپ را به نرم افزار معرفی کنیم. برای اینکار به پوشه res/values رفته و سپس فایل google_maps_api.xml را باز کنید.

در این فایل به جای مقدار YOUR_KEY_HEREمقدار api_key خود را که از گوگل مپ گرفته اید وارد نمایید.

سپس به فایل منیفست خود رفته و دسترسی های زیر را به آن اضاف نمایید:

    
    
    

اکنون به فایل اکتویتی اصلی برنامه یا همان MapsActivity مراجعه کنید. همانطور که می بینید فایل پیش فرض دارای کدهایی می باشد که خود اندروید استودیو برای ما اضاف کرد است. اما این کدها کافی نمی باشند برای شروع ما باید انیترفیس LocationListener را به کلاس خود implement کنیم.

پس از اقزودن این انیترفیس به کلاس MapsActivity کلاس ما بصورت زیر خواهد شد.

برای فراخوانی متدهای اینترفیس LocationListener بر روی کلمه LocationListener رفته و دکمه alt+enter را فشار دهید و هر 4 متد مربوطه را اضاف نمایید.

package googlemaptest.com.pishroapp.googlemaptest;

import android.location.Location;
import android.location.LocationListener;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }


    /**
     * Manipulates the map once available.
     * This callback is triggered when the map is ready to be used.
     * This is where we can add markers or lines, add listeners or move the camera. In this case,
     * we just add a marker near Sydney, Australia.
     * If Google Play services is not installed on the device, the user will be prompted to install
     * it inside the SupportMapFragment. This method will only be triggered once the user has
     * installed Google Play services and returned to the app.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    @Override
    public void onLocationChanged(Location location) {

    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
}

 

همانطور که مشاهده کردید پس از فراخوانی LocationListener چهار متد جدید به کلاس ما اضاف شد که شرح هر کدام از این متد ها بصورت زیر می باشد:

onLocationChanged: هنگامی که مکان گوشی موبایل شما تغییر می کند این متد مقادیر جدید را از طریق مقدار location دریافت و به اطلاع شما می رساند.

onStatusChanged: این متد در هنگامی فعالیت خواهد کرد که وضعیت سرویس دهند gps گوشی موبایل تغییر کند.

onProviderEnabled: هنگامی که سرویس دهنده در دسترس باشد
onProviderDisabled: هنگامی که سرویس دهنده یا همان gps گوشی موبایل در دسترس نباشد.

 

با ران کردن فایل بالا نقشه گوگل با مختصات شهر سیدنی استرالیا برای شما نمایش داده خواهد شد! اما چرا؟

اگر به کدها دقت کنید متوجه خواهد شد که در متد onMapReady بصورت پیش فرض مختصات شهر سیدنی توسط اندروید استودیو به برنامه داده شده است. 

خوب اما ما قصد داریم مکان خودمون رو روی نقشه نمایش بدیم! پس باید چیکار کنیم؟

قبل از توضیح در مورد روش نمایش موقعیت خودمون در مورد  متد onMapReady زمانی فراخوانی میشود که نقشه گوگل مپ آماده می باشد.

خوب حالا چطور باید مختصاب خودمون رو به گوگل و برنامه بدیم تا اون رو برای ما نمایش بده؟!؟ به راحتی!

ابتدا یک LocationManager در متد onCreate بصورت زیر ایجاد می کنیم:

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

اگر پس از قرار دادن کد بالا در متد onCreate پیغام قسمت پایین به رنگ قرمز شد نگران نباشد! این بخاطر پرمیشن ها هست که از نسخه 6 اندروید به بعد تغییراتی در اون ایجاد شده. من کد مربوط به پرمیشن ها رو و کد نهایی رو در انتهای مطلب قرار داده ام که می تونید از اون استفاده کنید و این مشکل رو رفع کنید.

 

حال مقادیر پیش فرض در متد onMapReady رو کامنت کنید یا کلا حذف کنید  البته بجز mMap = googleMap; یعنی متد onMapReady بصورت زیر بشه:

 

    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }

سپس متد onLocationChanged را بصورت زیر تغییر دهید:

    @Override
    public void onLocationChanged(Location location) {
        LatLng myloc = new LatLng(location.getLatitude(), location.getLongitude());
        mMap.addMarker(new MarkerOptions().position(myloc).title("myLocation"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myloc));
    }

 

ما در متد بالا ابتدا یک مقدار LatLng تعریف کردیم و مقادیر موقعیت خودمون رو یا همان latitude و longitude رو داخل اون ریختیم و سپس از شی mMap که در متد onMapReady بود استفاده کردیم و با استفاده از moveCamera اون رو نمایش دادیم.

 

 

خوب حالا کار ما تموم شده!

 

البته باز هم یک مشکل دیگر هست و اون اینکه این کد روی اندروید بالاتر از 6 به دلیل تغییر در سطح دسترسی ها از نسخه 6 به بالاتر نمایش داده نمیشه!:(

که برای حل اون باید از پرمیشن اکسز ها استفاده کنیم که چون در سطح این آموزش نیست فعلا از آموزش اون صرف نظر می کنم اما کد کامل اون رو که روی همه نسخه های اندروید جواب میده رو در زیر برای شما قرار داده ام.

این هم کل نهایی ما که می تونید از اون در پروژه های خود استفاده کنید.

 

 

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,LocationListener {

    private GoogleMap mMap;
    public final int PERMISSION_ACCESS_COARSE_LOCATION = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSION_ACCESS_COARSE_LOCATION);
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,Manifest.permission.ACCESS_FINE_LOCATION},
                    PERMISSION_ACCESS_COARSE_LOCATION);
        }else{
            LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);

        }



    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }

    @Override
    public void onLocationChanged(Location location) {
        LatLng myloc = new LatLng(location.getLatitude(), location.getLongitude());
        mMap.addMarker(new MarkerOptions().position(myloc).title("myLocation"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(myloc));
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_ACCESS_COARSE_LOCATION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED  ) {
                    Toast.makeText(this, "ok!", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Need your location!", Toast.LENGTH_SHORT).show();
                }

                break;
        }
    }
}

 

این هم تصویر نهایی پروژه بر روی موبایل:

خوب امیدوارم از این آموزش لذت برده باشید.

انشاالله بزودی آموزش های جالب تری نیز قرار خواهم داد.

لطفا با ارسال نظر ما رو در ادامه دادن این مسیر یاری کنید.


دسته بندی ها:

اندروید

ارسال نظر

برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *

ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *

اگر نظری برای این مطلب ارسال شد از طریق ایمیل مرا اطلاع بده!
لسیت نظرات
هنوز برای این مطلب نظری ارسال نشده است!