geofences তৈরি এবং নিরীক্ষণ

জিওফেন্সিং ব্যবহারকারীর বর্তমান অবস্থান সম্পর্কে সচেতনতা এবং আগ্রহের হতে পারে এমন অবস্থানগুলির সাথে ব্যবহারকারীর নৈকট্য সম্পর্কে সচেতনতাকে একত্রিত করে৷ আগ্রহের একটি অবস্থান চিহ্নিত করতে, আপনি এর অক্ষাংশ এবং দ্রাঘিমাংশ নির্দিষ্ট করুন৷ অবস্থানের জন্য প্রক্সিমিটি সামঞ্জস্য করতে, আপনি একটি ব্যাসার্ধ যোগ করুন। অক্ষাংশ, দ্রাঘিমাংশ, এবং ব্যাসার্ধ একটি জিওফেন্সকে সংজ্ঞায়িত করে, আগ্রহের অবস্থানের চারপাশে একটি বৃত্তাকার এলাকা বা বেড়া তৈরি করে।

আপনার একাধিক সক্রিয় জিওফেন্স থাকতে পারে, প্রতি ডিভাইস ব্যবহারকারী প্রতি অ্যাপের 100 সীমা সহ। প্রতিটি জিওফেন্সের জন্য, আপনি অবস্থান পরিষেবাগুলিকে আপনাকে প্রবেশদ্বার এবং প্রস্থান ইভেন্টগুলি পাঠাতে বলতে পারেন, অথবা আপনি একটি ইভেন্ট ট্রিগার করার আগে জিওফেন্স এলাকায় অপেক্ষা করার বা থাকার জন্য একটি সময়কাল নির্দিষ্ট করতে পারেন৷ আপনি মিলিসেকেন্ডে মেয়াদ শেষ হওয়ার সময়কাল উল্লেখ করে যেকোন জিওফেন্সের সময়কাল সীমাবদ্ধ করতে পারেন। জিওফেন্সের মেয়াদ শেষ হওয়ার পরে, অবস্থান পরিষেবাগুলি স্বয়ংক্রিয়ভাবে এটিকে সরিয়ে দেয়।

এই পাঠটি আপনাকে দেখায় কিভাবে জিওফেন্স যোগ এবং অপসারণ করতে হয় এবং তারপর একটি BroadcastReceiver ব্যবহার করে জিওফেন্স ট্রানজিশন শুনতে হয়।

দ্রষ্টব্য: Wear ডিভাইসে, Geofencing APIs ক্ষমতার দক্ষ ব্যবহার করে না। আমরা Wear-এ এই APIগুলি সুপারিশ করি না। আরও তথ্যের জন্য শক্তি এবং ব্যাটারি সংরক্ষণ পড়ুন।

জিওফেন্স পর্যবেক্ষণের জন্য সেট আপ করুন

জিওফেন্স পর্যবেক্ষণের অনুরোধ করার প্রথম ধাপ হল প্রয়োজনীয় অনুমতির অনুরোধ করা। জিওফেন্সিং ব্যবহার করতে, আপনার অ্যাপকে অবশ্যই নিম্নলিখিত অনুরোধ করতে হবে:

আরও জানতে, অবস্থানের অনুমতির জন্য কীভাবে অনুরোধ করবেন তার নির্দেশিকা দেখুন।

আপনি যদি জিওফেন্স ট্রানজিশন শুনতে একটি BroadcastReceiver ব্যবহার করতে চান, তাহলে পরিষেবার নাম উল্লেখ করে একটি উপাদান যোগ করুন। এই উপাদানটি অবশ্যই <application> উপাদানের একটি শিশু হতে হবে:

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

অবস্থান API অ্যাক্সেস করতে, আপনাকে জিওফেনিং ক্লায়েন্টের একটি উদাহরণ তৈরি করতে হবে। আপনার ক্লায়েন্টকে কীভাবে সংযুক্ত করবেন তা শিখতে:

কোটলিন

lateinit var geofencingClient: GeofencingClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this)
}

জাভা

private GeofencingClient geofencingClient;

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this);
}

জিওফেন্স তৈরি করুন এবং যোগ করুন

আপনার অ্যাপটিকে জিওফেনস অবজেক্ট তৈরি করার জন্য অবস্থান API এর বিল্ডার ক্লাস এবং সেগুলি যোগ করার সুবিধার ক্লাস ব্যবহার করে জিওফেন্স তৈরি এবং যোগ করতে হবে। এছাড়াও, জিওফেন্স ট্রানজিশন ঘটলে অবস্থান পরিষেবাগুলি থেকে পাঠানো উদ্দেশ্যগুলি পরিচালনা করতে, আপনি এই বিভাগে দেখানো হিসাবে একটি PendingIntent সংজ্ঞায়িত করতে পারেন।

দ্রষ্টব্য: একক-ব্যবহারকারী ডিভাইসে, প্রতি অ্যাপে 100টি জিওফেন্সের সীমা রয়েছে। মাল্টি-ইউজার ডিভাইসের জন্য, প্রতি ডিভাইস ব্যবহারকারী প্রতি অ্যাপ প্রতি ১০০ জিওফেন্সের সীমা।

জিওফেন্স অবজেক্ট তৈরি করুন

প্রথমে, একটি জিওফেন্স তৈরি করতে Geofence.Builder ব্যবহার করুন, জিওফেন্সের জন্য পছন্দসই ব্যাসার্ধ, সময়কাল এবং পরিবর্তনের ধরন সেট করুন। উদাহরণস্বরূপ, একটি তালিকা অবজেক্ট পপুলেট করতে:

কোটলিন

geofenceList.add(Geofence.Builder()
        // Set the request ID of the geofence. This is a string to identify this
        // geofence.
        .setRequestId(entry.key)

        // Set the circular region of this geofence.
        .setCircularRegion(
                entry.value.latitude,
                entry.value.longitude,
                Constants.GEOFENCE_RADIUS_IN_METERS
        )

        // Set the expiration duration of the geofence. This geofence gets automatically
        // removed after this period of time.
        .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)

        // Set the transition types of interest. Alerts are only generated for these
        // transition. We track entry and exit transitions in this sample.
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)

        // Create the geofence.
        .build())

জাভা

geofenceList.add(new Geofence.Builder()
    // Set the request ID of the geofence. This is a string to identify this
    // geofence.
    .setRequestId(entry.getKey())

    .setCircularRegion(
            entry.getValue().latitude,
            entry.getValue().longitude,
            Constants.GEOFENCE_RADIUS_IN_METERS
    )
    .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
            Geofence.GEOFENCE_TRANSITION_EXIT)
    .build());

এই উদাহরণটি একটি ধ্রুবক ফাইল থেকে ডেটা টেনে আনে। প্রকৃত অনুশীলনে, অ্যাপগুলি ব্যবহারকারীর অবস্থানের উপর ভিত্তি করে গতিশীলভাবে জিওফেন্স তৈরি করতে পারে।

জিওফেন্স এবং প্রাথমিক ট্রিগার নির্দিষ্ট করুন

নিম্নোক্ত স্নিপেটটি GeofencingRequest ক্লাস এবং এর নেস্টেড GeofencingRequestBuilder ক্লাস ব্যবহার করে জিওফেন্সগুলিকে নিরীক্ষণ করতে এবং কীভাবে সম্পর্কিত জিওফেন্স ইভেন্টগুলি ট্রিগার করা হয় তা সেট করতে:

কোটলিন

private fun getGeofencingRequest(): GeofencingRequest {
    return GeofencingRequest.Builder().apply {
        setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
        addGeofences(geofenceList)
    }.build()
}

জাভা

private GeofencingRequest getGeofencingRequest() {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(geofenceList);
    return builder.build();
}

এই উদাহরণটি দুটি জিওফেন্স ট্রিগারের ব্যবহার দেখায়। GEOFENCE_TRANSITION_ENTER ট্রানজিশনটি ট্রিগার হয় যখন একটি ডিভাইস একটি জিওফেন্সে প্রবেশ করে, এবং GEOFENCE_TRANSITION_EXIT ট্রানজিশনটি ট্রিগার হয় যখন একটি ডিভাইস জিওফেন্স থেকে বেরিয়ে যায়। INITIAL_TRIGGER_ENTER নির্দিষ্ট করা অবস্থান পরিষেবাগুলিকে বলে যে ডিভাইসটি ইতিমধ্যে জিওফেন্সের ভিতরে থাকলে GEOFENCE_TRANSITION_ENTER ট্রিগার করা উচিত৷

অনেক ক্ষেত্রে, INITIAL_TRIGGER_DWELL পরিবর্তে ব্যবহার করা বাঞ্ছনীয় হতে পারে, যা ইভেন্টগুলিকে ট্রিগার করে যখন ব্যবহারকারী একটি জিওফেন্সের মধ্যে একটি নির্দিষ্ট সময়ের জন্য থামে। এই পদ্ধতিটি "সতর্ক স্প্যাম" কমাতে সাহায্য করতে পারে যখন একটি ডিভাইস সংক্ষিপ্তভাবে জিওফেন্সে প্রবেশ করে এবং প্রস্থান করে তখন বড় সংখ্যক বিজ্ঞপ্তির ফলে। আপনার জিওফেন্স থেকে সেরা ফলাফল পাওয়ার আরেকটি কৌশল হল সর্বনিম্ন 100 মিটার ব্যাসার্ধ সেট করা। এটি সাধারণ Wi-Fi নেটওয়ার্কগুলির অবস্থান নির্ভুলতার জন্য অ্যাকাউন্টে সহায়তা করে এবং ডিভাইসের পাওয়ার খরচ কমাতেও সহায়তা করে৷

জিওফেন্স ট্রানজিশনের জন্য একটি ব্রডকাস্ট রিসিভার সংজ্ঞায়িত করুন

অবস্থান পরিষেবাগুলি থেকে পাঠানো একটি Intent আপনার অ্যাপে বিভিন্ন ক্রিয়াকলাপ ট্রিগার করতে পারে, তবে আপনার এটি একটি কার্যকলাপ বা খণ্ড শুরু করা উচিত নয় , কারণ উপাদানগুলি শুধুমাত্র ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়ায় দৃশ্যমান হওয়া উচিত। অনেক ক্ষেত্রে, একটি BroadcastReceiver একটি জিওফেন্স ট্রানজিশন পরিচালনা করার একটি ভাল উপায়। একটি BroadcastReceiver আপডেট পায় যখন একটি ইভেন্ট ঘটে, যেমন একটি জিওফেন্সে বা এর বাইরে স্থানান্তর, এবং দীর্ঘ-চলমান ব্যাকগ্রাউন্ড কাজ শুরু করতে পারে।

নিম্নলিখিত স্নিপেট দেখায় কিভাবে একটি PendingIntent সংজ্ঞায়িত করতে হয় যা একটি BroadcastReceiver শুরু করে:

কোটলিন

class MainActivity : AppCompatActivity() {

    // ...

    private val geofencePendingIntent: PendingIntent by lazy {
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
}

জাভা

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
            return geofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return geofencePendingIntent;
    }

জিওফেন্স যোগ করুন

geofences যোগ করতে, GeofencingClient.addGeofences() পদ্ধতি ব্যবহার করুন। GeofencingRequest অবজেক্ট এবং PendingIntent প্রদান করুন। নিম্নলিখিত স্নিপেট ফলাফল প্রক্রিয়াকরণ প্রদর্শন করে:

কোটলিন

geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences added
        // ...
    }
    addOnFailureListener {
        // Failed to add geofences
        // ...
    }
}

জাভা

geofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences added
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to add geofences
                // ...
            }
        });

জিওফেন্স ট্রানজিশন পরিচালনা করুন

যখন লোকেশন সার্ভিস শনাক্ত করে যে ব্যবহারকারী একটি জিওফেন্সে প্রবেশ করেছে বা প্রস্থান করেছে, তখন এটি জিওফেন্স যোগ করার অনুরোধে আপনার অন্তর্ভুক্ত PendingIntent এ থাকা Intent পাঠায়। GeofenceBroadcastReceiver এর মতো একটি ব্রডকাস্ট রিসিভার লক্ষ্য করে যে Intent আহ্বান করা হয়েছিল এবং তারপরে অভিপ্রায় থেকে জিওফেনসিং ইভেন্টটি পেতে পারে, জিওফেন্স ট্রানজিশনের ধরন নির্ধারণ করতে পারে এবং সংজ্ঞায়িত জিওফেনসগুলির মধ্যে কোনটি ট্রিগার হয়েছিল তা নির্ধারণ করতে পারে৷ ব্রডকাস্ট রিসিভার একটি অ্যাপকে ব্যাকগ্রাউন্ডের কাজ শুরু করতে নির্দেশ দিতে পারে বা, যদি ইচ্ছা হয়, আউটপুট হিসাবে একটি বিজ্ঞপ্তি পাঠাতে পারে।

দ্রষ্টব্য: অ্যান্ড্রয়েড 8.0 (API লেভেল 26) এবং উচ্চতর, যদি কোনও অ্যাপ জিওফেন্স পর্যবেক্ষণ করার সময় ব্যাকগ্রাউন্ডে চলছে, তাহলে ডিভাইসটি প্রতি কয়েক মিনিটে জিওফেন্সিং ইভেন্টগুলিতে প্রতিক্রিয়া জানায়৷ এই প্রতিক্রিয়া সীমাগুলির সাথে আপনার অ্যাপটিকে কীভাবে মানিয়ে নেওয়া যায় তা শিখতে, পটভূমি অবস্থানের সীমা দেখুন।

নিচের স্নিপেটটি দেখায় যে কিভাবে একটি BroadcastReceiver সংজ্ঞায়িত করতে হয় যেটি একটি জিওফেন্স ট্রানজিশন ঘটলে একটি বিজ্ঞপ্তি পোস্ট করে। ব্যবহারকারী যখন বিজ্ঞপ্তিতে ক্লিক করেন, তখন অ্যাপটির প্রধান কার্যকলাপ প্রদর্শিত হয়:

কোটলিন

class GeofenceBroadcastReceiver : BroadcastReceiver() {
    // ...
    override fun onReceive(context: Context?, intent: Intent?) {
        val geofencingEvent = GeofencingEvent.fromIntent(intent)
        if (geofencingEvent.hasError()) {
            val errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.errorCode)
            Log.e(TAG, errorMessage)
            return
        }

        // Get the transition type.
        val geofenceTransition = geofencingEvent.geofenceTransition

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER |
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            val triggeringGeofences = geofencingEvent.triggeringGeofences

            // Get the transition details as a String.
            val geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            )

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails)
            Log.i(TAG, geofenceTransitionDetails)
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition))
        }
    }
}

জাভা

public class GeofenceBroadcastReceiver extends BroadcastReceiver {
    // ...
    protected void onReceive(Context context, Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {
            String errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.getErrorCode());
            Log.e(TAG, errorMessage);
            return;
        }

        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

            // Get the transition details as a String.
            String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            );

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails);
            Log.i(TAG, geofenceTransitionDetails);
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition));
        }
    }
}

PendingIntent এর মাধ্যমে ট্রানজিশন ইভেন্ট শনাক্ত করার পর, BroadcastReceiver জিওফেন্স ট্রানজিশন টাইপ পায় এবং পরীক্ষা করে যে অ্যাপটি বিজ্ঞপ্তিগুলিকে ট্রিগার করতে ব্যবহার করে এমন একটি ইভেন্ট কিনা -- হয় GEOFENCE_TRANSITION_ENTER বা GEOFENCE_TRANSITION_EXIT এই ক্ষেত্রে। পরিষেবাটি তারপর একটি বিজ্ঞপ্তি পাঠায় এবং স্থানান্তরের বিবরণ লগ করে।

জিওফেন্স মনিটরিং বন্ধ করুন

জিওফেন্স মনিটরিং বন্ধ করা যখন এটি আর প্রয়োজন বা কাঙ্খিত না হয় তখন ডিভাইসে ব্যাটারি শক্তি এবং CPU চক্র সংরক্ষণ করতে সাহায্য করতে পারে। আপনি জিওফেন্স যোগ এবং অপসারণ করতে ব্যবহৃত প্রধান কার্যকলাপে জিওফেন্স পর্যবেক্ষণ বন্ধ করতে পারেন; একটি জিওফেন্স অপসারণ অবিলম্বে এটি বন্ধ করে দেয়। এপিআই জিওফেন্সগুলিকে রিকোয়েস্ট আইডি দ্বারা বা প্রদত্ত PendingIntent এর সাথে যুক্ত জিওফেন্স অপসারণের পদ্ধতি প্রদান করে।

নিম্নলিখিত স্নিপেটটি PendingIntent দ্বারা জিওফেন্সগুলি সরিয়ে দেয়, ডিভাইসটি পূর্বে যোগ করা জিওফেন্সে প্রবেশ বা প্রস্থান করার সময় পরবর্তী সমস্ত বিজ্ঞপ্তি বন্ধ করে দেয়:

কোটলিন

geofencingClient?.removeGeofences(geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences removed
        // ...
    }
    addOnFailureListener {
        // Failed to remove geofences
        // ...
    }
}

জাভা

geofencingClient.removeGeofences(getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences removed
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to remove geofences
                // ...
            }
        });

আপনি অন্যান্য অবস্থান-সচেতন বৈশিষ্ট্যগুলির সাথে জিওফেন্সিংকে একত্রিত করতে পারেন, যেমন পর্যায়ক্রমিক অবস্থান আপডেট। আরও তথ্যের জন্য, এই ক্লাসের অন্যান্য পাঠগুলি দেখুন।

জিওফেন্সিংয়ের জন্য সেরা অনুশীলনগুলি ব্যবহার করুন

এই বিভাগটি Android-এর জন্য অবস্থান API-এর সাথে জিওফেন্সিং ব্যবহার করার জন্য সুপারিশগুলির রূপরেখা দেয়৷

বিদ্যুত খরচ কমান

জিওফেন্সিং ব্যবহার করে এমন আপনার অ্যাপগুলিতে পাওয়ার খরচ অপ্টিমাইজ করতে আপনি নিম্নলিখিত কৌশলগুলি ব্যবহার করতে পারেন:

  • বিজ্ঞপ্তির প্রতিক্রিয়াশীলতা একটি উচ্চ মান সেট করুন। এটি করার ফলে জিওফেন্স সতর্কতার লেটেন্সি বাড়িয়ে পাওয়ার খরচ উন্নত হয়। উদাহরণস্বরূপ, আপনি যদি পাঁচ মিনিটের একটি প্রতিক্রিয়াশীলতার মান সেট করেন তবে আপনার অ্যাপটি প্রতি পাঁচ মিনিটে একবার প্রবেশদ্বার বা প্রস্থান সতর্কতার জন্য পরীক্ষা করে। নিম্ন মান সেট করার অর্থ এই নয় যে ব্যবহারকারীদের সেই সময়ের মধ্যে অবহিত করা হয়েছে (উদাহরণস্বরূপ, আপনি যদি 5 সেকেন্ডের মান সেট করেন তবে সতর্কতা পেতে তার চেয়ে কিছুটা বেশি সময় লাগতে পারে)।

  • একটি বৃহত্তর জিওফেন্স ব্যাসার্ধের অবস্থানের জন্য ব্যবহার করুন যেখানে একজন ব্যবহারকারী উল্লেখযোগ্য পরিমাণ সময় ব্যয় করেন, যেমন বাড়ি বা কর্মস্থল। যদিও একটি বৃহত্তর ব্যাসার্ধ সরাসরি বিদ্যুতের খরচ কমায় না, এটি অ্যাপটি প্রবেশ বা প্রস্থানের জন্য যে ফ্রিকোয়েন্সি পরীক্ষা করে তা কমিয়ে দেয়, কার্যকরভাবে সামগ্রিক বিদ্যুতের খরচ কমিয়ে দেয়।

আপনার জিওফেন্সের জন্য সর্বোত্তম ব্যাসার্ধ বেছে নিন

সেরা ফলাফলের জন্য, জিওফেন্সের সর্বনিম্ন ব্যাসার্ধ 100 - 150 মিটারের মধ্যে সেট করা উচিত৷ যখন Wi-Fi উপলব্ধ থাকে তখন অবস্থানের নির্ভুলতা সাধারণত 20 - 50 মিটারের মধ্যে হয়৷ অভ্যন্তরীণ অবস্থান উপলব্ধ হলে, সঠিকতার পরিসীমা 5 মিটারের মতো ছোট হতে পারে। আপনি যদি না জানেন যে জিওফেন্সের ভিতরে ইনডোর লোকেশন পাওয়া যায়, ধরে নিন যে Wi-Fi অবস্থানের নির্ভুলতা প্রায় 50 মিটার।

যখন Wi-Fi অবস্থান উপলব্ধ না থাকে (উদাহরণস্বরূপ, আপনি যখন গ্রামীণ এলাকায় গাড়ি চালাচ্ছেন) অবস্থানের যথার্থতা হ্রাস পায়। নির্ভুলতার পরিসীমা কয়েকশ মিটার থেকে কয়েক কিলোমিটার পর্যন্ত বড় হতে পারে। এই ধরনের ক্ষেত্রে, আপনার একটি বড় ব্যাসার্ধ ব্যবহার করে জিওফেনস তৈরি করা উচিত।

ব্যবহারকারীদের ব্যাখ্যা করুন কেন আপনার অ্যাপ জিওফেন্সিং ব্যবহার করে

যেহেতু আপনি জিওফেন্সিং ব্যবহার করার সময় আপনার অ্যাপটি ব্যাকগ্রাউন্ডে অবস্থান অ্যাক্সেস করে, আপনার অ্যাপ কীভাবে ব্যবহারকারীদের সুবিধা প্রদান করে তা বিবেচনা করুন। ব্যবহারকারীদের বোঝাপড়া এবং স্বচ্ছতা বাড়াতে কেন আপনার অ্যাপের এই অ্যাক্সেস প্রয়োজন তা তাদের স্পষ্টভাবে ব্যাখ্যা করুন।

জিওফেন্সিং সহ অবস্থান অ্যাক্সেস সম্পর্কিত সর্বোত্তম অনুশীলন সম্পর্কে আরও তথ্যের জন্য, গোপনীয়তার সেরা অনুশীলন পৃষ্ঠাটি দেখুন।

সতর্কতা স্প্যাম কমাতে dwell ট্রানজিশন টাইপ ব্যবহার করুন

একটি জিওফেন্স অতিক্রম করার সময় সংক্ষিপ্তভাবে গাড়ি চালানোর সময় আপনি যদি প্রচুর পরিমাণে সতর্কতা পান, তবে সতর্কতা কমানোর সর্বোত্তম উপায় হল GEOFENCE_TRANSITION_ENTER এর পরিবর্তে GEOFENCE_TRANSITION_DWELL এর একটি রূপান্তর প্রকার ব্যবহার করা। এইভাবে, বাসস্থান সতর্কতা তখনই পাঠানো হয় যখন ব্যবহারকারী একটি নির্দিষ্ট সময়ের জন্য জিওফেন্সের ভিতরে থামে। আপনি একটি লোটারিং বিলম্ব সেট করে সময়কাল চয়ন করতে পারেন।

প্রয়োজন হলেই জিওফেন্স পুনরায় নিবন্ধন করুন

com.google.android.gms প্যাকেজের মালিকানাধীন com.google.process.location প্রক্রিয়ায় নিবন্ধিত জিওফেন্সগুলি রাখা হয়৷ নিম্নলিখিত ইভেন্টগুলি পরিচালনা করার জন্য অ্যাপটির কিছু করার দরকার নেই, কারণ এই ইভেন্টগুলির পরে সিস্টেমটি জিওফেন্সগুলি পুনরুদ্ধার করে:

  • Google Play পরিষেবাগুলি আপগ্রেড করা হয়েছে৷
  • রিসোর্স সীমাবদ্ধতার কারণে Google Play পরিষেবাগুলি সিস্টেম দ্বারা মেরে ফেলা হয়েছে এবং পুনরায় চালু করা হয়েছে৷
  • অবস্থান প্রক্রিয়া ক্র্যাশ.

নিম্নলিখিত ইভেন্টগুলির পরেও যদি প্রয়োজন হয় তবে অ্যাপটিকে অবশ্যই জিওফেন্সগুলি পুনরায় নিবন্ধন করতে হবে, যেহেতু সিস্টেম নিম্নলিখিত ক্ষেত্রে জিওফেন্সগুলি পুনরুদ্ধার করতে পারে না:

  • ডিভাইসটি রিবুট করা হয়েছে। অ্যাপটিকে ডিভাইসের বুট সম্পূর্ণ অ্যাকশন শুনতে হবে এবং তারপর প্রয়োজনীয় জিওফেন্সগুলি পুনরায় নিবন্ধন করতে হবে।
  • অ্যাপটি আনইনস্টল করে পুনরায় ইনস্টল করা হয়েছে।
  • অ্যাপের ডেটা সাফ করা হয়েছে।
  • Google Play পরিষেবার ডেটা সাফ করা হয়েছে৷
  • অ্যাপটি একটি GEOFENCE_NOT_AVAILABLE সতর্কতা পেয়েছে। এটি সাধারণত NLP (Android এর নেটওয়ার্ক অবস্থান প্রদানকারী) অক্ষম করার পরে ঘটে।

জিওফেন্স এন্ট্রান্স ইভেন্টের সমস্যা সমাধান করুন

ডিভাইসটি একটি জিওফেন্সে প্রবেশ করার সময় যদি জিওফেন্সগুলি ট্রিগার না হয় ( GEOFENCE_TRANSITION_ENTER সতর্কতাটি ট্রিগার করা হয়নি), প্রথমে নিশ্চিত করুন যে এই নির্দেশিকায় বর্ণিত হিসাবে আপনার জিওফেন্সগুলি সঠিকভাবে নিবন্ধিত হয়েছে৷

এখানে সতর্কতা প্রত্যাশিতভাবে কাজ না করার কিছু সম্ভাব্য কারণ রয়েছে:

  • আপনার জিওফেন্সের ভিতরে সঠিক অবস্থান পাওয়া যায় না বা আপনার জিওফেন্স খুব ছোট। বেশিরভাগ ডিভাইসে, জিওফেন্স সার্ভিস জিওফেন্স ট্রিগারিংয়ের জন্য শুধুমাত্র নেটওয়ার্ক অবস্থান ব্যবহার করে। পরিষেবাটি এই পদ্ধতিটি ব্যবহার করে কারণ নেটওয়ার্ক অবস্থান অনেক কম শক্তি খরচ করে, এটি পৃথক অবস্থানগুলি পেতে কম সময় নেয় এবং সবচেয়ে গুরুত্বপূর্ণভাবে এটি বাড়ির ভিতরে উপলব্ধ।
  • ডিভাইসে Wi-Fi বন্ধ আছে। Wi-Fi চালু থাকলে তা অবস্থানের যথার্থতাকে উল্লেখযোগ্যভাবে উন্নত করতে পারে, তাই যদি Wi-Fi বন্ধ থাকে, তাহলে আপনার অ্যাপ্লিকেশনটি জিওফেন্সের ব্যাসার্ধ, ডিভাইস মডেল বা Android সংস্করণ সহ বিভিন্ন সেটিংসের উপর নির্ভর করে জিওফেন্স সতর্কতা পেতে পারে না। অ্যান্ড্রয়েড 4.3 (এপিআই লেভেল 18) থেকে শুরু করে, আমরা "ওয়াই-ফাই শুধুমাত্র স্ক্যান মোড" এর ক্ষমতা যুক্ত করেছি যা ব্যবহারকারীদের Wi-Fi অক্ষম করতে দেয় কিন্তু তারপরও ভাল নেটওয়ার্ক অবস্থান পেতে পারে। ব্যবহারকারীকে প্রম্পট করা এবং উভয়ই নিষ্ক্রিয় থাকলে শুধুমাত্র Wi-Fi বা Wi-Fi স্ক্যান মোড সক্ষম করার জন্য ব্যবহারকারীর জন্য একটি শর্টকাট প্রদান করা ভাল অভ্যাস। সর্বোত্তম অবস্থান সনাক্তকরণের জন্য ডিভাইসের সিস্টেম সেটিংস সঠিকভাবে কনফিগার করা হয়েছে তা নিশ্চিত করতে SettingsClient ব্যবহার করুন।

    দ্রষ্টব্য: যদি আপনার অ্যাপটি Android 10 (API স্তর 29) বা উচ্চতরকে লক্ষ্য করে, তাহলে আপনি WifiManager.setEnabled() কে সরাসরি কল করতে পারবেন না যদি না আপনার অ্যাপটি একটি সিস্টেম অ্যাপ বা একটি ডিভাইস পলিসি কন্ট্রোলার (DPC) হয়। পরিবর্তে, একটি সেটিংস প্যানেল ব্যবহার করুন৷

  • আপনার জিওফেন্সের ভিতরে কোন নির্ভরযোগ্য নেটওয়ার্ক সংযোগ নেই। কোনো নির্ভরযোগ্য ডেটা সংযোগ না থাকলে, সতর্কতা তৈরি নাও হতে পারে। এর কারণ হল জিওফেন্স পরিষেবা নেটওয়ার্ক অবস্থান প্রদানকারীর উপর নির্ভর করে যার ফলে একটি ডেটা সংযোগ প্রয়োজন৷
  • সতর্কতা দেরী হতে পারে. জিওফেন্স পরিষেবাটি অবিচ্ছিন্নভাবে অবস্থানের জন্য অনুসন্ধান করে না, তাই সতর্কতা পাওয়ার সময় কিছু বিলম্বের আশা করুন। সাধারণত লেটেন্সি 2 মিনিটের কম হয়, এমনকি যখন ডিভাইসটি চলমান থাকে তখনও কম। ব্যাকগ্রাউন্ড লোকেশন লিমিট কার্যকর হলে, লেটেন্সি গড়ে প্রায় 2-3 মিনিট। যদি ডিভাইসটি একটি উল্লেখযোগ্য সময়ের জন্য স্থির থাকে, তবে লেটেন্সি বাড়তে পারে (6 মিনিট পর্যন্ত)।

অতিরিক্ত সম্পদ

জিওফেন্সিং সম্পর্কে আরও জানতে, নিম্নলিখিত উপকরণগুলি দেখুন:

নমুনা

জিওফেন্স তৈরি এবং পর্যবেক্ষণের জন্য নমুনা অ্যাপ

,

জিওফেন্সিং ব্যবহারকারীর বর্তমান অবস্থান সম্পর্কে সচেতনতা এবং আগ্রহের হতে পারে এমন অবস্থানগুলির সাথে ব্যবহারকারীর নৈকট্য সম্পর্কে সচেতনতাকে একত্রিত করে৷ আগ্রহের একটি অবস্থান চিহ্নিত করতে, আপনি এর অক্ষাংশ এবং দ্রাঘিমাংশ নির্দিষ্ট করুন৷ অবস্থানের জন্য প্রক্সিমিটি সামঞ্জস্য করতে, আপনি একটি ব্যাসার্ধ যোগ করুন। অক্ষাংশ, দ্রাঘিমাংশ, এবং ব্যাসার্ধ একটি জিওফেন্সকে সংজ্ঞায়িত করে, আগ্রহের অবস্থানের চারপাশে একটি বৃত্তাকার এলাকা বা বেড়া তৈরি করে।

আপনার একাধিক সক্রিয় জিওফেন্স থাকতে পারে, প্রতি ডিভাইস ব্যবহারকারী প্রতি অ্যাপের 100 সীমা সহ। প্রতিটি জিওফেন্সের জন্য, আপনি অবস্থান পরিষেবাগুলিকে আপনাকে প্রবেশদ্বার এবং প্রস্থান ইভেন্টগুলি পাঠাতে বলতে পারেন, অথবা আপনি একটি ইভেন্ট ট্রিগার করার আগে জিওফেন্স এলাকায় অপেক্ষা করার বা থাকার জন্য একটি সময়কাল নির্দিষ্ট করতে পারেন৷ আপনি মিলিসেকেন্ডে মেয়াদ শেষ হওয়ার সময়কাল উল্লেখ করে যেকোন জিওফেন্সের সময়কাল সীমাবদ্ধ করতে পারেন। জিওফেন্সের মেয়াদ শেষ হওয়ার পরে, অবস্থান পরিষেবাগুলি স্বয়ংক্রিয়ভাবে এটিকে সরিয়ে দেয়।

এই পাঠটি আপনাকে দেখায় কিভাবে জিওফেন্স যোগ এবং অপসারণ করতে হয় এবং তারপর একটি BroadcastReceiver ব্যবহার করে জিওফেন্স ট্রানজিশন শুনতে হয়।

দ্রষ্টব্য: Wear ডিভাইসে, Geofencing APIs ক্ষমতার দক্ষ ব্যবহার করে না। আমরা Wear-এ এই APIগুলি সুপারিশ করি না। আরও তথ্যের জন্য শক্তি এবং ব্যাটারি সংরক্ষণ পড়ুন।

জিওফেন্স পর্যবেক্ষণের জন্য সেট আপ করুন

জিওফেন্স পর্যবেক্ষণের অনুরোধ করার প্রথম ধাপ হল প্রয়োজনীয় অনুমতির অনুরোধ করা। জিওফেন্সিং ব্যবহার করতে, আপনার অ্যাপকে অবশ্যই নিম্নলিখিত অনুরোধ করতে হবে:

আরও জানতে, অবস্থানের অনুমতির জন্য কীভাবে অনুরোধ করবেন তার নির্দেশিকা দেখুন।

আপনি যদি জিওফেন্স ট্রানজিশন শুনতে একটি BroadcastReceiver ব্যবহার করতে চান, তাহলে পরিষেবার নাম উল্লেখ করে একটি উপাদান যোগ করুন। এই উপাদানটি অবশ্যই <application> উপাদানের একটি শিশু হতে হবে:

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

অবস্থান API অ্যাক্সেস করতে, আপনাকে জিওফেনিং ক্লায়েন্টের একটি উদাহরণ তৈরি করতে হবে। আপনার ক্লায়েন্টকে কীভাবে সংযুক্ত করবেন তা শিখতে:

কোটলিন

lateinit var geofencingClient: GeofencingClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this)
}

জাভা

private GeofencingClient geofencingClient;

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    geofencingClient = LocationServices.getGeofencingClient(this);
}

জিওফেন্স তৈরি করুন এবং যোগ করুন

আপনার অ্যাপটিকে জিওফেনস অবজেক্ট তৈরি করার জন্য অবস্থান API এর বিল্ডার ক্লাস এবং সেগুলি যোগ করার সুবিধার ক্লাস ব্যবহার করে জিওফেন্স তৈরি এবং যোগ করতে হবে। এছাড়াও, জিওফেন্স ট্রানজিশন ঘটলে অবস্থান পরিষেবাগুলি থেকে পাঠানো উদ্দেশ্যগুলি পরিচালনা করতে, আপনি এই বিভাগে দেখানো হিসাবে একটি PendingIntent সংজ্ঞায়িত করতে পারেন।

দ্রষ্টব্য: একক-ব্যবহারকারী ডিভাইসে, প্রতি অ্যাপে 100টি জিওফেন্সের সীমা রয়েছে। মাল্টি-ইউজার ডিভাইসের জন্য, প্রতি ডিভাইস ব্যবহারকারী প্রতি অ্যাপ প্রতি ১০০ জিওফেন্সের সীমা।

জিওফেন্স অবজেক্ট তৈরি করুন

প্রথমে, একটি জিওফেন্স তৈরি করতে Geofence.Builder ব্যবহার করুন, জিওফেন্সের জন্য পছন্দসই ব্যাসার্ধ, সময়কাল এবং পরিবর্তনের ধরন সেট করুন। উদাহরণস্বরূপ, একটি তালিকা অবজেক্ট পপুলেট করতে:

কোটলিন

geofenceList.add(Geofence.Builder()
        // Set the request ID of the geofence. This is a string to identify this
        // geofence.
        .setRequestId(entry.key)

        // Set the circular region of this geofence.
        .setCircularRegion(
                entry.value.latitude,
                entry.value.longitude,
                Constants.GEOFENCE_RADIUS_IN_METERS
        )

        // Set the expiration duration of the geofence. This geofence gets automatically
        // removed after this period of time.
        .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)

        // Set the transition types of interest. Alerts are only generated for these
        // transition. We track entry and exit transitions in this sample.
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)

        // Create the geofence.
        .build())

জাভা

geofenceList.add(new Geofence.Builder()
    // Set the request ID of the geofence. This is a string to identify this
    // geofence.
    .setRequestId(entry.getKey())

    .setCircularRegion(
            entry.getValue().latitude,
            entry.getValue().longitude,
            Constants.GEOFENCE_RADIUS_IN_METERS
    )
    .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
            Geofence.GEOFENCE_TRANSITION_EXIT)
    .build());

এই উদাহরণটি একটি ধ্রুবক ফাইল থেকে ডেটা টেনে আনে। প্রকৃত অনুশীলনে, অ্যাপগুলি ব্যবহারকারীর অবস্থানের উপর ভিত্তি করে গতিশীলভাবে জিওফেন্স তৈরি করতে পারে।

জিওফেন্স এবং প্রাথমিক ট্রিগার নির্দিষ্ট করুন

নিম্নোক্ত স্নিপেটটি GeofencingRequest ক্লাস এবং এর নেস্টেড GeofencingRequestBuilder ক্লাস ব্যবহার করে জিওফেন্সগুলিকে নিরীক্ষণ করতে এবং কীভাবে সম্পর্কিত জিওফেন্স ইভেন্টগুলি ট্রিগার করা হয় তা সেট করতে:

কোটলিন

private fun getGeofencingRequest(): GeofencingRequest {
    return GeofencingRequest.Builder().apply {
        setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER)
        addGeofences(geofenceList)
    }.build()
}

জাভা

private GeofencingRequest getGeofencingRequest() {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(geofenceList);
    return builder.build();
}

