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

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

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

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

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

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

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

  • ACCESS_FINE_LOCATION
  • আপনার অ্যাপ যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে ACCESS_BACKGROUND_LOCATION করুন।

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

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

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

লোকেশন এপিআইগুলো অ্যাক্সেস করতে, আপনাকে জিওফেন্সিং ক্লায়েন্টের একটি ইনস্ট্যান্স তৈরি করতে হবে। আপনার ক্লায়েন্ট কীভাবে সংযোগ করবেন তা জানতে:

কোটলিন

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);
}

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

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

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

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

প্রথমে, 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 ব্যবহার করা শ্রেয় হতে পারে, যা শুধুমাত্র তখনই ইভেন্ট ট্রিগার করে যখন ব্যবহারকারী একটি জিওফেন্সের মধ্যে একটি নির্দিষ্ট সময়ের জন্য থামে। এই পদ্ধতিটি "অ্যালার্ট স্প্যাম" কমাতে সাহায্য করতে পারে, যা কোনো ডিভাইস অল্প সময়ের জন্য জিওফেন্সে প্রবেশ ও প্রস্থান করার ফলে বিপুল সংখ্যক নোটিফিকেশন থেকে তৈরি হয়। আপনার জিওফেন্স থেকে সেরা ফলাফল পাওয়ার আরেকটি কৌশল হলো সর্বনিম্ন ১০০ মিটারের একটি ব্যাসার্ধ নির্ধারণ করা। এটি সাধারণ ওয়াই-ফাই নেটওয়ার্কের অবস্থানের নির্ভুলতা বিবেচনা করতে সাহায্য করে এবং ডিভাইসের বিদ্যুৎ খরচ কমাতেও সহায়ক হয়।

জিওফেন্স পরিবর্তনের জন্য একটি ব্রডকাস্ট রিসিভার নির্ধারণ করুন

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

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

কোটলিন

class MainActivity : AppCompatActivity() {

    // ...

    private val geofencePendingIntent: PendingIntent by lazy {
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        val flags = PendingIntent.FLAG_UPDATE_CURRENT
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
            // Starting on Android S+ the pending intent has to be mutable.
            flags or PendingIntent.FLAG_MUTABLE
        }
        val intent = Intent(this, GeofenceBroadcastReceiver::class.java)
        PendingIntent.getBroadcast(this, 0, intent, flags)
    }

}

জাভা

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (geofencePendingIntent != null) {
          return geofencePendingIntent;
        }
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling
        // addGeofences() and removeGeofences().
        int flags = PendingIntent.FLAG_UPDATE_CURRENT;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) {
            // Starting on Android S+ the pending intent has to be mutable.
            flags |= PendingIntent.FLAG_MUTABLE;
        }
        Intent intent = new Intent(this, GeofenceBroadcastReceiver.class);
        geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, flags);
        return geofencePendingIntent;
   }

}

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

জিওফেন্স যোগ করতে, 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 চালু হয়েছে এবং এরপর এটি Intent থেকে জিওফেন্সিং ইভেন্টটি সংগ্রহ করতে পারে, জিওফেন্স ট্রানজিশন(গুলো)র ধরন নির্ধারণ করতে পারে এবং সংজ্ঞায়িত জিওফেন্সগুলোর মধ্যে কোনটি সক্রিয় হয়েছে তা নির্ণয় করতে পারে। ব্রডকাস্ট রিসিভারটি কোনো অ্যাপকে ব্যাকগ্রাউন্ডে কাজ শুরু করার নির্দেশ দিতে পারে অথবা, চাইলে, আউটপুট হিসেবে একটি নোটিফিকেশন পাঠাতে পারে।

দ্রষ্টব্য: Android 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 । এরপর সার্ভিসটি একটি নোটিফিকেশন পাঠায় এবং ট্রানজিশনের বিস্তারিত তথ্য লগ করে রাখে।

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

যখন আর প্রয়োজন বা কাঙ্ক্ষিত না থাকে, তখন জিওফেন্স মনিটরিং বন্ধ করলে ডিভাইসের ব্যাটারি পাওয়ার এবং সিপিইউ সাইকেল সাশ্রয় হতে পারে। জিওফেন্স যোগ এবং অপসারণ করতে ব্যবহৃত প্রধান অ্যাক্টিভিটিতে আপনি জিওফেন্স মনিটরিং বন্ধ করতে পারেন; একটি জিওফেন্স অপসারণ করলে তা তাৎক্ষণিকভাবে বন্ধ হয়ে যায়। এপিআই-তে রিকোয়েস্ট আইডি দ্বারা, অথবা একটি নির্দিষ্ট 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
                // ...
            }
        });

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

