জায়গার বিবরণ (লিগ্যাসি)

ইউরোপীয় অর্থনৈতিক অঞ্চল (EEA)-এর ডেভেলপার

Places SDK for Android (Legacy) আপনার অ্যাপকে জায়গা সম্পর্কে বিস্তারিত তথ্য প্রদান করে, যার মধ্যে রয়েছে জায়গার নাম ও ঠিকানা, অক্ষাংশ/দ্রাঘিমাংশ স্থানাঙ্ক হিসেবে নির্দিষ্ট করা ভৌগোলিক লোকেশন, জায়গার ধরন (যেমন নাইট ক্লাব, পোষ্য প্রাণীর দোকান, মিউজিয়াম) এবং আরও অনেক কিছু। কোনও নির্দিষ্ট জায়গার জন্য এই তথ্য অ্যাক্সেস করতে, আপনি প্লেস আইডি ব্যবহার করতে পারেন, এটি একটি স্থায়ী শনাক্তকারী যা কোনও জায়গাকে অনন্যভাবে শনাক্ত করে।

স্থানের বিবরণ

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)

Java

// Specify the fields to return.
final List<Place.Field> placeFields = Arrays.asList(Place.Field.DISPLAY_NAME, Place.Field.RATING);
  

Place অবজেক্ট ডেটা ফিল্ড অ্যাক্সেস করা

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

      

Java

    final CharSequence name = place.getDisplayName();
    final CharSequence address = place.getFormattedAddress();
    final LatLng location = place.getLocation();

      

আইডি দিয়ে কোনও জায়গা সম্পর্কে তথ্য পাওয়া

প্লেস আইডি হল একটি টেক্সচুয়াল শনাক্তকারী যা কোনও জায়গাকে অনন্যভাবে শনাক্ত করে। Android-এর জন্য Places SDK-তে, আপনি Place.getId() কল করে কোনও জায়গার আইডি ফিরিয়ে আনতে পারবেন। এছাড়াও, প্লেস অটোকমপ্লিট পরিষেবা সরবরাহ করা সার্চ কোয়েরি ও ফিল্টারের সাথে ম্যাচ করা প্রতিটি জায়গার জন্য একটি প্লেস আইডি রিটার্ন করে। আপনি প্লেস আইডি স্টোর করতে এবং পরে আবার Place অবজেক্ট ফিরিয়ে আনতে এটি ব্যবহার করতে পারবেন।

আইডি দিয়ে কোনও জায়গা পেতে, কল করুন PlacesClient.fetchPlace(), FetchPlaceRequest পাস করান।

API একটি 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")
        }
    }

      

Java

// 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 অবজেক্ট তৈরি করা সম্পর্কে আরও জানতে, জায়গার বিবরণ দেখুন।

নিচের উদাহরণ থেকে বোঝা যাবে যে কোনও জায়গা বর্তমানে খোলা আছে কিনা। এই উদাহরণে, আপনি শুধুমাত্র 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")
}
// ...

      

Java

@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")
    }
    // ...
}
// ...

      

Java

@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 (Legacy)-এর জন্য Places SDK-তে ব্যবহৃত প্লেস আইডি হল সেই একই শনাক্তকারী যা Places API (Legacy)-তে ব্যবহার করা হয়। প্রতিটি প্লেস আইডি শুধুমাত্র একটি জায়গাকেই বোঝাতে পারে, তবে একটি জায়গার একাধিক প্লেস আইডি থাকতে পারে। অন্যান্য কারণেও কোনও জায়গার নতুন প্লেস আইডি হতে পারে। যেমন, কোনও ব্যবসা নতুন ঠিকানায় চলে গেলে এটি হতে পারে।

আপনি কোনও জায়গার আইডি উল্লেখ করে সেই জায়গা সম্পর্কে অনুরোধ করলে, আপনি নিশ্চিত থাকতে পারেন যে আপনি উত্তরে সবসময় একই জায়গা পাবেন (যদি জায়গাটি এখনও থাকে)। তবে, মনে রাখবেন যে উত্তরে এমন একটি স্থান আইডি থাকতে পারে যা আপনার অনুরোধের থেকে আলাদা।

আরও তথ্যের জন্য, প্লেস আইডি ওভারভিউ দেখুন।