এই উদাহরণটি দুটি জিওফেন্স ট্রিগারের ব্যবহার দেখায়। GEOFENCE_TRANSITION_ENTER ট্রানজিশনটি ট্রিগার হয় যখন একটি ডিভাইস একটি জিওফেন্সে প্রবেশ করে, এবং GEOFENCE_TRANSITION_EXIT ট্রানজিশনটি ট্রিগার হয় যখন একটি ডিভাইস জিওফেন্স থেকে বেরিয়ে যায়। INITIAL_TRIGGER_ENTER নির্দিষ্ট করা অবস্থান পরিষেবাগুলিকে বলে যে ডিভাইসটি ইতিমধ্যে জিওফেন্সের ভিতরে থাকলে GEOFENCE_TRANSITION_ENTER ট্রিগার করা উচিত৷

অনেক ক্ষেত্রে, INITIAL_TRIGGER_DWELL পরিবর্তে ব্যবহার করা বাঞ্ছনীয় হতে পারে, যা ইভেন্টগুলিকে ট্রিগার করে যখন ব্যবহারকারী একটি জিওফেন্সের মধ্যে একটি নির্দিষ্ট সময়ের জন্য থামে। এই পদ্ধতিটি "সতর্ক স্প্যাম" কমাতে সাহায্য করতে পারে যখন একটি ডিভাইস সংক্ষিপ্তভাবে জিওফেন্সে প্রবেশ করে এবং প্রস্থান করে তখন বড় সংখ্যক বিজ্ঞপ্তির ফলে। আপনার জিওফেন্স থেকে সেরা ফলাফল পাওয়ার আরেকটি কৌশল হল সর্বনিম্ন 100 মিটার ব্যাসার্ধ সেট করা। এটি সাধারণ Wi-Fi নেটওয়ার্কগুলির অবস্থান নির্ভুলতার জন্য অ্যাকাউন্টে সহায়তা করে এবং ডিভাইসের পাওয়ার খরচ কমাতেও সহায়তা করে৷

জিওফেন্স ট্রানজিশনের জন্য একটি ব্রডকাস্ট রিসিভার সংজ্ঞায়িত করুন

অবস্থান পরিষেবাগুলি থেকে পাঠানো একটি Intent আপনার অ্যাপে বিভিন্ন ক্রিয়াকলাপ ট্রিগার করতে পারে, তবে আপনার এটি একটি কার্যকলাপ বা খণ্ড শুরু করা উচিত নয় , কারণ উপাদানগুলি শুধুমাত্র ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়ায় দৃশ্যমান হওয়া উচিত। অনেক ক্ষেত্রে, একটি BroadcastReceiver একটি জিওফেন্স ট্রানজিশন পরিচালনা করার একটি ভাল উপায়। একটি BroadcastReceiver আপডেট পায় যখন একটি ইভেন্ট ঘটে, যেমন একটি জিওফেন্সে বা এর বাইরে স্থানান্তর, এবং দীর্ঘ-চলমান ব্যাকগ্রাউন্ড কাজ শুরু করতে পারে।

নিম্নলিখিত স্নিপেট দেখায় কিভাবে একটি PendingIntent সংজ্ঞায়িত করতে হয় যা একটি BroadcastReceiver শুরু করে:

কোটলিন

class MainActivity : AppCompatActivity() {

    // ...

    private val geofencePendingIntent: PendingIntent by lazy {
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
    }
}

জাভা

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
            return geofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return geofencePendingIntent;
    }

জিওফেন্স যোগ করুন

geofences যোগ করতে, GeofencingClient.addGeofences() পদ্ধতি ব্যবহার করুন। GeofencingRequest অবজেক্ট এবং PendingIntent প্রদান করুন। নিম্নলিখিত স্নিপেট ফলাফল প্রক্রিয়াকরণ প্রদর্শন করে:

কোটলিন

geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences added
        // ...
    }
    addOnFailureListener {
        // Failed to add geofences
        // ...
    }
}

জাভা

geofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences added
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to add geofences
                // ...
            }
        });

জিওফেন্স ট্রানজিশন পরিচালনা করুন

যখন লোকেশন সার্ভিস শনাক্ত করে যে ব্যবহারকারী একটি জিওফেন্সে প্রবেশ করেছে বা প্রস্থান করেছে, তখন এটি জিওফেন্স যোগ করার অনুরোধে আপনার অন্তর্ভুক্ত PendingIntent এ থাকা Intent পাঠায়। GeofenceBroadcastReceiver এর মতো একটি ব্রডকাস্ট রিসিভার লক্ষ্য করে যে Intent আহ্বান করা হয়েছিল এবং তারপরে অভিপ্রায় থেকে জিওফেনসিং ইভেন্টটি পেতে পারে, জিওফেন্স ট্রানজিশনের ধরন নির্ধারণ করতে পারে এবং সংজ্ঞায়িত জিওফেনসগুলির মধ্যে কোনটি ট্রিগার হয়েছিল তা নির্ধারণ করতে পারে৷ ব্রডকাস্ট রিসিভার একটি অ্যাপকে ব্যাকগ্রাউন্ডের কাজ শুরু করতে নির্দেশ দিতে পারে বা, যদি ইচ্ছা হয়, আউটপুট হিসাবে একটি বিজ্ঞপ্তি পাঠাতে পারে।

দ্রষ্টব্য: অ্যান্ড্রয়েড 8.0 (API লেভেল 26) এবং উচ্চতর, যদি কোনও অ্যাপ জিওফেন্স পর্যবেক্ষণ করার সময় ব্যাকগ্রাউন্ডে চলছে, তাহলে ডিভাইসটি প্রতি কয়েক মিনিটে জিওফেন্সিং ইভেন্টগুলিতে প্রতিক্রিয়া জানায়৷ এই প্রতিক্রিয়া সীমাগুলির সাথে আপনার অ্যাপটিকে কীভাবে মানিয়ে নেওয়া যায় তা শিখতে, পটভূমি অবস্থানের সীমা দেখুন।

নিচের স্নিপেটটি দেখায় যে কিভাবে একটি BroadcastReceiver সংজ্ঞায়িত করতে হয় যেটি একটি জিওফেন্স ট্রানজিশন ঘটলে একটি বিজ্ঞপ্তি পোস্ট করে। ব্যবহারকারী যখন বিজ্ঞপ্তিতে ক্লিক করেন, তখন অ্যাপটির প্রধান কার্যকলাপ প্রদর্শিত হয়:

কোটলিন

class GeofenceBroadcastReceiver : BroadcastReceiver() {
    // ...
    override fun onReceive(context: Context?, intent: Intent?) {
        val geofencingEvent = GeofencingEvent.fromIntent(intent)
        if (geofencingEvent.hasError()) {
            val errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.errorCode)
            Log.e(TAG, errorMessage)
            return
        }

        // Get the transition type.
        val geofenceTransition = geofencingEvent.geofenceTransition

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER |
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            val triggeringGeofences = geofencingEvent.triggeringGeofences

            // Get the transition details as a String.
            val geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            )

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails)
            Log.i(TAG, geofenceTransitionDetails)
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition))
        }
    }
}

জাভা

public class GeofenceBroadcastReceiver extends BroadcastReceiver {
    // ...
    protected void onReceive(Context context, Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {
            String errorMessage = GeofenceStatusCodes
                    .getStatusCodeString(geofencingEvent.getErrorCode());
            Log.e(TAG, errorMessage);
            return;
        }

        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

            // Get the transition details as a String.
            String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            );

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails);
            Log.i(TAG, geofenceTransitionDetails);
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition));
        }
    }
}

