وبلاگ انجمن برنامه نویسی اندروید

p30droid.com
برنامه نویسی اندروید|آموزش برنامه نویسی اندروید|اندروید استودیو
سه شنبه, ۷ شهریور ۱۳۹۶، ۰۱:۴۰ ب.ظ

آموزش کار با Google maps در اندروید

در این پست میخوایم خیلی سریع و کوتاه نحوه کار با Google maps رو بررسی کنیم.

من فرض می کنم که شما در مورد برنامه نویسی در اندروید اطلاعات لازم رو دارید، تا بتونیم توضیحات رو کوتاه کنیم و به بخش اصلی کار بپردازیم. با فرض اینکه از طریق این لینک تونستید مقدمات وارد کردن گوگل مپ رو پیاده سازی کنید به سراغ توضیحات مورد نظر میریم.

من از Fragment  برای پیاده سازی UI  استفاده کردم، به این صورت که در این اپ که کار توسعه اون رو انجام میدادیم از چند تب برای دسترسی به بخشهای مختلف استفاده کردیم، و تب Map رو با Fragment ساختیم و کد xml رو به این نحو نوشتیم:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/bg"
    tools:context="com.app.androidstudio.example.MapFragment">

    <com.google.android.gms.maps.MapView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mapView">
    </com.google.android.gms.maps.MapView>
</RelativeLayout>

حالا به سراغ کد نویسی کلاس جاوا میریم، یه کلای جاوا به اسم MapFragment داریم، که به صورت زیر کد نویسی شده: (از توضیحات نحوه نوشتن کدهای مربوط به Fragment چشم پوشی کردم، در صورت نیاز و برخورد با سوال در همینجا مطرح کنید)


import android.content.pm.PackageManager;
import android.database.Cursor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

/**
 * Created by s.jahanzadeh on 05/30/2017.
 */

public class MapFragmentMain extends Fragment {

    //معرفی آبجکتها و متغیرها به صورت گلوبال
    private MapView mapView;
    private GoogleMap googleMap;
    private TextView latitudeText, longitudeText;

    private static final String[] LOCATION_PERMS = {
            android.Manifest.permission.ACCESS_FINE_LOCATION
    };

    private static final String[] COARSE_PERMS = {
            android.Manifest.permission.ACCESS_COARSE_LOCATION
    };

    public MapFragmentMain() {
        // این بخش رو خالی بذارید
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //در اینجا نیازی به کد نویسی در این بخش نیست
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //معرفی یک ویو برای فرگمنت
        View view = inflater.inflate(R.layout.map, container, false);

        //find view by ids
        latitudeText = (TextView) view.findViewById(R.id.latitudeText);
        longitudeText = (TextView) view.findViewById(R.id.longitudeText);

        mapView = (MapView) view.findViewById(R.id.mapView);
        mapView.onCreate(savedInstanceState);

        //با این دستور در واقع داریم زمینه رو برای استفاده از گوگل مپ فراهم میکنیم
        //بعضی از APIها نیاز به فراهم کردن بستر قبل از استفاده از اونها دارن
        //مانند BitmapDescriptorFactory و CameraUpdateFactory
        try {
            MapsInitializer.initialize(getActivity().getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
        }

        // استفاده از getMapAsync باعث میشه که به صورت خودکار مپ به نمایش بیاد
        //البته نکات خیلی زیادی این مطلب داره که اگر بخوام به یکی از اونها اشاره بکنم این هست که
        //به دلیل استفاده از فرگمنت هر زمانی که ما view رو تغییر بدیم طبیعتا چرخه حیاطش فرگمنت به پایان میرسه
        //منظور از تغییر view رفتن به یک فرگمنت دیگه هست
        //تمامی آبجکتهایی که با گوگل مپ در ارتباط هستند به نوعی با ویو ما در ارتباط خواهند بود
        //پس این نکته خیلی مهمی هست که آبکتهایی مثل مارکر رو در پس زمینه نگه نداریم
        //چرا که باعث درگیر کردن مموری خواهد شد در به احتمال بسیار زیاد اگر دوباره این فرگمنت رو فراخوانی کنید ویو قفل خواهد کرد
        //دقیقا مشابه AsyncTask
        mapView.getMapAsync(new OnMapReadyCallback() {
            @Override
            public void onMapReady(GoogleMap mMap) {
                googleMap = mMap;

                googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                // برای رفتن به موقعیت کاربر روی نقشه
                googleMap.getUiSettings().setMyLocationButtonEnabled(true);

                //بررسی permissionهای مورد نیاز
                if (ActivityCompat.checkSelfPermission(getContext().getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext().getApplicationContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.

                    requestPermissions(LOCATION_PERMS, 1337 + 3);
                    requestPermissions(COARSE_PERMS, 1337 + 3);
                    return;
                }

                //فعال کردن دکمه location روی نقشه
                googleMap.setMyLocationEnabled(true);

                //کدهای این قسمت خیلی مهم هستند
                //استفاده از locationManager برای دسترسی به سرویس لوکیشن
                LocationManager locationManager = (LocationManager) getActivity().getSystemService(getContext().getApplicationContext().LOCATION_SERVICE);

                //در کلاس Criteria متدی وجود داره با عنوان getBestProvider
                //استفاده از این کلاس باعث میشه که از بین GPS و Network هر کردوم که بهتر و قویتر بود مورد استفاده قرار بگیره
                Criteria criteria = new Criteria();

                //گرفتن لوکیشن با استفاده از اطلاعات بالا
                Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));

                //بردن دوربین نقشه روی محل کاربر
                CameraPosition cameraPosition = new CameraPosition.Builder().target(new LatLng(location.getLatitude(), location.getLongitude())).zoom(15).build();

                //متحرک سازی دوربین
                googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

                //ساخت مارکر با استفاده از نگه داشتن انگشت روی نقشه
                googleMap.setOnMapLongClickListener(new GoogleMap.OnMapLongClickListener() {
                    @Override
                    public void onMapLongClick(LatLng latLng) {
                        Marker marker;
                        marker = googleMap.addMarker(new MarkerOptions().position(latLng).title("Point").snippet("My point"));

                        double currentLat = marker.getPosition().latitude;
                        double currentLon = marker.getPosition().longitude;

                        latitudeText.setText(Double.toString(currentLat));
                        longitudeText.setText(Double.toString(currentLon));
                    }
                });
            }
        });

        return view;
    }

    //همونطور که در بالا توضیح دادم جهت جلوگیری از پر شدن نا بجای مموری طبق روال همیشگی متدهای زیر رو بسازید
    @Override
    public void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    public void onPause() {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }
}

این بدنه اصلی کدهای ما بود.

امیدوارم توضیحات کافی باشه، در صورت نیاز سوالهاتون رو مطرح کنید تا هم دوستان بتونن جواب بدن هم بنده اگر در توانم باشه.

مطمئنا کدهای بالا خالی از اشکال نیستن، پس اگر مطلبی جا افتاده به بزرگی خودتون بنده حقیر رو ببخشید...








انجمن اندروید ایران

آموزش اندروید     آموزش برنامه نویسی اندروید    برنامه نویسی اندروید    اندروید استودیو     آموزش اندروید استودیو

نظرات (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی