شرح Google Maps في الاندرويد

شرح خرائط Google مع مثال في Android Studio خطوة بخطوة

يسمح لنا Android بدمج خرائط Google في تطبيقنا. لهذا يوفر لنا Google مكتبة عبر خدمات Google Play لاستخدام الخرائط. من أجل استخدام Google Maps API ، يجب عليك تسجيل تطبيقك على  Google Developer Console  وتمكين API.

مثال على خريطة Google في Android Studio


خطوات الحصول على مفتاح خرائط جوجل Api

يلزم وجود مفتاح API للوصول إلى خوادم خرائط Google . هذا المفتاح مجاني ويمكنك استخدامه مع أي من تطبيقاتك. إذا لم تكن قد أنشأت مشروعًا ، فيمكنك اتباع الخطوات التالية للبدء:

الخطوة 1: افتح وحدة تحكم مطوري Google وقم بتسجيل الدخول باستخدام حساب gmail الخاص بك:  https://console.developers.google.com/project

الخطوة 2:  الآن قم بإنشاء مشروع جديد. يمكنك إنشاء مشروع جديد من خلال النقر على  زر إنشاء مشروع  وتسمية مشروعك.

إنشاء مشروع جديد

الخطوة 3:  الآن انقر فوق APIs والخدمات Services وافتح  Dashboard  منها.

افتح لوحة القيادة

الخطوة 4: في هذا افتح  تمكين APIS AND SERICES .

تمكين- api

الخطوة 5: الآن افتح Google Map Android API.

افتح-google-map-api

الخطوة 6: الآن قم بتمكين Google Maps Android API.

تمكين- خرائط جوجل API

الخطوة 6: انتقل الآن إلى  بيانات الاعتماد Credentials

فتح أوراق الاعتماد

الخطوة 7:  انقر هنا على إنشاء بيانات اعتماد credentials واختر مفتاح API

إنشاء بيانات اعتماد خريطة جوجل API

الخطوة 8: الآن API سيتم إنشاء مفتاح API الخاص بك. انسخه واحفظه في مكان ما حيث سنحتاجه عند تنفيذ خريطة Google في مشروع Android الخاص بنا.

إنشاء مفتاح خريطة جوجل API


مثال خرائط Google للوصول إلى الموقع الحالي للمستخدم في Android Studio

في مثال خريطة Google أدناه ، سنعرض موقع المستخدم الحالي على الخريطة. نقوم أيضًا بتجربة أنواع وأساليب الخرائط المختلفة والكثير من التفاصيل المطلوبة أثناء تنفيذ الخريطة في Android.

يمكنك أدناه تنزيل الكود ، والاطلاع على الإخراج النهائي والشرح خطوة بخطوة للمثال:

كود التحميل

مثال على خريطة Google في Android Studio

الخطوة 1: قم بإنشاء مشروع Android جديد وقم بتسميته GoogleMaps.

الخطوة 2: حدد الآن نشاط خرائط Google ، ثم انقر فوق التالي والانتهاء.

اختر-Map-Activity-Android-Studio

الخطوة 3: افتح الآن google_maps_api.xml (تصحيح الأخطاء) في مجلد القيم

Google-Maps-API-xml-android-studio

الخطوة 4: أدخل هنا مفتاح API لخرائط Google بدلاً من YOUR_KEY_HERE. في حالة تخطي المقالة ، فقد أوضحنا سابقًا كيفية الحصول على مفتاح Google Maps Api الخاص بك:

<resources>
  <!--
  TODO: Before you run your application, you need a Google Maps API key.

  To get one, follow this link, follow the directions and press "Create" at the end:

  https://console.developers.google.com/flows/enableapi?apiid=maps_android_backend&keyType=CLIENT_SIDE_ANDROID&r=8B:49:70:2A:08:F2:23:14:CF:A1:FC:6F:6D:5B:60:3C:B6:85:98:F2%3Bcom.example.abhishek.googlemaps

  You can also add your credentials to an existing key, using these values:

  Package name:
  8B:49:70:2A:08:F2:23:14:CF:A1:FC:6F:6D:5B:60:3C:B6:85:98:F2

  SHA-1 certificate fingerprint:
  8B:49:70:2A:08:F2:23:14:CF:A1:FC:6F:6D:5B:60:3C:B6:85:98:F2

  Alternatively, follow the directions here:
  https://developers.google.com/maps/documentation/android/start#get-key

  Once you have your key (it starts with "AIza"), replace the "google_maps_key"
  string in this file.
  -->
  <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">AIzaSyDV2_xy58r15K6TskZy4KWMuhUDVq67jqM</string>
  </resources>

الخطوة 5: افتح الآن build.gradle وأضف

 compile  "com.google.android.gms: play-services: 8.4.0" 

في dependencies

build.gradle code

apply plugin: 'com.android.application'

  android {
  compileSdkVersion 26
  buildToolsVersion "26.0.2"
  defaultConfig {
  applicationId "com.abhiandroid.GoogleMaps.googlemaps"
  minSdkVersion 15
  targetSdkVersion 26
  versionCode 1
  versionName "1.0"
  testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
  release {
  minifyEnabled false
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
  }
  }

  dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
  exclude group: 'com.android.support', module: 'support-annotations'
  })
  compile 'com.android.support:appcompat-v7:26.+'
  compile 'com.google.android.gms:play-services:8.4.0'
  testCompile 'junit:junit:4.12'
  }

الخطوة 6:  افتح الآن Activity_maps. xml وأضف كود جزء فيه

أضف هنا   عنصر جزء إلى ملف تخطيط النشاط لتعريف   كائن جزء . في هذا العنصر ، عيِّن سمة android: name على "com.google.android.gms.maps.MapFragment". يقوم هذا تلقائيًا بإرفاق جزء MapFragment بالنشاط. يحتوي ملف التخطيط التالي على عنصر جزء:

Activity_maps.xml code

<fragment android:id="@+id/map"
  android:name="com.google.android.gms.maps.SupportMapFragment"
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:map="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.abhiandroid.GoogleMaps.googlemaps.MapsActivity"/>

الخطوة 6: الآن حدد أذونات الإنترنت والموقع في Android Manifest

الإنترنت  - لتحديد ما إذا كنا متصلين بالإنترنت أم لا.
ACCESS_FINE_LOCATION  - لتحديد موقع المستخدم باستخدام GPS. سوف يعطينا الموقع الدقيق.

كود AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
  <manifest package="com.abhiandroid.GoogleMaps.googlemaps"
  xmlns:android="http://schemas.android.com/apk/res/android">
  <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">
  <meta-data
  android:name="com.google.android.geo.API_KEY"
  android:value="@string/google_maps_key"/>
  <activity
  android:name="com.abhiandroid.GoogleMaps.googlemaps.MapsActivity"
  android:label="@string/title_activity_maps">
  <intent-filter>
  <action android:name="android.intent.action.MAIN"/>
  <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>
  </activity>
  </application>
  </manifest>

الخطوة 7: الآن سنقوم بترميز MapsActivity. java لإدراج عمليات الاسترجاعات في خرائط Google:

-OnMapReadyCallback: يتم استدعاء رد الاتصال هذا عندما تكون الخريطة جاهزة للاستخدام

@Override
  public void onMapReady(GoogleMap googleMap) {}

-GoogleApiClient.ConnectionCallbacks : يتم استدعاء رد الاتصال هذا كلما تم توصيل الجهاز وفصله وتنفيذ وظائف onConnected () و onConnectionSuspended ().

//When the connect request has successfully completed
  @Override
  public void onConnected(Bundle bundle) {}

//Called when the client is temporarily in a disconnected state.
  @Override
  public void onConnectionSuspended(int i) {
  }

-GoogleApiClient.OnConnectionFailedListener : يوفر عمليات رد نداء للسيناريوهات التي تؤدي إلى محاولة فاشلة لتوصيل العميل بالخدمة. عند فشل الاتصال ، سيتم استدعاء onConnectionFailed ().

@Override
  public void onConnectionFailed(ConnectionResult connectionResult) {
  }

-LocationListener : رد الاتصال هذا له وظيفة onLocationChanged () التي سيتم استدعاؤها كلما حدث تغيير في موقع الجهاز.

@Override
  public void onLocationChanged(Location location) {}

-onMapReady (): يتم استدعاء هذه الوظيفة عندما تكون الخريطة جاهزة للاستخدام.

-buildGoogleApiClient ():  تُستخدم هذه الطريقة لتهيئة خدمات Google Play.

@Override
  public void onMapReady(GoogleMap googleMap) {
  mMap = googleMap;
  mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
  mMap.getUiSettings().setZoomControlsEnabled(true);
  mMap.getUiSettings().setZoomGesturesEnabled(true);
  mMap.getUiSettings().setCompassEnabled(true);

  //Initialize Google Play Services
  if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  if (ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION)
  == PackageManager.PERMISSION_GRANTED) {
  buildGoogleApiClient();
  mMap.setMyLocationEnabled(true);
  }
  } else {
  buildGoogleApiClient();
  mMap.setMyLocationEnabled(true);
  }
  }

-addConnectionCallbacks ():  تحتاج إلى استدعاء المستمعين المسجلين لتلقي أحداث الاتصال من GoogleApiClient هذا.

-addOnConnectionFailedListener ():  تضيف هذه الطرق مستمعًا للتسجيل لتلقي أحداث فشل الاتصال من GoogleApiClient هذا.

-GoogleApiClient.Builder:  يتم استخدام Builder للمساعدة في إنشاء كائن GoogleApiClient و addApi  () لتحديد Apis التي يطلبها تطبيقك.

-mGoogleApiClient.connect (): يجب توصيل العميل قبل تنفيذ أي عملية.

protected synchronized void buildGoogleApiClient() {
  mGoogleApiClient = new GoogleApiClient.Builder(this)
  .addConnectionCallbacks(this)
  .addOnConnectionFailedListener(this)
  .addApi(LocationServices.API)
  .build();
  mGoogleApiClient.connect();
  }

-عناصر التحكم  في التكبير / التصغير : توفر واجهة API للخرائط عناصر تحكم مدمجة في التكبير تظهر في الركن الأيمن السفلي من الخريطة. يمكن تمكينها عن طريق الاتصال بـ:

mMap.getUiSettings().setZoomControlsEnabled(true);

-إيماءات التكبير:

تكبير : انقر نقرًا مزدوجًا لزيادة مستوى التكبير بمقدار 1.

تصغير : انقر بإصبعين لتقليل مستوى التكبير بمقدار 1.

mMap.getUiSettings().setZoomGesturesEnabled(true);

- البوصلة:  يمكنك ضبط البوصلة عن طريق استدعاء الطريقة التالية:

mMap.getUiSettings().setCompassEnabled(true);

-تغيير نوع الخريطة:

توفر واجهة برمجة تطبيقات خرائط Android أنواع خرائط عادية وخرائط ساتلية وتضاريس ومختلطة لمساعدتك على:

mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
  mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
  mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
  mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

MAP_TYPE_NORMAL: يمثل خارطة طريق نموذجية بأسماء الشوارع والتسميات.

MAP_TYPE_SATELLITE: يمثل منطقة عرض القمر الصناعي بدون أسماء الشوارع والتسميات.

MAP_TYPE_TERRAIN:  البيانات الطبوغرافية. تتضمن الخريطة الألوان وخطوط الكنتور والتسميات وتظليل المنظور. بعض الطرق والتسميات مرئية أيضًا.

MAP_TYPE_HYBRID: يدمج منطقة عرض القمر الصناعي والوضع العادي الذي يعرض صور القمر الصناعي لمنطقة ما مع كافة الملصقات.

Map_TYPE_NONE : لا توجد مربعات. إنه مشابه للخريطة العادية ، لكنه لا يعرض أي تسميات أو ألوان لنوع البيئة في منطقة ما.

أضف ما يلي داخل setUpMap () أسفل استدعاء setMyLocationEnabled ():

يتم تحديث موقع المستخدم على فترات منتظمة. لقد استخدمنا FusedLocationProvider. لقد استخدمنا طريقة requestLocationUpdates () للحصول على تحديثات منتظمة حول موقع الجهاز. قم بذلك في رد الاتصال onConnected () الذي يوفره عميل واجهة برمجة تطبيقات Google ، والذي يتم استدعاؤه عندما يكون العميل جاهزًا.

يتم استخدام LocationRequest mLocationRequest للحصول على جودة الخدمة لتحديثات الموقع من FusedLocationProviderApi باستخدام requestLocationUpdates.

@Override
  public void onConnected(Bundle bundle) {
  mLocationRequest = new LocationRequest();
  mLocationRequest.setInterval(1000);
  mLocationRequest.setFastestInterval(1000);
  mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
  if (ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION)
  == PackageManager.PERMISSION_GRANTED) {
  LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
  mLocationRequest, this);
  }
  }

متى يتم تغيير موقع المستخدم. لذلك ، لدى Google وظيفة محددة مسبقًا onLocationChanged والتي سيتم استدعاؤها بمجرد تغيير موقع المستخدم. نحصل هنا على إحداثيات الموقع الحالي باستخدام getLatitude () و getLongitude () ونضيف أيضًا Marker.

الكود الكامل لفئة MapsActivity.java:

package com.abhiandroid.GoogleMaps.googlemaps;
  import android.Manifest;
  import android.content.Context;
  import android.content.pm.PackageManager;
  import android.location.Address;
  import android.location.Criteria;
  import android.location.Geocoder;
  import android.location.Location;
  import android.location.LocationManager;
  import android.os.Build;
  import android.os.Bundle;
  import android.support.v4.app.ActivityCompat;
  import android.support.v4.app.FragmentActivity;
  import android.support.v4.content.ContextCompat;
  import android.widget.Toast;
  import com.google.android.gms.common.ConnectionResult;
  import com.google.android.gms.common.api.GoogleApiClient;
  import com.google.android.gms.location.LocationListener;
  import com.google.android.gms.location.LocationRequest;
  import com.google.android.gms.location.LocationServices;
  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.BitmapDescriptorFactory;
  import com.google.android.gms.maps.model.LatLng;
  import com.google.android.gms.maps.model.Marker;
  import com.google.android.gms.maps.model.MarkerOptions;
  import com.abhiandroid.GoogleMaps.googlemaps.R;

  import java.io.IOException;
  import java.util.List;
  import java.util.Locale;
  public class MapsActivity extends FragmentActivity implements OnMapReadyCallback,
  GoogleApiClient.ConnectionCallbacks,
  GoogleApiClient.OnConnectionFailedListener,
  LocationListener {
  public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99;
  GoogleApiClient mGoogleApiClient;
  Location mLastLocation;
  Marker mCurrLocationMarker;
  LocationRequest mLocationRequest;
  private GoogleMap mMap;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_maps);

  if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  checkLocationPermission();
  }
  SupportMapFragment mapFragment = (SupportMapFragment)
  getSupportFragmentManager()
  .findFragmentById(R.id.map);

  mapFragment.getMapAsync(this);
  }
  @Override
  public void onMapReady(GoogleMap googleMap) {
  mMap = googleMap;
  mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
  mMap.getUiSettings().setZoomControlsEnabled(true);
  mMap.getUiSettings().setZoomGesturesEnabled(true);
  mMap.getUiSettings().setCompassEnabled(true);
  //Initialize Google Play Services
  if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  if (ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION)
  == PackageManager.PERMISSION_GRANTED) {
  buildGoogleApiClient();
  mMap.setMyLocationEnabled(true);
  }
  } else {
  buildGoogleApiClient();
  mMap.setMyLocationEnabled(true);
  }
  }
  protected synchronized void buildGoogleApiClient() {
  mGoogleApiClient = new GoogleApiClient.Builder(this)
  .addConnectionCallbacks(this)
  .addOnConnectionFailedListener(this)
  .addApi(LocationServices.API)
  .build();
  mGoogleApiClient.connect();
  }
  @Override
  public void onConnected(Bundle bundle) {
  mLocationRequest = new LocationRequest();
  mLocationRequest.setInterval(1000);
  mLocationRequest.setFastestInterval(1000);
  mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
  if (ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION)
  == PackageManager.PERMISSION_GRANTED) {
  LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
  mLocationRequest, this);
  }
  }
  @Override
  public void onConnectionSuspended(int i) {
  }
  @Override
  public void onLocationChanged(Location location) {
  mLastLocation = location;
  if (mCurrLocationMarker != null) {
  mCurrLocationMarker.remove();
  }
  //Showing Current Location Marker on Map
  LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
  MarkerOptions markerOptions = new MarkerOptions();
  markerOptions.position(latLng);
  LocationManager locationManager = (LocationManager)
  getSystemService(Context.LOCATION_SERVICE);
  String provider = locationManager.getBestProvider(new Criteria(), true);
  if (ActivityCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
  != PackageManager.PERMISSION_GRANTED) {
  return;
  }
  Location locations = locationManager.getLastKnownLocation(provider);
  List<String> providerList = locationManager.getAllProviders();
  if (null != locations && null != providerList && providerList.size() > 0) {
  double longitude = locations.getLongitude();
  double latitude = locations.getLatitude();
  Geocoder geocoder = new Geocoder(getApplicationContext(),
  Locale.getDefault());
  try {
  List<Address> listAddresses = geocoder.getFromLocation(latitude,
  longitude, 1);
  if (null != listAddresses && listAddresses.size() > 0) {
  String state = listAddresses.get(0).getAdminArea();
  String country = listAddresses.get(0).getCountryName();
  String subLocality = listAddresses.get(0).getSubLocality();
  markerOptions.title("" + latLng + "," + subLocality + "," + state
  + "," + country);
  }
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
  mCurrLocationMarker = mMap.addMarker(markerOptions);
  mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
  mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
  if (mGoogleApiClient != null) {
  LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,
  this);
  }
  }
  @Override
  public void onConnectionFailed(ConnectionResult connectionResult) {
  }
  public boolean checkLocationPermission() {
  if (ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION)
  != PackageManager.PERMISSION_GRANTED) {

  if (ActivityCompat.shouldShowRequestPermissionRationale(this,
  Manifest.permission.ACCESS_FINE_LOCATION)) {
  ActivityCompat.requestPermissions(this,
  new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
  MY_PERMISSIONS_REQUEST_LOCATION);
  } else {
  ActivityCompat.requestPermissions(this,
  new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
  MY_PERMISSIONS_REQUEST_LOCATION);
  }
  return false;
  } else {
  return true;
  }
  }
  @Override
  public void onRequestPermissionsResult(int requestCode,
  String permissions[], int[] grantResults) {
  switch (requestCode) {
  case MY_PERMISSIONS_REQUEST_LOCATION: {
  if (grantResults.length > 0
  && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  if (ContextCompat.checkSelfPermission(this,
  Manifest.permission.ACCESS_FINE_LOCATION)
  == PackageManager.PERMISSION_GRANTED) {
  if (mGoogleApiClient == null) {
  buildGoogleApiClient();
  }
  mMap.setMyLocationEnabled(true);
  }
  } else {
  Toast.makeText(this, "permission denied",
  Toast.LENGTH_LONG).show();
  }
  return;
  }
  }
  }
  }

المخرج :

الآن قم بتشغيل التطبيق. إذا كنت متصلاً بالإنترنت وتوفر الوصول إلى موقعك ، فسترى موقعك الحالي في الخريطة.


مثال على خريطة Google لرسم طريق بين موقعين في Android Studio

في هذا المثال ، نقوم برسم مسار بين موقعين باستخدام خطوط متعددة. في هذا نحدد الأصل وتقسيم خط الطول. بعد ذلك نحصل على عناوين url الخاصة بالاتجاه ثم ننفذ فئة AsyncTask للحصول على البيانات من واجهة API الخاصة بالاتجاه. في النهاية ، نقوم بتحليل بيانات الاتجاه ثم نستخدم PolylineOptions لرسم المسار بين موقعين.

يتم استخدام AsyncTask لإجراء عمليات تشغيل طويلة وإظهار نتيجتها على مؤشر ترابط واجهة المستخدم.

يمكنك أدناه تنزيل الكود ، والاطلاع على الإخراج النهائي والشرح خطوة بخطوة للمثال:

كود التحميل

مثال على مخطط رسم خريطة جوجل

الخطوة 1:  قم بإنشاء مشروع جديد وقم بتسميته MapExample.

الخطوة 2:  افتح Gradle Scripts> build.gradle وأضف تبعية Retrofit و RecyclerView  Library فيه.

apply plugin: 'com.android.application'

  android {
  compileSdkVersion 23
  buildToolsVersion "23.0.2"

  defaultConfig {
  applicationId "com.abhiandroid.MapRouteExample"
  minSdkVersion 15
  targetSdkVersion 23
  versionCode 1
  versionName "1.0"
  }
  buildTypes {
  release {
  minifyEnabled false
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
  }
  }

  dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  testCompile 'junit:junit:4.12'
  compile 'com.android.support:appcompat-v7:23.1.1'
  compile 'com.android.support:design:23.1.1'
  compile 'com.google.android.gms:play-services:7.8.0'
  }

الخطوة 3:  أضف إذن الإنترنت في AndroidManifest. xml :

بالنسبة لمعاملات الشبكة ، نحتاج إلى تحديد أذونات الإنترنت والخرائط الأخرى في ملف البيان الخاص بنا. أضف البيانات الوصفية باستخدام مفتاح خرائط Google الذي تحصل عليه من وحدة تحكم Google.

<?xml version="1.0" encoding="utf-8"?>
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.abhiandroid.MapRouteExample">


  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />


  <application
  android:allowBackup="true"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:supportsRtl="true"
  android:theme="@style/AppTheme">
  <activity
  android:name="com.abhiandroid.MapRouteExample.MainActivity"
  android:label="@string/app_name"
  android:theme="@style/AppTheme.NoActionBar">
  <intent-filter>
  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  </activity>

  <meta-data
  android:name="com.google.android.maps.v2.API_KEY"
  android:value="AIzaSyDagu1__IQVkCjlGIGYkbdUf-JcJ0hofZ0" />

  <meta-data
  android:name="com.google.android.gms.version"
  android:value="@integer/google_play_services_version" />

  </application>

  </manifest>

الخطوة 4:  افتح res -> layout -> activity_main.xml (أو) main.xml وأضف الكود التالي:

في هذه الخطوة نقوم بإنشاء support fragment  في  ملف XML الخاص بنا  .

<?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layout_behavior="@string/appbar_scrolling_view_behavior"
  tools:context="com.abhiandroid.MapRouteExample.MainActivity"
  tools:showIn="@layout/activity_main">

  <fragment
  android:id="@+id/map"
  android:name="com.google.android.gms.maps.SupportMapFragment"
  android:layout_width="match_parent"
  android:layout_gravity="center"
  android:layout_height="match_parent"
  />

  </RelativeLayout>

الخطوة 5:  قم بإنشاء كلاس اتجاهات JSONParser جديدة. DirectionsJSONParser.java حيث لدينا طريقة تحليل لتحليل البيانات التي نحصل عليها من واجهة API الخاصة بالاتجاه.

