Google Direction Library — ใช้งาน Google Direction API บน Google Maps แบบง่ายๆ
อยู่ในระหว่างการปรับปรุงเนื้อหา
โดยปกติแล้วการนำแผนที่ของ Google Maps มาแสดงบนแอปพลิเคชันแอนดรอยด์นั้น ทาง Google จะทำ Library ไว้ให้อยู่แล้ว จึงทำให้สะดวกต่อนักพัฒนาแอนดรอยด์ที่ต้องการนำมาใช้งาน และถ้าต้องการใช้งาน Google Place API ก็มี Library ให้แล้วเช่นกัน
แต่ทว่าถ้าอยากจะให้แสดงเส้นทางเพื่อนำทางบน Google Maps ก็จะต้องใช้ Google Maps Direction API ซึ่งปัญหาก็คือตอนนี้ทาง Google ยังไม่ได้ Provide เจ้า API ตัวนี้ให้แอนดรอยด์โดยเฉพาะ ดังนั้นจึงต้องใช้วิธีดึงข้อมูลจาก API ผ่าน HTTP แบบตรงๆกันไปก่อน และข้อมูลที่ได้มานั้นก็จะเป็น JSON (หรือ XML) ซึ่งนักพัฒนาก็ต้องมานั่งแยกข้อมูลอีกที ก่อนที่จะทำไปใช้งาน
ดังนั้นเพื่อให้สะดวกมากขึ้นเจ้าของบล็อกจึงเขียน Library ขึ้นมาเพื่อช่วยให้สามารถเรียกใช้งาน Google Maps Direction API ได้ง่ายขึ้น อย่างน้อยก็จนกว่าทาง Google จะ Provide Library สำหรับแอนดรอยด์มาให้น่ะแหละ
เกี่ยวกับ Google Direction Library
Google Direction Library ของเจ้าของบล็อกสร้างขึ้นมาเพื่อใช้งานบนแอนดรอยด์โดยเฉพาะ และผูกกับ Google Maps ดังนั้นถ้าตัว Library ก็จะมี Dependencies ของ Google Play Service (Maps) ด้วย นั่นก็หมายความว่า Library ตัวนี้ต้องใช้ Google Play Services ด้วย และเบื้องหลังการทำงานก็จะใช้ Retrofit (2.0), GSON และ Parceler ด้วย
ก่อนจะนำไปใช้งานก็ขอให้มั่นใจว่า Google Maps ของผู้ที่หลงเข้ามาอ่านสามารถแสดงบนแอพได้ปกติสุขดี แล้วค่อยเอา Library ตัวนี้ไปใช้
และ Library ตัวนี้ต้องใช้ API Key จาก Google Developer Console ด้วย คล้ายๆกับ Google Maps for Android เลย แต่ทว่าประเภทของ Key จะต่างกันไปหน่อย เพราะว่าของ Google Maps สามารถขอเป็น Android Key ได้เลย เนื่องจากมี Library สำหรับแอนดรอยด์ แต่ Google Direction Library นั้นใช้วิธีการติดต่อผ่าน HTTP ธรรมดาๆ ดังนั้นจึงต้องขอ Key เป็นแบบ Server Key ครับ
ก่อนจะขอ Server Key ก็อย่าลืมเปิดใช้งาน Google Maps Direction API ก่อนนะ
ซึ่งขั้นตอนการขอ Server Key ก็เหมือนกับ Android Key เลย เพียงแต่เลือกคนละอันกันเท่านั้น
จะตั้งชื่อว่าอะไรก็ได้ ขอแค่ให้รู้ก็พอว่ามันคืออะไร ส่วนช่อง IP Address ไม่ต้องกรอกอะไรลงไป ปล่อยโล่งๆไว้นั้นแหละ เอาแล้ว API Key ไปใช้งานได้เลย
การใช้งาน Google Direction Library
สามารถดึงผ่าน Maven ได้เลย โดยใส่เป็น Dependencies ไว้ใน build.gradle แบบนี้
dependencies { ... compile 'com.akexorcist:google-direction-library:1.2.0' }
และคำสั่งในการเรียกใช้งานก็แสนเรียบง่าย (เพราะความวุ่นวายมันอยู่ตอนที่ข้อมูลส่งกลับมา) โดยรูปแบบคำสั่งที่ง่ายที่สุดจะเป็นแบบนี้
GoogleDirection.withServerKey(String serverKey) .from(LatLng origin) .to(LatLng destination) .execute(DirectionCallback callback);
serverKey ก็คือ API Key ที่ขอมาจาก Google Developer Console
origin คือพิกัดเริ่มต้นที่จะให้นำทาง โดยอยู่ในรูปของคลาส LatLng (ของ Google Maps)
destination คือพิกัดปลายทางที่จะให้นำทาง
callback คือ Direction Callback Event ที่จะถูกเรียกเมื่อข้อมูลจาก Google Maps Direction API ส่งกลับมาแล้ว
เวลาใช้งานจริงๆก็จะเป็นแบบนี้
String serverKey = "AIzaSyDFWdlR5DG1VYXSaMwG62ilxxxxxxxxx"; LatLng origin = new LatLng(37.7849569, -122.4068855); LatLng destination = new LatLng(37.7814432, -122.4460177); GoogleDirection.withServerKey(serverKey) .from(origin) .to(destination) .execute(new DirectionCallback() { @Override public void onDirectionSuccess(Direction direction, String rawBody) { // Do something here } @Override public void onDirectionFailure(Throwable t) { // Do something here } });
โดย Callback จะมีสองแบบด้วยกัน คือ Success กับ Failure ถ้ารับข้อมูลได้สำเร็จก็จะได้ Object กลับมาเป็น Direction Instance ก็ดึงข้อมูลจากในนั้นไปใช้งานได้เลย หรือจะเอาเป็นแบบ String ไปใช้งานก็ได้
แต่ถ้าเกิดข้อผิดพลาดเช่น ไม่ได้เชื่อมต่ออินเตอร์เน็ตหรือ Connection Timeout ก็จะส่งกลับมาเป็น Failure ส่วนสาเหตุก็ให้วิเคราะห์จากใน Throwable Instance ต่อไป เพื่อแสดงข้อความแจ้งให้ผู้ใช้ทราบ
Optional Parameter สำหรับกำหนดข้อมูลที่ต้องการเพิ่มเติม
นอกจากคำสั่ง withServerKey, from และ to ที่ใช้สำหรับกำหนดข้อมูลที่ต้องการแล้ว ยังสามารถกำหนดอย่างอื่นเพิ่มเติมได้อีกด้วย โดยกำหนดหลังจากคำสั่ง to ก่อนที่จะใช้คำสั่ง execute
โดยจะมีดังนี้
transportMode(String transportMode) language(String language) unit(String unit) avoid(String avoid) transitMode(String transitMode) alternativeRoute(boolean alternative)
Transport Mode
การกำหนดรูปแบบในการเดินทาง ให้กำหนดค่าโดยใช้ค่าจากคลาส TransportMode
TransportMode.DRIVING TransportMode.WALKING TransportMode.BICYCLING TransportMode.TRANSIT
ซึ่งเส้นทางก็จะแตกต่างกันไปตามรูปแบบการเดินทาง ถ้าเป็น Bicycling ก็จะมีให้ในบางที่เท่านั้น และถ้าเป็น Transit ก็จะมีเส้นทางแบบ Walking ผสมอยู่ด้วย เพื่อให้เดินไปขึ้นรถโดยสารนั่นเอง
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .transportMode(TransportMode.WALKING) .execute(...);
Language
กำหนดรูปแบบภาษาของข้อมูลที่ส่งกลับมาจาก Google Maps Direction API ให้กำหนดค่าโดยใช้ค่าจากคลาส Language
Language.GERMAN Language.ENGLISH Language.KOREAN Language.JAPAN ...
โดยข้อมูลที่ได้ก็จะเป็นภาษาที่ต้องการ แต่ทว่าก็ต้องคำนึงถึงสถานที่ด้วย เพราะควรจะเป็นภาษาที่ตรงกับพื้นที่ของเส้นทางนั้นๆ เช่น นักพัฒนาต้องการข้อความภาษาไทยในต่างประเทศ ก็อาจจะไม่ได้เป็นภาษาไทยเสมอไป เพราะไม่รองรับในประเทศนั้นๆ เป็นต้น
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .language(Language.THAILAND) .execute(...);
Unit
กำหนดหน่วยของระยะทางที่จะแสดงในข้อมูล ให้กำหนดค่าโดยใช้ค่าจากคลาส Unit
Unit.METRIC Unit.IMPERIAL
METRIC หน่วยกิโลเมตรและเมตร
IMPERIAL ก็จะได้เป็นหน่วยไมล์และฟุต
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .unit(Unit.METRIC) .execute(...);
Avoid
กำหนดว่าจะหลีกเลี่ยงเส้นทางแบบไหน ให้กำหนดค่าโดยใช้ค่าจากคลาส AvoidType
AvoidType.TOLLS AvoidType.HIGHWAYS AvoidType.FERRIES AvoidType.INDOOR
TOLLS หลีกเลี่ยงเส้นทางที่ต้องใช้ทางด่วน
HIGHWAYS หลีกเลี่ยงเส้นทางที่ต้องใช้ทางหลวง
FERRIES หลีกเลี่ยงเส้นทางที่ต้องเดินทางด้วยเรือ
INDOOR หลีกเลี่ยงเส้นทางที่ต้องเดินทางภายในอาคารหรือที่ร่ม
ซึ่งคำสั่งนี้สามารถกำหนดได้มากกว่าหนึ่งอย่าง เพียงแค่กำหนดค่าที่ต้องการซ้ำลงไป เพราะตัวคำสั่งเป็นการ Add ค่าเข้าไปจากของเดิม
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .avoid(AvoidType.FERRIES) .avoid(AvoidType.INDOOR) .execute(...);
Transit Mode
กำหนดประเภทของรถโดยสารที่ต้องการ เมื่อกำหนดเส้นทางเป็นแบบ Transit ให้กำหนดค่าโดยใช้ค่าจากคลาส TransitMode
TransitMode.BUS TransitMode.SUBWAY TransitMode.TRAIN TransitMode.TRAM TransitMode.RAIL
BUS เลือกเป็นเส้นทางของรถบัส
SUBWAY เลือกเป็นเส้นทางของรถไฟใต้ดิน
TRAIN เลือกเป็นเส้นทางของรถไฟ
TRAM เลือกเป็นเส้นทางของรถราง
RAIL เลือกเป็นเส้นทางของรถไฟ, รถราง และรถไฟใต้ดิน (รวม SUBWAY, TRAIN และ TRAM)
ซึ่งคำสั่งนี้สามารถกำหนดได้มากกว่าหนึ่งอย่าง เพียงแค่กำหนดค่าที่ต้องการซ้ำลงไป เพราะตัวคำสั่งเป็นการ Add ค่าเข้าไปจากของเดิม
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .transitMode(TransitMode.TRAIN) .transitMode(TransitMode.BUS) .transitMode(TransitMode.SUBWAY) .execute(...);
Alternative Route
กำหนดให้ส่งข้อมูลเส้นทางมามากกว่าหนึ่งเส้นทาง (ถ้ามี) โดยปกติแล้วตัว Google Maps Direction API จะส่งข้อมูลเส้นทางที่ดีที่สุดเท่านั้น แต่ถ้ากำหนดเป็นแบบ Alternative ก็จะส่งข้อมูลเส้นทางที่ที่เหมาะสมทั้งหมดมาให้
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .alternativeRoute(true) .execute(...);
โดยทั้งหมดนี้สามารถกำหนดร่วมกันได้ตามต้องการ อยากจะหลีกเลี่ยงเส้นทางแบบไหน อยากเดินทางแบบไหน ก็กำหนดพร้อมๆกันได้เลย
GoogleDirection.withServerKey(serverKey) .from(...) .to(...) .transportMode(TransportMode.TRANSIT) .transitMode(TransitMode.BUS) .unit(Unit.METRIC) .execute(...);
รูปแบบข้อมูลที่ส่งกลับมา
เมื่อข้อมูลถูกส่งกลับมาจาก Google Maps Direction API ก็จะส่งกลับมาในรูปของคลาส Direction ซึ่งข้อมูลก็จะค่อนข้างซับซ้อนพอสมควร แต่หลักๆที่ใช้งานก็จะมีดังนี้
ตรวจสอบสถานะของข้อมูล
เนื่องจากข้อมูลก็มีปัญหาได้ในบางครั้ง ดังนั้นควรตรวจสอบสถานะของข้อมูลก่อนว่าเป็นอะไร เพื่อที่ว่าจะได้จัดการให้ถูกต้องตามแต่ละเงื่อนไข ซึ่งคลาส Direction ก็จะมีคำสั่ง getStatus() ไว้ให้ดึงมาตรวจสอบอยู่แล้ว
@Override public void onDirectionSuccess(Direction direction) { String status = direction.getStatus(); // Do something }
สำหรับเงื่อนไขทั้งหมดก็จะอยู่ในคลาส RequestResult ซึ่งมีทั้งหมดดังนี้
RequestResult.OK RequestResult.NOT_FOUND RequestResult.ZERO_RESULTS RequestResult.MAX_WAYPOINTS_EXCEEDED RequestResult.INVALID_REQUEST RequestResult.OVER_QUERY_LIMIT RequestResult.REQUEST_DENIED RequestResult.UNKNOWN_ERROR
OK ข้อมูลถูกต้อง มีเส้นทางที่ต้องการ ผ่านฉลุย ลุยต่อได้เลย
NOT_FOUND ตำแหน่งพิกัดที่ระบุไม่ถูกต้อง
ZERO_RESULTS ไม่มีเส้นทางที่ต้องการค้นหา
MAX_WAYPOINTS_EXCEEDED กำหนด Waypoints มากเกินกำหนด ซึ่งใน Library นี้จะไม่มีปัญหานี้ เพราะว่าตอนนี้ยังไม่ได้เพิ่มคำสั่งให้กำหนด Waypoints ได้
INVALID_REQUEST กำหนด Parameter ในการค้นหาเส้นทางไม่ถูกต้อง ซึ่งใน Library นี้จะไม่มีปัญหานี้เช่นกัน
OVER_QUERY_LIMIT ใช้งาน Google Maps Direction API เกินโควต้า ซึ่งการใช้งานฟรีจะให้อยู่ที่ 2,500 Request ต่อวันเท่านั้น สามารถกำหนดใน Google Developer Console เพื่อจ่ายเงินสำหรับ Request ที่เกินโควต้าได้
REQUEST_DENIED ถูกยกเลิกข้อมูล อาจจะเพราะกำหนด API Key ผิด
UNKNOWN_ERROR เป็นข้อผิดพลาดที่ไม่สามารถระบุได้ ให้ลองเรียกใช้งานคำสั่งใหม่อีกครั้ง
ซึ่ง Status ที่ส่งมาให้นั้นเป็น String จึงสามารถเทียบกับแต่ละเงื่อนไขได้เลย
@Override public void onDirectionSuccess(Direction direction) { String status = direction.getStatus(); if(status.equals(RequestResult.OK)) { // Do something } else if(status.equals(RequestResult.NOT_FOUND)) { // Do something } }
หรืออยากจะเปรียบเทียบง่ายๆว่าข้อมูลสำเร็จมั้ยก็มีคำสั่ง isOK ให้ใช้เลยนะ
@Override public void onDirectionSuccess(Direction direction) { if(direction.isOK()) { // Do something } }
Route
เส้นทางทั้งหมดจากต้นทางไปจนถึงปลายทาง ในกรณีที่มีเส้นทางที่สามารถเดินทางได้มากกว่าหนึ่งเส้นทางก็สามารถเลือกได้ แต่ตอนส่งข้อมูลไปที่ Google Maps Direction API ต้องกำหนดด้วยว่าขอข้อมูลเป็นแบบ Alternative Route
Waypoint
เนื่องจาก Google Maps Direction API นั้นสามารถกำหนดเส้นทางแบบต่อเนื่องได้ เช่น เดินทางจากบ้านไปร้านอาหาร แล้วเดินทางไปที่ทำงานต่อ จากเส้นทางตั้งแต่ต้นทางไปถึงปลายทาง ตำแหน่งระหว่างทางจะเรียกว่า Waypoint นั่นเอง
ซึ่งใน Library ตัวนี้ยังไม่สามารถกำหนด Waypoint ได้ ดังนั้นข้อมูลที่ได้จึงข้ามเรื่องนี้ไปได้เลยจ้า (ไว้อัพเดทเพิ่มเข้ามาให้)
Leg
เป็นคำที่ Google Maps Direction API ใช้เรียกเส้นทางจากจุดหนึ่งไปถึงอีกจุดหนึ่ง ในกรณีที่มี Waypoint ด้วย ก็จะมี Leg มากกว่าหนึ่งเช่นกัน
แต่เพราะ Library นี้ไม่มี Waypoint เพราะงั้น Leg ก็จะเหลือแค่อันเดียวนะ
Step
เป็นขั้นตอนการเดินทาง เพราะในการนำทางก็จะต้องมีบอกว่าเดินทางไปทางไหน เลี้ยวตรงไหน นั่นล่ะเค้าเรียกว่า Step ซึ่งในหนึ่งเส้นทางก็อาจจะประกอบไปด้วยหลายๆ Step ขึ้นอยู่กับว่าเส้นทางในการเดินทางนั้นซับซ้อนแค่ไหน
จากภาพตัวอย่างข้างต้นจะเห็นว่ามีทั้งหมด 7 Step
การดึงข้อมูลเส้นทาง
ข้อมูลเส้นทางที่ส่งมาทุกครั้ง ถ้ามีสถานะเป็น OK ก็จะมีข้อมูล Route อย่างน้อย 1 ชุด (ถ้ากำหนดเป็น Alternative Route ก็อาจจะได้ Route มากกว่า 1 ชุด) โดย Route จะอยู่ในรูปของ Array
ซึ่งใน Route 1 ชุดก็จะมี Leg 1 ชุด (เพราะ Library นี้ยังกำหนด Waypoint ไม่ได้) ถึงแม้ว่า Leg จะมีแค่ 1 ชุด แต่ก็อยู่ในรูป Array นะ
และใน Leg 1 ชุดก็จะมี Step อย่างน้อยหนึ่งชุด ยิ่งเส้นทางซับซ้อนมากเท่าไรก็ยิ่งเยอะมากเท่านั้น
ถ้าต้องการดึง Route มาใช้งาน สมมติว่ามี Route แค่ตัวเดียวก็จะใช้คำสั่งแบบนี้
Route route = direction.getRouteList().get(0);
และถ้าต้องการดึง Leg ที่อยู่ใน Route ก็จะคล้ายๆกันเลย
Route route = direction.getRouteList().get(0); Leg leg = route.getLegList().get(0);
เนื่องจาก Step มักจะมีมากกว่า 1 ตัว ดังนั้นก็ให้ดึงมาทั้ง List ซะ
Route route = direction.getRouteList().get(0); Leg leg = route.getLegList().get(0); List<stepList> stepList = leg.getStepList();
ซึ่งในแต่ละ Step ก็จะมีพิกัดเริ่มต้นและปลายทางของ Step นั้นๆที่สามารถดึงออกมาเป็นคลาส LatLng ที่ใช้ใน Google Maps ได้เลย
LatLng start = step.getStartLocation().getCoordination(); LatLng end = step.getEndLocation().getCoordination();
แต่เพื่อให้ง่ายขึ้น เจ้าของบล็อกจึงทำให้มันสามารถดึงค่าจาก Leg ออกมาเป็น LatLng Array ได้เลย จะได้ไม่ต้องไปใช้ For วนดึงค่าทีละตัว
ArrayList<LatLng> pointList = leg.getDirectionPoint();
และพิเศษสุดสำหรับการเดินทางแบบ Transit ก็จะพบว่า Step นั้นสามารถมี Step อยู่ซ้อนข้างในอีกชั้นได้
เพราะว่าการเดินทางแบบ Transit นั้นจะมี Walking ผสมอยู่ด้วย ดังนั้นจึงมีการบอก Step แยกให้สำหรับ Walking ด้วย ซึ่งก็คือ Step ที่ซ้อนอยู่ใน Step นั่นเอง
ซึ่งสามารถรู้ได้ว่า Step ไหนเป็นการเดินทางแบบไหนก็ให้ตรวขสอบ Travel Mode ของ Step นั้นๆ
String travelMode = step.getTravelMode();
แล้วก็เอาไปเปรียบกับค่าในคลาส TransportMode อีกที
ถ้าต้องการตำแหน่งของแต่ละ Step ก็สามารถดึง Section Point ออกมาจาก Leg เพื่อใช้งานได้เลย โดยส่งออกมาเป็น LatLng Array
ArrayList<LatLng> sectionList = leg.getSectionPoint();
ถ้าต้องการระยะทางหรือระยะเวลาในการเดินทางของเส้นทางทั้งหมดก็สามารถดึงข้อมูลได้จาก Leg เลย
Info distanceInfo = leg.getDistance(); Info durationInfo = leg.getDuration(); String distance = distanceInfo.getText(); String duration = durationInfo.getText();
แต่ถ้าอยากระยะทางหรือระยะเวลาในการเดินทางของแต่ละ Step ก็ให้ดึงข้อมูลจากแต่ละ Step ได้เลย
Info distanceInfo = step.getDistance(); Info durationInfo = step.getDuration(); String distance = distanceInfo.getText(); String duration = durationInfo.getText();
ถ้าอยากรู้ว่าต้องเดินทางไปทิศทางไหนก็ให้ดึงข้อมูลจาก Maneuver ที่อยู่ในแต่ละ Step แล้วเอาไปเปรียบเทียบกับค่าที่อยู่ในคลาส Maneuver อีกที หรือถ้าต้องการเป็นข้อความที่ใช้แสดงให้ผู้ใช้เห็นเลย สามารถดึงจาก HTML instruction ได้เลย
String maneuver = step.getManeuver(); String instruction = step.getHtmlInstruction();
แต่ว่า Instruction อยู่ในรูป HTML นะ ถ้าเอาไปแสดงก็อย่าลืม Format ให้เป็น HTML ด้วยนะ
อยากจะเอา Step ทั้งหมดไปแสดงบน Google Maps
สำหรับการวาดเส้นทางบน Google Maps จะต้องวาดเป็น Polyline โดยอยู่ในรูปของคลาส PolylineOptions ซึ่งใน Library ตัวนี้สามารถดึง LatLng Array แล้วแปลงเป็น PolylineOptions ได้ทันที เพราะมีคลาส DirectionConverter ให้ใช้งานแล้ว
ArrayList<LatLng> directionPositionList = leg.getDirectionPoint(); PolylineOptions polylineOptions = DirectionConverter.createPolyline(this, directionPositionList, 5, Color.RED); googleMap.addPolyline(polylineOptions);
โดย 5 คือขนาดของเส้นในหน่วย DP และ Color.RED คือกำหนดเส้นเป็นสีแดง
จากตัวอย่างข้างต้นก็จะได้เส้นทางออกมาเป็นแบบนี้
แต่ถ้าการเดินทางเป็นแบบ Transit จะแตกต่างจากปกติเสียหน่อย เพราะมันผสมระหว่าง Transit กับ Walking ซึ่งคงไม่เหมาะซักเท่าไรถ้าแสดงเส้นทางเป็นเส้นแบบเดียวกันหมดเลย ดังนั้นจึงมีขั้นตอนเพิ่มเติมนิดหน่อยสำหรับการเดินทางแบบ Transit ครับ
การเดินทางแบบ Transit ให้ดึงค่า Step List ออกมาแทน แล้วใช้คำสั่งจากในคลาส DirectionConverter เพื่อแปลงข้อมูลเส้นทางแบบ Transit ให้ออกมาเป็น PolylineOptions Array แล้วจึงนำไปแปะลงบน Google Maps
List<Step> stepList = direction.getRouteList().get(0).getLegList().get(0).getStepList(); ArrayList<PolylineOptions> polylineOptionList = DirectionConverter.createTransitPolyline(this, stepList, 5, Color.RED, 3, Color.BLUE); for (PolylineOptions polylineOption : polylineOptionList) { googleMap.addPolyline(polylineOption); }
สำหรับคำสั่ง createTransitPolyline นั้นจะสามารถกำหนดเส้นทางของ Transit กับ Walking แยกกันได้ จากในตัวอย่างจะกำหนดให้เส้นทาง Transit มีขนาด 5dp เป็นสีแดง ส่วนเส้นทาง Walking มีขนาด 3dp เป็นสีน้ำเงิน
ในแต่ละ Step ของการเดินทางแบบ Transit จะสามารถดึงข้อมูลรายละเอียดของรถโดยสารนั้นๆเพิ่มเติมได้ โดยจะอยู่ในรูปของคลาส TransitDetail
TransitDetail transitDetail = step.getTransitDetail();
ซึ่งภายในคลาส TransitDetail ก็จะประกอบข้อมูลต่างๆไม่ว่าจะเป็นตำแหน่งที่ขึ้น/ลงรถโดยสาร ช่วงเวลาที่รถโดยสารมาถึงและถึงจุดหมาย และมีรายละเอียดเกี่ยวกับรถโดยสารนั้นๆเพื่อนำมาแสดงผลภายในแอพอีกด้วย โดยจะอยู่ในคลาส Line
StopPoint arrivalStopPoint = transitDetail.getArrivalStopPoint(); StopPoint departureStopPoint = transitDetail.getDepartureStopPoint(); TimeInfo arriveTimeInfo = transitDetail.getArrivalTime(); TimeInfo departureTimeInfo = transitDetail.getDepartureTime(); String headSign = transitDetail.getHeadsign(); String stopNumber = transitDetail.getStopNumber(); Line transitLine = transitDetail.getLine();
มีอะไรใหม่ในเวอร์ชัน 1.0.5
เจ้าของบล็อกได้อัปเดตไลบรารีตัวนี้เป็นเวอร์ชัน 1.0.5 แล้ว ซึ่งมีการแก้บั๊กและเพิ่มคลาส GoogleDirectionConfiguration เข้าไปเพื่อให้สามารถตั้งค่าบางอย่างสำหรับไลบรารีได้
แสดง Log เมื่อมีเรียกดึงข้อมูลเส้นทาง
GoogleDirectionConfiguration.getInstance().setLogEnabled(true);
ถ้าไม่มีการกำหนดค่าในคำสั่งนี้ จะมีค่า Default เป็น False
ใช้ Custom OkHttpClient ของผู้ที่หลงเข้ามาอ่าน
เพื่อให้ผู้ที่หลงเข้ามาอ่านสามารถปรับเปลี่ยนการทำงานของ OkHttpClient ได้ตามใจชอบ
OkHttpClient client = .... GoogleDirectionConfiguration.getInstance().setCustomClient(client);
กำหนดค่าดังกล่าวเพียงแค่ครั้งเดียว ก่อนที่จะเรียกใช้คำสั่งดึงข้อมูลเส้นทาง
Demo
สามารถไปดาวน์โหลดลองดูกันก่อนได้ที่
Demo App for Google Direction Library [Play Store]
Source Code
ถ้าอยากลองศึกษา Source Code ของ Library ตัวนี้ก็เข้าไปส่องใน GitHub กันได้เลยจ้า
Google Direction Library [GitHub]