জিওফেন্সিংয়ের জন্য সর্বোত্তম পদ্ধতি ব্যবহার করুন

এই বিভাগে অ্যান্ড্রয়েডের লোকেশন এপিআই-এর সাথে জিওফেন্সিং ব্যবহারের জন্য সুপারিশসমূহ তুলে ধরা হয়েছে।

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

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

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

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

আপনার জিওফেন্সের জন্য সর্বোত্তম ব্যাসার্ধ নির্বাচন করুন।

সর্বোত্তম ফলাফলের জন্য, জিওফেন্সের সর্বনিম্ন ব্যাসার্ধ ১০০ থেকে ১৫০ মিটারের মধ্যে সেট করা উচিত। যখন ওয়াই-ফাই উপলব্ধ থাকে, তখন অবস্থানের নির্ভুলতা সাধারণত ২০ থেকে ৫০ মিটারের মধ্যে থাকে। যখন ইনডোর লোকেশন উপলব্ধ থাকে, তখন নির্ভুলতার পরিসর সর্বনিম্ন ৫ মিটার হতে পারে। যদি না আপনি জানেন যে জিওফেন্সের ভিতরে ইনডোর লোকেশন উপলব্ধ আছে, তাহলে ধরে নিন যে ওয়াই-ফাই লোকেশনের নির্ভুলতা প্রায় ৫০ মিটার।

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

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

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

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

অ্যালার্ট স্প্যাম কমাতে ডওয়েল ট্রানজিশন টাইপ ব্যবহার করুন

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

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

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

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

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

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

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

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

অ্যালার্টগুলো প্রত্যাশা অনুযায়ী কাজ না করার কয়েকটি সম্ভাব্য কারণ নিচে দেওয়া হলো:

  • আপনার জিওফেন্সের ভিতরে সঠিক অবস্থান পাওয়া যাচ্ছে না অথবা আপনার জিওফেন্সটি খুব ছোট। বেশিরভাগ ডিভাইসে, জিওফেন্স পরিষেবাটি জিওফেন্স সক্রিয় করার জন্য শুধুমাত্র নেটওয়ার্ক অবস্থান ব্যবহার করে। পরিষেবাটি এই পদ্ধতি ব্যবহার করে কারণ নেটওয়ার্ক অবস্থানে অনেক কম শক্তি খরচ হয়, সুনির্দিষ্ট অবস্থান পেতে কম সময় লাগে, এবং সবচেয়ে গুরুত্বপূর্ণ হলো এটি বাড়ির ভিতরে উপলব্ধ।
  • ডিভাইসটিতে ওয়াই-ফাই বন্ধ করা আছে। ওয়াই-ফাই চালু থাকলে অবস্থানের নির্ভুলতা উল্লেখযোগ্যভাবে উন্নত হতে পারে, তাই ওয়াই-ফাই বন্ধ থাকলে, জিওফেন্সের ব্যাসার্ধ, ডিভাইসের মডেল বা অ্যান্ড্রয়েড সংস্করণ সহ বিভিন্ন সেটিংসের উপর নির্ভর করে আপনার অ্যাপ্লিকেশনটি হয়তো কখনোই জিওফেন্স অ্যালার্ট পাবে না। অ্যান্ড্রয়েড ৪.৩ (এপিআই লেভেল ১৮) থেকে, আমরা “ওয়াই-ফাই স্ক্যান অনলি মোড” এর সুবিধা যুক্ত করেছি, যা ব্যবহারকারীদের ওয়াই-ফাই নিষ্ক্রিয় রেখেও সঠিক নেটওয়ার্ক লোকেশন পেতে সাহায্য করে। যদি ওয়াই-ফাই এবং ওয়াই-ফাই স্ক্যান অনলি মোড উভয়ই নিষ্ক্রিয় থাকে, তবে ব্যবহারকারীকে একটি প্রম্পট দেখানো এবং এটি চালু করার জন্য একটি শর্টকাট প্রদান করা একটি ভালো অভ্যাস। সর্বোত্তম অবস্থান শনাক্তকরণের জন্য ডিভাইসের সিস্টেম সেটিংস সঠিকভাবে কনফিগার করা আছে কিনা তা নিশ্চিত করতে SettingsClient ব্যবহার করুন।

    দ্রষ্টব্য: আপনার অ্যাপটি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) বা তার উচ্চতর সংস্করণকে টার্গেট করে, তাহলে আপনি সরাসরি WifiManager.setEnabled() কল করতে পারবেন না, যদি না আপনার অ্যাপটি একটি সিস্টেম অ্যাপ বা ডিভাইস পলিসি কন্ট্রোলার (ডিপিসি) হয়। এর পরিবর্তে, একটি সেটিংস প্যানেল ব্যবহার করুন।

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

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

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

নমুনা

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