package com.abhiandroid.MapRouteExample;

  import com.google.android.gms.maps.model.LatLng;

  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;

  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;

  public class DirectionsJSONParser {

  /** Receives a JSONObject and returns a list of lists containing latitude and longitude */
  public List<List<HashMap<String,String>>> parse(JSONObject jObject){

  List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ;
  JSONArray jRoutes = null;
  JSONArray jLegs = null;
  JSONArray jSteps = null;

  try {

  jRoutes = jObject.getJSONArray("routes");

  /** Traversing all routes */
  for(int i=0;i<jRoutes.length();i++){
  jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
  List path = new ArrayList<HashMap<String, String>>();

  /** Traversing all legs */
  for(int j=0;j<jLegs.length();j++){
  jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");

  /** Traversing all steps */
  for(int k=0;k<jSteps.length();k++){
  String polyline = "";
  polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
  List list = decodePoly(polyline);

  /** Traversing all points */
  for(int l=0;l <list.size();l++){
  HashMap<String, String> hm = new HashMap<String, String>();
  hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
  hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
  path.add(hm);
  }
  }
  routes.add(path);
  }
  }

  } catch (JSONException e) {
  e.printStackTrace();
  }catch (Exception e){
  }

  return routes;
  }

  private List decodePoly(String encoded) {

  List poly = new ArrayList();
  int index = 0, len = encoded.length();
  int lat = 0, lng = 0;

  while (index < len) {
  int b, shift = 0, result = 0;
  do {
  b = encoded.charAt(index++) - 63;
  result |= (b & 0x1f) << shift;
  shift += 5;
  } while (b >= 0x20);
  int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
  lat += dlat;

  shift = 0;
  result = 0;
  do {
  b = encoded.charAt(index++) - 63;
  result |= (b & 0x1f) << shift;
  shift += 5;
  } while (b >= 0x20);
  int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
  lng += dlng;

  LatLng p = new LatLng((((double) lat / 1E5)),
  (((double) lng / 1E5)));
  poly.add(p);
  }

  return poly;
  }
  }

الخطوة 6:  الآن افتح التطبيق -> java -> package -> MainActivity.java وأضف الكود أدناه.

في هذه الخطوة ، نحصل أولاً على مرجع لجزء خريطة الدعم الذي حددناه في ملف xml الخاص بنا ، ثم قمنا بتعيين العلامة على كلا الموقعين في رد الاتصال onMapReady. بعد ذلك نحصل على عناوين url الخاصة بالاتجاه ثم ننفذ فئة AsyncTask للحصول على البيانات من واجهة API الخاصة بالاتجاه. في النهاية ، نقوم بتحليل بيانات الاتجاه ثم نستخدم PolylineOptions لرسم المسار بين موقعين.