PendingIntent এর মাধ্যমে ট্রানজিশন ইভেন্ট শনাক্ত করার পর, BroadcastReceiver জিওফেন্স ট্রানজিশন টাইপ পায় এবং পরীক্ষা করে যে অ্যাপটি বিজ্ঞপ্তিগুলিকে ট্রিগার করতে ব্যবহার করে এমন একটি ইভেন্ট কিনা -- হয় GEOFENCE_TRANSITION_ENTER বা GEOFENCE_TRANSITION_EXIT এই ক্ষেত্রে। পরিষেবাটি তারপর একটি বিজ্ঞপ্তি পাঠায় এবং স্থানান্তরের বিবরণ লগ করে।

জিওফেন্স মনিটরিং বন্ধ করুন

জিওফেন্স মনিটরিং বন্ধ করা যখন এটি আর প্রয়োজন বা কাঙ্খিত না হয় তখন ডিভাইসে ব্যাটারি শক্তি এবং CPU চক্র সংরক্ষণ করতে সাহায্য করতে পারে। আপনি জিওফেন্স যোগ এবং অপসারণ করতে ব্যবহৃত প্রধান কার্যকলাপে জিওফেন্স পর্যবেক্ষণ বন্ধ করতে পারেন; একটি জিওফেন্স অপসারণ অবিলম্বে এটি বন্ধ করে দেয়। এপিআই জিওফেন্সগুলিকে রিকোয়েস্ট আইডি দ্বারা বা প্রদত্ত PendingIntent এর সাথে যুক্ত জিওফেন্স অপসারণের পদ্ধতি প্রদান করে।

নিম্নলিখিত স্নিপেটটি PendingIntent দ্বারা জিওফেন্সগুলি সরিয়ে দেয়, ডিভাইসটি পূর্বে যোগ করা জিওফেন্সে প্রবেশ বা প্রস্থান করার সময় পরবর্তী সমস্ত বিজ্ঞপ্তি বন্ধ করে দেয়:

কোটলিন

geofencingClient?.removeGeofences(geofencePendingIntent)?.run {
    addOnSuccessListener {
        // Geofences removed
        // ...
    }
    addOnFailureListener {
        // Failed to remove geofences
        // ...
    }
}

জাভা

geofencingClient.removeGeofences(getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences removed
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to remove geofences
                // ...
            }
        });

আপনি অন্যান্য অবস্থান-সচেতন বৈশিষ্ট্যগুলির সাথে জিওফেন্সিংকে একত্রিত করতে পারেন, যেমন পর্যায়ক্রমিক অবস্থান আপডেট। আরও তথ্যের জন্য, এই ক্লাসের অন্যান্য পাঠগুলি দেখুন।

জিওফেন্সিংয়ের জন্য সেরা অনুশীলনগুলি ব্যবহার করুন

এই বিভাগটি Android-এর জন্য অবস্থান API-এর সাথে জিওফেন্সিং ব্যবহার করার জন্য সুপারিশগুলির রূপরেখা দেয়৷

বিদ্যুত খরচ কমান

জিওফেন্সিং ব্যবহার করে এমন আপনার অ্যাপগুলিতে পাওয়ার খরচ অপ্টিমাইজ করতে আপনি নিম্নলিখিত কৌশলগুলি ব্যবহার করতে পারেন:

  • বিজ্ঞপ্তির প্রতিক্রিয়াশীলতা একটি উচ্চ মান সেট করুন। এটি করার ফলে জিওফেন্স সতর্কতার লেটেন্সি বাড়িয়ে পাওয়ার খরচ উন্নত হয়। উদাহরণস্বরূপ, আপনি যদি পাঁচ মিনিটের একটি প্রতিক্রিয়াশীলতার মান সেট করেন তবে আপনার অ্যাপটি প্রতি পাঁচ মিনিটে একবার প্রবেশদ্বার বা প্রস্থান সতর্কতার জন্য পরীক্ষা করে। নিম্ন মান সেট করার অর্থ এই নয় যে ব্যবহারকারীদের সেই সময়ের মধ্যে অবহিত করা হয়েছে (উদাহরণস্বরূপ, আপনি যদি 5 সেকেন্ডের মান সেট করেন তবে সতর্কতা পেতে তার চেয়ে কিছুটা বেশি সময় লাগতে পারে)।

  • একটি বৃহত্তর জিওফেন্স ব্যাসার্ধের অবস্থানের জন্য ব্যবহার করুন যেখানে একজন ব্যবহারকারী উল্লেখযোগ্য পরিমাণ সময় ব্যয় করেন, যেমন বাড়ি বা কর্মস্থল। যদিও একটি বৃহত্তর ব্যাসার্ধ সরাসরি বিদ্যুতের খরচ কমায় না, এটি অ্যাপটি প্রবেশ বা প্রস্থানের জন্য যে ফ্রিকোয়েন্সি পরীক্ষা করে তা কমিয়ে দেয়, কার্যকরভাবে সামগ্রিক বিদ্যুতের খরচ কমিয়ে দেয়।

আপনার জিওফেন্সের জন্য সর্বোত্তম ব্যাসার্ধ বেছে নিন

সেরা ফলাফলের জন্য, জিওফেন্সের সর্বনিম্ন ব্যাসার্ধ 100 - 150 মিটারের মধ্যে সেট করা উচিত৷ যখন Wi-Fi উপলব্ধ থাকে তখন অবস্থানের নির্ভুলতা সাধারণত 20 - 50 মিটারের মধ্যে হয়৷ অভ্যন্তরীণ অবস্থান উপলব্ধ হলে, সঠিকতার পরিসীমা 5 মিটারের মতো ছোট হতে পারে। আপনি যদি না জানেন যে জিওফেন্সের ভিতরে ইনডোর লোকেশন পাওয়া যায়, ধরে নিন যে Wi-Fi অবস্থানের নির্ভুলতা প্রায় 50 মিটার।

যখন Wi-Fi অবস্থান উপলব্ধ না থাকে (উদাহরণস্বরূপ, আপনি যখন গ্রামীণ এলাকায় গাড়ি চালাচ্ছেন) অবস্থানের যথার্থতা হ্রাস পায়। নির্ভুলতার পরিসর কয়েকশ মিটার থেকে কয়েক কিলোমিটার পর্যন্ত বড় হতে পারে। এই ধরনের ক্ষেত্রে, আপনার একটি বড় ব্যাসার্ধ ব্যবহার করে জিওফেনস তৈরি করা উচিত।

ব্যবহারকারীদের ব্যাখ্যা করুন কেন আপনার অ্যাপ জিওফেন্সিং ব্যবহার করে

যেহেতু আপনি জিওফেন্সিং ব্যবহার করার সময় আপনার অ্যাপটি ব্যাকগ্রাউন্ডে অবস্থান অ্যাক্সেস করে, আপনার অ্যাপ কীভাবে ব্যবহারকারীদের সুবিধা প্রদান করে তা বিবেচনা করুন। ব্যবহারকারীদের বোঝাপড়া এবং স্বচ্ছতা বাড়াতে কেন আপনার অ্যাপের এই অ্যাক্সেস প্রয়োজন তা তাদের স্পষ্টভাবে ব্যাখ্যা করুন।

জিওফেন্সিং সহ অবস্থান অ্যাক্সেস সম্পর্কিত সর্বোত্তম অনুশীলন সম্পর্কে আরও তথ্যের জন্য, গোপনীয়তার সেরা অনুশীলন পৃষ্ঠাটি দেখুন।

সতর্কতা স্প্যাম কমাতে dwell ট্রানজিশন টাইপ ব্যবহার করুন

একটি জিওফেন্স অতিক্রম করার সময় সংক্ষিপ্তভাবে গাড়ি চালানোর সময় আপনি যদি প্রচুর পরিমাণে সতর্কতা পান, তবে সতর্কতা কমানোর সর্বোত্তম উপায় হল GEOFENCE_TRANSITION_ENTER এর পরিবর্তে GEOFENCE_TRANSITION_DWELL এর একটি রূপান্তর প্রকার ব্যবহার করা। এইভাবে, বাসস্থান সতর্কতা তখনই পাঠানো হয় যখন ব্যবহারকারী একটি নির্দিষ্ট সময়ের জন্য জিওফেন্সের ভিতরে থামে। আপনি একটি লোটারিং বিলম্ব সেট করে সময়কাল চয়ন করতে পারেন।

