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

جدول المحتويات
خطوات الحصول على مفتاح خرائط جوجل Api
يلزم وجود مفتاح API للوصول إلى خوادم خرائط Google . هذا المفتاح مجاني ويمكنك استخدامه مع أي من تطبيقاتك. إذا لم تكن قد أنشأت مشروعًا ، فيمكنك اتباع الخطوات التالية للبدء:
الخطوة 1: افتح وحدة تحكم مطوري Google وقم بتسجيل الدخول باستخدام حساب gmail الخاص بك: https://console.developers.google.com/project
الخطوة 2: الآن قم بإنشاء مشروع جديد. يمكنك إنشاء مشروع جديد من خلال النقر على زر إنشاء مشروع وتسمية مشروعك.

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

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

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

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

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

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

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

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

الخطوة 1: قم بإنشاء مشروع Android جديد وقم بتسميته GoogleMaps.
الخطوة 2: حدد الآن نشاط خرائط Google ، ثم انقر فوق التالي والانتهاء.

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

الخطوة 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;
}
}
المخرجات :
الآن قم بتشغيل التطبيق. إذا كنت متصلاً بالإنترنت وتوفر الوصول إلى موقعك ، فسترى في الخريطة رسومات تخطيط الطريق في الخريطة.