অ্যান্ড্রয়েডের জন্য প্লেসেস এসডিকে (লেগ্যাসি) আপনার অ্যাপকে স্থান সম্পর্কে সমৃদ্ধ তথ্য প্রদান করে, যার মধ্যে রয়েছে স্থানের নাম ও ঠিকানা, অক্ষাংশ/দ্রাঘিমাংশ স্থানাঙ্ক হিসাবে নির্দিষ্ট ভৌগোলিক অবস্থান, স্থানের ধরন (যেমন নাইট ক্লাব, পোষা প্রাণীর দোকান, জাদুঘর) এবং আরও অনেক কিছু। কোনো নির্দিষ্ট স্থানের এই তথ্য অ্যাক্সেস করার জন্য, আপনি প্লেস আইডি ব্যবহার করতে পারেন, যা একটি স্থিতিশীল শনাক্তকারী এবং একটি স্থানকে অনন্যভাবে চিহ্নিত করে।
স্থানের বিবরণ
Place অবজেক্টটি একটি নির্দিষ্ট স্থান সম্পর্কে তথ্য প্রদান করে। আপনি PlacesClient.fetchPlace() কল করে একটি Place অবজেক্ট পেতে পারেন – আইডি দ্বারা স্থান পাওয়ার নির্দেশিকাটি দেখুন।
যখন আপনি কোনো স্থানের জন্য অনুরোধ করেন, তখন আপনাকে অবশ্যই নির্দিষ্ট করে দিতে হবে কোন স্থানের ডেটা ফেরত দেওয়া হবে। এটি করার জন্য, ফেরতযোগ্য ডেটা নির্দিষ্ট করে Place.Field ভ্যালুগুলোর একটি তালিকা পাস করুন। এই তালিকাটি একটি গুরুত্বপূর্ণ বিবেচ্য বিষয়, কারণ এটি প্রতিটি অনুরোধের খরচকে প্রভাবিত করে।
যেহেতু স্থানের ডেটার ফলাফল খালি হতে পারে না, তাই শুধুমাত্র ডেটাসহ স্থানের ফলাফলগুলোই ফেরত দেওয়া হয়। উদাহরণস্বরূপ, যদি অনুরোধ করা কোনো স্থানের ছবি না থাকে, তাহলে ফলাফলে photos ফিল্ডটি উপস্থিত থাকবে না।
নিম্নলিখিত উদাহরণটি একটি অনুরোধের মাধ্যমে ফেরত আসা ডেটা নির্দিষ্ট করার জন্য তিনটি Place.Field মানের একটি তালিকা প্রেরণ করে:
কোটলিন
// 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 অবজেক্টে ফিল্ডটি অনুপস্থিত থাকে, তবে সংশ্লিষ্ট মেথডটি null রিটার্ন করে। নিচে উপলব্ধ কয়েকটি মেথডের উদাহরণ দেখানো হলো।
-
getAddress()– স্থানটির ঠিকানা, সহজে পাঠযোগ্য বিন্যাসে। -
getAddressComponents()– এই স্থানের ঠিকানার উপাদানগুলোর একটিList। এই উপাদানগুলো কোনো স্থানের ঠিকানা সম্পর্কে কাঠামোগত তথ্য বের করার উদ্দেশ্যে প্রদান করা হয়, যেমন—স্থানটি কোন শহরে অবস্থিত তা খুঁজে বের করা। ঠিকানা ফরম্যাট করার জন্য এই উপাদানগুলো ব্যবহার করবেন না; এর পরিবর্তেgetAddress()কল করুন, যা একটি স্থানীয় ফরম্যাটের ঠিকানা প্রদান করে। -
getId()– স্থানটির লিখিত শনাক্তকারী। এই পৃষ্ঠার বাকি অংশে স্থান আইডি সম্পর্কে আরও পড়ুন। -
getLatLng()– স্থানটির ভৌগোলিক অবস্থান, যা অক্ষাংশ এবং দ্রাঘিমাংশ স্থানাঙ্ক হিসাবে নির্দিষ্ট করা হয়। -
getName()– স্থানটির নাম। getOpeningHours()– স্থানটিরOpeningHours। সপ্তাহের প্রতিটি দিনের খোলার এবং বন্ধের সময় নির্দেশকারী স্ট্রিংগুলির একটি তালিকা ফেরত পেতেOpeningHours.getWeekdayText()কল করুন।getWeekdayText()দ্বারা প্রদত্ত ডেটার সমতুল্য আরও বিস্তারিত তথ্যসহperiodঅবজেক্টের একটি তালিকা ফেরত পেতেOpeningHours.getPeriods()কল করুন।Placeঅবজেক্টটিতেgetCurrentOpeningHours()মেথডও রয়েছে, যা পরবর্তী সাত দিনের জন্য কোনো স্থানের কার্যক্রমের সময়সূচী রিটার্ন করে, এবংgetSecondaryOpeningHours(), যা পরবর্তী সাত দিনের জন্য কোনো স্থানের দ্বিতীয় পর্যায়ের কার্যক্রমের সময়সূচী রিটার্ন করে।isOpen()– একটি বুলিয়ান যা নির্দেশ করে স্থানটি বর্তমানে খোলা আছে কিনা। যদি কোনো সময় নির্দিষ্ট না করা হয়, তবে ডিফল্ট মান হলো 'এখন'।isOpenশুধুমাত্র তখনই রিটার্ন করা হবে যখনPlace.Field.UTC_OFFSETএবংPlace.Field.OPENING_HOURSউভয়ই উপলব্ধ থাকবে। সঠিক ফলাফল নিশ্চিত করতে, আপনার মূল প্লেস রিকোয়েস্টেPlace.Field.BUSINESS_STATUSএবংPlace.Field.UTC_OFFSETফিল্ডগুলোর জন্য অনুরোধ করুন। যদি অনুরোধ করা না হয়, তবে ধরে নেওয়া হয় যে ব্যবসাটি চালু আছে। প্লেস ডিটেইলসের সাথেisOpenকীভাবে ব্যবহার করতে হয় তা জানতে এই ভিডিওটি দেখুন।
কিছু উদাহরণ:
কোটলিন
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();
পরিচয়পত্র দিয়ে জায়গা নিন
প্লেস আইডি হলো একটি টেক্সচুয়াল আইডেন্টিফায়ার যা একটি স্থানকে অনন্যভাবে শনাক্ত করে। অ্যান্ড্রয়েডের জন্য প্লেসেস এসডিকে-তে, আপনি Place.getId() কল করে একটি স্থানের আইডি পেতে পারেন। প্লেস অটোকমপ্লিট সার্ভিসটিও প্রদত্ত সার্চ কোয়েরি এবং ফিল্টারের সাথে মিলে যাওয়া প্রতিটি স্থানের জন্য একটি প্লেস আইডি রিটার্ন করে। আপনি প্লেস আইডিটি সংরক্ষণ করে রাখতে পারেন এবং পরবর্তীতে Place অবজেক্টটি পুনরায় পেতে এটি ব্যবহার করতে পারেন।
আইডি দ্বারা কোনো স্থান পেতে, একটি FetchPlaceRequest পাস করে PlacesClient.fetchPlace() কল করুন।
এপিআইটি একটি Task মধ্যে একটি FetchPlaceResponse রিটার্ন করে। FetchPlaceResponse টিতে প্রদত্ত প্লেস আইডির সাথে মিলে যাওয়া একটি Place অবজেক্ট থাকে।
নিম্নলিখিত কোড উদাহরণটি নির্দিষ্ট স্থানের বিবরণ পেতে fetchPlace() কল করা দেখাচ্ছে।
কোটলিন
// 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_STATUS -
Place.Field.CURRENT_OPENING_HOURS -
Place.Field.OPENING_HOURS -
Place.Field.UTC_OFFSET
যদি Place অবজেক্টে এই ফিল্ডগুলি প্রদান করা না থাকে, অথবা আপনি যদি একটি প্লেস আইডি পাস করেন, তাহলে মেথডটি সেগুলি ফেচ করার জন্য PlacesClient.fetchPlace() ব্যবহার করে। প্রয়োজনীয় ফিল্ড সহ Place অবজেক্ট তৈরি করার বিষয়ে আরও তথ্যের জন্য, Place details দেখুন।
নিম্নলিখিত উদাহরণটি নির্ধারণ করে যে কোনও স্থান বর্তমানে খোলা আছে কিনা। এই উদাহরণে, আপনি isOpen() ফাংশনে শুধুমাত্র স্থানের আইডি পাস করবেন:
কোটলিন
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 অবজেক্টটিতে অবশ্যই একটি বৈধ প্লেস আইডি থাকতে হবে:
কোটলিন
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());
আপনার অ্যাপে অ্যাট্রিবিউশন প্রদর্শন করুন
আপনার অ্যাপ যখন কোনো স্থানের তথ্য, যেমন সেই স্থানের রিভিউ, প্রদর্শন করে, তখন অ্যাপটিকে অবশ্যই সেই স্থানের উৎস উল্লেখও (অ্যাট্রিবিউশন) দেখাতে হবে। আরও তথ্যের জন্য, উৎস উল্লেখ (অ্যাট্রিবিউশন) দেখুন।
স্থান আইডি সম্পর্কে আরও তথ্য
অ্যান্ড্রয়েডের জন্য প্লেসেস এসডিকে (লেগ্যাসি)-তে ব্যবহৃত প্লেস আইডি , প্লেসেস এপিআই (লেগ্যাসি) -তে ব্যবহৃত আইডেন্টিফায়ারের মতোই। প্রতিটি প্লেস আইডি শুধুমাত্র একটি স্থানকে নির্দেশ করতে পারে, কিন্তু একটি স্থানের একাধিক প্লেস আইডি থাকতে পারে। আরও কিছু পরিস্থিতি রয়েছে যার কারণে একটি স্থান নতুন প্লেস আইডি পেতে পারে। উদাহরণস্বরূপ, কোনো ব্যবসা নতুন স্থানে স্থানান্তরিত হলে এমনটা হতে পারে।
যখন আপনি একটি প্লেস আইডি উল্লেখ করে কোনো স্থানের জন্য অনুরোধ করেন, তখন আপনি নিশ্চিত থাকতে পারেন যে উত্তরে আপনি সর্বদা একই স্থানটি পাবেন (যদি স্থানটি তখনও বিদ্যমান থাকে)। তবে মনে রাখবেন, উত্তরে এমন একটি প্লেস আইডি থাকতে পারে যা আপনার অনুরোধের আইডি থেকে ভিন্ন।
আরও তথ্যের জন্য, স্থান আইডি সংক্ষিপ্ত বিবরণ দেখুন।