প্রয়োজন হলেই জিওফেন্স পুনরায় নিবন্ধন করুন

com.google.android.gms প্যাকেজের মালিকানাধীন com.google.process.location প্রক্রিয়ায় নিবন্ধিত জিওফেন্সগুলি রাখা হয়৷ নিম্নলিখিত ইভেন্টগুলি পরিচালনা করার জন্য অ্যাপটির কিছু করার দরকার নেই, কারণ এই ইভেন্টগুলির পরে সিস্টেমটি জিওফেন্সগুলি পুনরুদ্ধার করে:

  • Google Play পরিষেবাগুলি আপগ্রেড করা হয়েছে৷
  • রিসোর্স সীমাবদ্ধতার কারণে Google Play পরিষেবাগুলি সিস্টেম দ্বারা মেরে ফেলা হয়েছে এবং পুনরায় চালু করা হয়েছে৷
  • অবস্থান প্রক্রিয়া ক্র্যাশ.

নিম্নলিখিত ইভেন্টগুলির পরেও যদি প্রয়োজন হয় তবে অ্যাপটিকে অবশ্যই জিওফেন্সগুলি পুনরায় নিবন্ধন করতে হবে, যেহেতু সিস্টেম নিম্নলিখিত ক্ষেত্রে জিওফেন্সগুলি পুনরুদ্ধার করতে পারে না:

  • ডিভাইসটি রিবুট করা হয়েছে। অ্যাপটিকে ডিভাইসের বুট সম্পূর্ণ অ্যাকশন শুনতে হবে এবং তারপর প্রয়োজনীয় জিওফেন্সগুলি পুনরায় নিবন্ধন করতে হবে।
  • অ্যাপটি আনইনস্টল করে পুনরায় ইনস্টল করা হয়েছে।
  • অ্যাপের ডেটা সাফ করা হয়েছে।
  • Google Play পরিষেবার ডেটা সাফ করা হয়েছে৷
  • অ্যাপটি একটি GEOFENCE_NOT_AVAILABLE সতর্কতা পেয়েছে। এটি সাধারণত NLP (Android এর নেটওয়ার্ক অবস্থান প্রদানকারী) অক্ষম করার পরে ঘটে।

জিওফেন্স এন্ট্রান্স ইভেন্টের সমস্যা সমাধান করুন

ডিভাইসটি একটি জিওফেন্সে প্রবেশ করার সময় যদি জিওফেন্সগুলি ট্রিগার না হয় ( GEOFENCE_TRANSITION_ENTER সতর্কতাটি ট্রিগার করা হয়নি), প্রথমে নিশ্চিত করুন যে এই নির্দেশিকায় বর্ণিত হিসাবে আপনার জিওফেন্সগুলি সঠিকভাবে নিবন্ধিত হয়েছে৷

এখানে সতর্কতা প্রত্যাশিতভাবে কাজ না করার কিছু সম্ভাব্য কারণ রয়েছে:

  • আপনার জিওফেন্সের ভিতরে সঠিক অবস্থান পাওয়া যায় না বা আপনার জিওফেন্স খুব ছোট। বেশিরভাগ ডিভাইসে, জিওফেন্স সার্ভিস জিওফেন্স ট্রিগারিংয়ের জন্য শুধুমাত্র নেটওয়ার্ক অবস্থান ব্যবহার করে। পরিষেবাটি এই পদ্ধতিটি ব্যবহার করে কারণ নেটওয়ার্ক অবস্থান অনেক কম শক্তি খরচ করে, এটি পৃথক অবস্থানগুলি পেতে কম সময় নেয় এবং সবচেয়ে গুরুত্বপূর্ণভাবে এটি বাড়ির ভিতরে উপলব্ধ।
  • ডিভাইসে Wi-Fi বন্ধ আছে। Wi-Fi চালু থাকলে তা অবস্থানের যথার্থতাকে উল্লেখযোগ্যভাবে উন্নত করতে পারে, তাই যদি Wi-Fi বন্ধ থাকে, তাহলে আপনার অ্যাপ্লিকেশনটি জিওফেন্সের ব্যাসার্ধ, ডিভাইস মডেল বা Android সংস্করণ সহ বিভিন্ন সেটিংসের উপর নির্ভর করে জিওফেন্স সতর্কতা পেতে পারে না। অ্যান্ড্রয়েড 4.3 (এপিআই লেভেল 18) থেকে শুরু করে, আমরা "ওয়াই-ফাই শুধুমাত্র স্ক্যান মোড" এর ক্ষমতা যুক্ত করেছি যা ব্যবহারকারীদের Wi-Fi অক্ষম করতে দেয় কিন্তু তারপরও ভাল নেটওয়ার্ক অবস্থান পেতে পারে। ব্যবহারকারীকে প্রম্পট করা এবং উভয়ই নিষ্ক্রিয় থাকলে শুধুমাত্র Wi-Fi বা Wi-Fi স্ক্যান মোড সক্ষম করার জন্য ব্যবহারকারীর জন্য একটি শর্টকাট প্রদান করা ভাল অভ্যাস। সর্বোত্তম অবস্থান সনাক্তকরণের জন্য ডিভাইসের সিস্টেম সেটিংস সঠিকভাবে কনফিগার করা হয়েছে তা নিশ্চিত করতে SettingsClient ব্যবহার করুন।

    দ্রষ্টব্য: যদি আপনার অ্যাপটি Android 10 (API স্তর 29) বা উচ্চতরকে লক্ষ্য করে, তাহলে আপনি WifiManager.setEnabled() কে সরাসরি কল করতে পারবেন না যদি না আপনার অ্যাপটি একটি সিস্টেম অ্যাপ বা একটি ডিভাইস পলিসি কন্ট্রোলার (DPC) হয়। পরিবর্তে, একটি সেটিংস প্যানেল ব্যবহার করুন৷

  • আপনার জিওফেন্সের ভিতরে কোন নির্ভরযোগ্য নেটওয়ার্ক সংযোগ নেই। কোনো নির্ভরযোগ্য ডেটা সংযোগ না থাকলে, সতর্কতা তৈরি নাও হতে পারে। এর কারণ হল জিওফেন্স পরিষেবা নেটওয়ার্ক অবস্থান প্রদানকারীর উপর নির্ভর করে যার ফলে একটি ডেটা সংযোগ প্রয়োজন৷
  • সতর্কতা দেরী হতে পারে. জিওফেন্স পরিষেবাটি অবিচ্ছিন্নভাবে অবস্থানের জন্য অনুসন্ধান করে না, তাই সতর্কতা পাওয়ার সময় কিছু বিলম্বের আশা করুন। সাধারণত লেটেন্সি 2 মিনিটের কম হয়, এমনকি যখন ডিভাইসটি চলমান থাকে তখনও কম। ব্যাকগ্রাউন্ড লোকেশন লিমিট কার্যকর হলে, লেটেন্সি গড়ে প্রায় 2-3 মিনিট। যদি ডিভাইসটি একটি উল্লেখযোগ্য সময়ের জন্য স্থির থাকে, তবে লেটেন্সি বাড়তে পারে (6 মিনিট পর্যন্ত)।

অতিরিক্ত সম্পদ

জিওফেন্সিং সম্পর্কে আরও জানতে, নিম্নলিখিত উপকরণগুলি দেখুন:

নমুনা

জিওফেন্স তৈরি এবং পর্যবেক্ষণের জন্য নমুনা অ্যাপ