package com.abhiandroid.MapRouteExample;

  import android.app.ProgressDialog;
  import android.graphics.Color;
  import android.os.AsyncTask;
  import android.os.Bundle;
  import android.support.v7.app.AppCompatActivity;
  import android.util.Log;
  import android.view.Menu;
  import android.view.MenuItem;

  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.BitmapDescriptorFactory;
  import com.google.android.gms.maps.model.LatLng;
  import com.google.android.gms.maps.model.MarkerOptions;
  import com.google.android.gms.maps.model.PolylineOptions;

  import org.json.JSONObject;

  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.net.HttpURLConnection;
  import java.net.URL;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;


  public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

  SupportMapFragment mapFragment;
  GoogleMap mMap;
  LatLng origin = new LatLng(30.739834, 76.782702);
  LatLng dest = new LatLng(30.705493, 76.801256);
  ProgressDialog progressDialog;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mapFragment = (SupportMapFragment) getSupportFragmentManager()
  .findFragmentById(R.id.map);
  mapFragment.getMapAsync(this);
  drawPolylines();

  }

  private void drawPolylines() {
  progressDialog = new ProgressDialog(MainActivity.this);
  progressDialog.setMessage("Please Wait, Polyline between two locations is building.");
  progressDialog.setCancelable(false);
  progressDialog.show();

  // Checks, whether start and end locations are captured
  // Getting URL to the Google Directions API
  String url = getDirectionsUrl(origin, dest);
  Log.d("url", url + "");
  DownloadTask downloadTask = new DownloadTask();
  // Start downloading json data from Google Directions API
  downloadTask.execute(url);
  }
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.menu_main, menu);
  return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();

  //noinspection SimplifiableIfStatement
  if (id == R.id.action_settings) {
  return true;
  }

  return super.onOptionsItemSelected(item);
  }

  @Override
  public void onMapReady(GoogleMap googleMap) {
  mMap = googleMap;
  mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
  googleMap.addMarker(new MarkerOptions()
  .position(origin)
  .title("LinkedIn")
  .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));

  googleMap.addMarker(new MarkerOptions()
  .position(dest));

  googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(origin, 15));

  }


  private class DownloadTask extends AsyncTask<String, Void, String> {

  @Override
  protected String doInBackground(String... url) {

  String data = "";

  try {
  data = downloadUrl(url[0]);
  } catch (Exception e) {
  Log.d("Background Task", e.toString());
  }
  return data;
  }

  @Override
  protected void onPostExecute(String result) {
  super.onPostExecute(result);

  ParserTask parserTask = new ParserTask();


  parserTask.execute(result);

  }
  }


  /**
  * A class to parse the Google Places in JSON format
  */
  private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

  // Parsing the data in non-ui thread
  @Override
  protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

  JSONObject jObject;
  List<List<HashMap<String, String>>> routes = null;

  try {
  jObject = new JSONObject(jsonData[0]);
  DirectionsJSONParser parser = new DirectionsJSONParser();

  routes = parser.parse(jObject);
  } catch (Exception e) {
  e.printStackTrace();
  }
  return routes;
  }

  @Override
  protected void onPostExecute(List<List<HashMap<String, String>>> result) {

  progressDialog.dismiss();
  Log.d("result", result.toString());
  ArrayList points = null;
  PolylineOptions lineOptions = null;

  for (int i = 0; i < result.size(); i++) {
  points = new ArrayList();
  lineOptions = new PolylineOptions();

  List<HashMap<String, String>> path = result.get(i);

  for (int j = 0; j < path.size(); j++) {
  HashMap<String, String> point = path.get(j);

  double lat = Double.parseDouble(point.get("lat"));
  double lng = Double.parseDouble(point.get("lng"));
  LatLng position = new LatLng(lat, lng);

  points.add(position);
  }

  lineOptions.addAll(points);
  lineOptions.width(12);
  lineOptions.color(Color.RED);
  lineOptions.geodesic(true);

  }

  // Drawing polyline in the Google Map for the i-th route
  mMap.addPolyline(lineOptions);
  }
  }

  private String getDirectionsUrl(LatLng origin, LatLng dest) {

  // Origin of route
  String str_origin = "origin=" + origin.latitude + "," + origin.longitude;

  // Destination of route
  String str_dest = "destination=" + dest.latitude + "," + dest.longitude;

  // Sensor enabled
  String sensor = "sensor=false";
  String mode = "mode=driving";
  // Building the parameters to the web service
  String parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode;

  // Output format
  String output = "json";

  // Building the url to the web service
  String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;


  return url;
  }

  /**
  * A method to download json data from url
  */
  private String downloadUrl(String strUrl) throws IOException {
  String data = "";
  InputStream iStream = null;
  HttpURLConnection urlConnection = null;
  try {
  URL url = new URL(strUrl);

  urlConnection = (HttpURLConnection) url.openConnection();

  urlConnection.connect();

  iStream = urlConnection.getInputStream();

  BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

  StringBuffer sb = new StringBuffer();

  String line = "";
  while ((line = br.readLine()) != null) {
  sb.append(line);
  }

  data = sb.toString();

  br.close();
  Log.d("data", data);

  } catch (Exception e) {
  Log.d("Exception", e.toString());
  } finally {
  iStream.close();
  urlConnection.disconnect();
  }
  return data;
  }
  }

المخرجات :

الآن قم بتشغيل التطبيق. إذا كنت متصلاً بالإنترنت وتوفر الوصول إلى موقعك ، فسترى في الخريطة رسومات تخطيط الطريق في الخريطة.