توفّر حزمة تطوير البرامج (SDK) للأماكن على Android (الإصدار القديم) لتطبيقك معلومات غنية عن الأماكن، بما في ذلك اسم المكان وعنوانه والموقع الجغرافي المحدّد كإحداثيات خطوط العرض/الطول ونوع المكان (مثل ملهى ليلي ومتجر حيوانات أليفة ومتحف) وغير ذلك. للوصول إلى هذه المعلومات لمكان معيّن، يمكنك استخدام رقم تعريف المكان، وهو معرّف ثابت يحدّد مكانًا بشكل فريد.
تفاصيل المكان
يوفّر الكائن Place معلومات عن مكان معيّن. يمكنك الحصول على عنصر
Place
من خلال استدعاء
PlacesClient.fetchPlace()
– راجِع دليل
الحصول على مكان باستخدام رقم التعريف.
عند طلب مكان، يجب تحديد بيانات المكان المطلوب عرضها. ولإجراء ذلك، عليك تمرير قائمة بقيم Place.Field تحدّد البيانات المطلوب عرضها. هذه القائمة مهمة لأنّها تؤثر في تكلفة كل طلب.
بما أنّ نتائج بيانات الأماكن لا يمكن أن تكون فارغة، يتم عرض نتائج الأماكن التي تتضمّن بيانات فقط. على سبيل المثال، إذا لم يتضمّن المكان المطلوب أي صور، لن يظهر الحقل photos في النتيجة.
يمرّر المثال التالي قائمة بثلاث قيم Place.Field لتحديد البيانات التي يعرضها الطلب:
Kotlin
// Specify the fields to return. val placeFields = listOf(Place.Field.DISPLAY_NAME, Place.Field.RATING)
جافا
// Specify the fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.DISPLAY_NAME, Place.Field.RATING);
الوصول إلى حقول بيانات عنصر "المكان"
بعد الحصول على الكائن Place، استخدِم طرق الكائن للوصول إلى حقول البيانات المحدّدة في الطلب. إذا لم يكن الحقل متوفّرًا في عنصر Place،
يعرض الإجراء المرتبط قيمة فارغة. في ما يلي أمثلة على بعض الطرق المتاحة.
-
getAddress(): عنوان المكان بتنسيق يمكن لشخص عادي قراءته -
getAddressComponents():Listلمكوّنات العنوان لهذا المكان يتم توفير هذه المكوّنات بغرض استخراج معلومات منظَّمة حول عنوان مكان معيّن، مثل العثور على المدينة التي يقع فيها المكان. لا تستخدم هذه المكوّنات لتنسيق العناوين، بل استخدِمgetAddress()الذي يوفّر عنوانًا منسّقًا ومترجمًا. -
getId(): المعرّف النصي للمكان يمكنك الاطّلاع على مزيد من المعلومات عن أرقام تعريف الأماكن في بقية هذه الصفحة. -
getLatLng(): الموقع الجغرافي للمكان، محدّدًا بإحداثيات خطوط العرض والطول -
getName(): اسم المكان
getOpeningHours():OpeningHoursالمكان يمكنك استدعاءOpeningHours.getWeekdayText()لعرض قائمة بالسلاسل التي تمثّل ساعات العمل لكل يوم من أيام الأسبوع. يمكنك استدعاءOpeningHours.getPeriods()لعرض قائمة بكائناتperiodمع معلومات أكثر تفصيلاً تعادل البيانات التي يوفّرهاgetWeekdayText().يحتوي عنصر
Placeأيضًا على طريقةgetCurrentOpeningHours()التي تعرض ساعات عمل المكان خلال الأيام السبعة التالية، وgetSecondaryOpeningHours()التي تعرض ساعات العمل الثانوية للمكان خلال الأيام السبعة التالية.isOpen(): قيمة منطقية تشير إلى ما إذا كان المكان مفتوحًا حاليًا إذا لم يتم تحديد وقت، يتم ضبط الوقت التلقائي على "الآن". لن يتم عرض السمةisOpenإلا إذا كانت السمتانPlace.Field.UTC_OFFSETوPlace.Field.OPENING_HOURSمتاحتَين. لضمان الحصول على نتائج دقيقة، اطلب الحقلَينPlace.Field.BUSINESS_STATUSوPlace.Field.UTC_OFFSETفي طلب المكان الأصلي. إذا لم يتم طلب ذلك، يُفترض أنّ المؤسسة تعمل. يمكنك مشاهدة هذا الفيديو لمعرفة كيفية استخدامisOpenمع تفاصيل المكان.
إليك بعض الأمثلة:
Kotlin
val name = place.displayName val address = place.formattedAddress val location = place.location
جافا
final CharSequence name = place.getDisplayName(); final CharSequence address = place.getFormattedAddress(); final LatLng location = place.getLocation();
الحصول على مكان حسب رقم التعريف
رقم تعريف المكان هو معرّف نصي يحدّد مكانًا بشكل فريد. في
"حزمة تطوير البرامج (SDK) للأماكن على Android"، يمكنك استرداد معرّف مكان من خلال طلب
Place.getId().
تعرض خدمة الإكمال التلقائي للأماكن أيضًا رقم تعريف المكان لكل مكان يتطابق مع طلب البحث والفلتر المقدَّمَين. يمكنك تخزين رقم تعريف المكان واستخدامه لاسترداد عنصر
Place
مرة أخرى لاحقًا.
للحصول على مكان باستخدام المعرّف، يمكنك استدعاء
PlacesClient.fetchPlace()،
وتمرير FetchPlaceRequest.
تعرض واجهة برمجة التطبيقات
FetchPlaceResponse
في
Task.
يحتوي
FetchPlaceResponse
على عنصر
Place
يطابق رقم تعريف المكان المقدَّم.
يوضّح مثال الرمز البرمجي التالي استدعاء fetchPlace() للحصول على تفاصيل المكان المحدّد.
Kotlin
// Define a Place ID. val placeId = PlaceIdProvider.getRandomPlaceId() // Specify the fields to return. val placeFields = listOf( Place.Field.ID, Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION, ) // Construct a request object, passing the place ID and fields array. val request = FetchPlaceRequest.newInstance(placeId, placeFields) placesClient.fetchPlace(request) .addOnSuccessListener { response: FetchPlaceResponse -> val place = response.place val name = place.displayName val address = place.formattedAddress val location = place.location binding.placeName.text = name binding.placeAddress.text = address if (location != null) { binding.placeLocation.text = getString( R.string.place_location, location.latitude, location.longitude, ) } else { binding.placeLocation.text = null } Log.i(TAG, "Place found: ${place.displayName}") }.addOnFailureListener { exception: Exception -> if (exception is ApiException) { val message = getString(R.string.place_not_found, exception.message) binding.placeName.text = message Log.e(TAG, "Place not found: ${exception.message}") val statusCode = exception.statusCode TODO("Handle error with given status code") } }
جافا
// Define a Place ID. final String placeId = PlaceIdProvider.getRandomPlaceId(); // Specify the fields to return. final List<Place.Field> placeFields = Arrays.asList( Place.Field.ID, Place.Field.DISPLAY_NAME, Place.Field.FORMATTED_ADDRESS, Place.Field.LOCATION); // Construct a request object, passing the place ID and fields array. final FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields); placesClient .fetchPlace(request) .addOnSuccessListener( (response) -> { Place place = response.getPlace(); final CharSequence name = place.getDisplayName(); final CharSequence address = place.getFormattedAddress(); final LatLng location = place.getLocation(); binding.placeName.setText(name); binding.placeAddress.setText(address); if (location != null) { binding.placeLocation.setText( getString( R.string.place_location, location.latitude, location.longitude)); } else { binding.placeLocation.setText(null); } Log.i(TAG, "Place found: " + place.getDisplayName()); }) .addOnFailureListener( (exception) -> { if (exception instanceof ApiException apiException) { final String message = getString( R.string.place_not_found, apiException.getMessage()); binding.placeName.setText(message); Log.e(TAG, "Place not found: " + exception.getMessage()); final int statusCode = apiException.getStatusCode(); // TODO: Handle error with given status code. } });
التعرُّف على حالة الفتح
يعرض الإجراء PlacesClient.isOpen(IsOpenRequest request) عنصر IsOpenResponse يشير إلى ما إذا كان المكان مفتوحًا حاليًا استنادًا إلى الوقت المحدّد في الطلب.
تتطلّب هذه الطريقة وسيطة واحدة من النوع IsOpenRequest تحتوي على ما يلي:
- عنصر
Placeأو سلسلة تحدّد رقم تعريف المكان - قيمة وقت اختيارية تحدّد الوقت بالملي ثانية من 1970-01-01T00:00:00Z. إذا لم يتم تحديد وقت، يتم ضبط الوقت التلقائي على "الآن".
تتطلّب هذه الطريقة توفّر الحقول التالية في عنصر Place:
Place.Field.BUSINESS_STATUSPlace.Field.CURRENT_OPENING_HOURSPlace.Field.OPENING_HOURSPlace.Field.UTC_OFFSET
إذا لم يتم توفير هذه الحقول في العنصر Place، أو إذا تم تمرير رقم تعريف مكان،
تستخدم الطريقة
PlacesClient.fetchPlace()
لجلبها. لمزيد من المعلومات حول إنشاء عنصر "المكان" باستخدام الحقول اللازمة، يُرجى الاطّلاع على تفاصيل المكان.
يحدّد المثال التالي ما إذا كان المكان مفتوحًا حاليًا. في هذا المثال، يتم تمرير رقم تعريف المكان فقط إلى isOpen():
Kotlin
val isOpenCalendar: Calendar = Calendar.getInstance() val placeId = PlaceIdProvider.getRandomPlaceId() val request: IsOpenRequest = try { IsOpenRequest.newInstance(placeId, isOpenCalendar.timeInMillis) } catch (e: IllegalArgumentException) { Log.e("PlaceIsOpen", "Error: " + e.message) return } val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(request) isOpenTask.addOnSuccessListener { response -> val isOpen = response.isOpen ?: false binding.isOpenByIdResult.text = getString(R.string.is_open_by_id, isOpen.toString()) Log.d("PlaceIsOpen", "Is open by ID: $isOpen") } // ...
جافا
@NonNull Calendar isOpenCalendar = Calendar.getInstance(); String placeId = PlaceIdProvider.getRandomPlaceId(); IsOpenRequest isOpenRequest; try { isOpenRequest = IsOpenRequest.newInstance(placeId, isOpenCalendar.getTimeInMillis()); } catch (IllegalArgumentException e) { Log.e("PlaceIsOpen", "Error: " + e.getMessage()); return; } Task<IsOpenResponse> placeTask = placesClient.isOpen(isOpenRequest); placeTask.addOnSuccessListener( (response) -> { final boolean isOpen = Boolean.TRUE.equals(response.isOpen()); binding.isOpenByIdResult.setText( getString(R.string.is_open_by_id, String.valueOf(isOpen))); Log.d("PlaceIsOpen", "Is open by ID: " + isOpen); }); placeTask.addOnFailureListener( (exception) -> { binding.isOpenByIdResult.setText( getString(R.string.is_open_by_id, "Error: " + exception.getMessage())); Log.e("PlaceIsOpen", "Error: " + exception.getMessage()); });
يوضّح المثال التالي استدعاء isOpen() حيث يتم تمرير عنصر Place.
يجب أن يحتوي عنصر Place على رقم تعريف مكان صالح:
Kotlin
val isOpenCalendar: Calendar = Calendar.getInstance() var place: Place val placeId = PlaceIdProvider.getRandomPlaceId() // Specify the required fields for an isOpen request. val placeFields: List<Place.Field> = listOf( Place.Field.BUSINESS_STATUS, Place.Field.CURRENT_OPENING_HOURS, Place.Field.ID, Place.Field.OPENING_HOURS, Place.Field.DISPLAY_NAME, ) val placeRequest: FetchPlaceRequest = FetchPlaceRequest.newInstance(placeId, placeFields) val placeTask: Task<FetchPlaceResponse> = placesClient.fetchPlace(placeRequest) placeTask.addOnSuccessListener { placeResponse -> place = placeResponse.place val isOpenRequest: IsOpenRequest = try { IsOpenRequest.newInstance(place, isOpenCalendar.timeInMillis) } catch (e: IllegalArgumentException) { Log.e("PlaceIsOpen", "Error: " + e.message) return@addOnSuccessListener } val isOpenTask: Task<IsOpenResponse> = placesClient.isOpen(isOpenRequest) isOpenTask.addOnSuccessListener { isOpenResponse -> val isOpen = when (isOpenResponse.isOpen) { true -> getString(R.string.is_open) else -> getString(R.string.is_closed) } binding.isOpenByObjectResult.text = getString( R.string.is_open_by_object, place.displayName, isOpen, ) Log.d("PlaceIsOpen", "Is open by object: $isOpen") } // ... } // ...
جافا
@NonNull Calendar isOpenCalendar = Calendar.getInstance(); String placeId = PlaceIdProvider.getRandomPlaceId(); // Specify the required fields for an isOpen request. List<Place.Field> placeFields = new ArrayList<>( Arrays.asList( Place.Field.BUSINESS_STATUS, Place.Field.CURRENT_OPENING_HOURS, Place.Field.ID, Place.Field.OPENING_HOURS, Place.Field.DISPLAY_NAME)); FetchPlaceRequest request = FetchPlaceRequest.newInstance(placeId, placeFields); Task<FetchPlaceResponse> placeTask = placesClient.fetchPlace(request); placeTask.addOnSuccessListener( (placeResponse) -> { Place place = placeResponse.getPlace(); IsOpenRequest isOpenRequest; try { isOpenRequest = IsOpenRequest.newInstance(place, isOpenCalendar.getTimeInMillis()); } catch (IllegalArgumentException e) { Log.e("PlaceIsOpen", "Error: " + e.getMessage()); return; } Task<IsOpenResponse> isOpenTask = placesClient.isOpen(isOpenRequest); isOpenTask.addOnSuccessListener( (isOpenResponse) -> { final boolean isOpen = Boolean.TRUE.equals(isOpenResponse.isOpen()); binding.isOpenByObjectResult.setText( getString( R.string.is_open_by_object, place.getDisplayName(), String.valueOf(isOpen))); Log.d("PlaceIsOpen", "Is open by object: " + isOpen); }); isOpenTask.addOnFailureListener( (exception) -> { // also update the result text field binding.isOpenByObjectResult.setText( getString( R.string.is_open_by_object, place.getDisplayName(), "Error: " + exception.getMessage())); Log.e("PlaceIsOpen", "Error: " + exception.getMessage()); }); }); placeTask.addOnFailureListener( (exception) -> { binding.isOpenByObjectResult.setText("Error: " + exception.getMessage()); Log.e("PlaceIsOpen", "Error: " + exception.getMessage());
عرض معلومات تحديد المصدر في تطبيقك
عندما يعرض تطبيقك معلومات عن الأماكن، بما في ذلك مراجعات الأماكن، يجب أن يعرض التطبيق أيضًا أي معلومات منسوبة. لمزيد من المعلومات، راجِع المصادر.
مزيد من المعلومات عن أرقام تعريف الأماكن
رقم تعريف المكان المستخدَم في "حزمة تطوير البرامج بالاستناد إلى الموقع الجغرافي لنظام التشغيل Android (الإصدار القديم)" هو المعرّف نفسه المستخدَم في Places API (الإصدار القديم). يمكن أن يشير كل رقم تعريف مكان إلى مكان واحد فقط، ولكن يمكن أن يكون لمكان واحد أكثر من رقم تعريف مكان واحد. هناك ظروف أخرى قد تؤدي إلى حصول مكان على رقم تعريف مكان جديد. على سبيل المثال، قد يحدث ذلك إذا انتقلت مؤسسة إلى موقع جغرافي جديد.
عند طلب مكان من خلال تحديد رقم تعريف المكان، يمكنك التأكّد من أنّك ستتلقّى دائمًا المكان نفسه في الردّ (إذا كان المكان لا يزال موجودًا). ومع ذلك، يُرجى العِلم أنّ الردّ قد يحتوي على رقم تعريف مكان مختلف عن الرقم الوارد في طلبك.
لمزيد من المعلومات، يُرجى الاطّلاع على نظرة عامة على رقم تعريف المكان.