জিওফেন্সিং ব্যবহারকারীর বর্তমান লোকেশন সম্পর্কে সচেতনতার সাথে ব্যবহারকারীর আগ্রহ থাকতে পারে এমন লোকেশনের নৈকট্য সম্পর্কে সচেতনতাকে একত্রিত করে। কোনও প্রাসঙ্গিক লোকেশন চিহ্নিত করতে, আপনাকে সেটির অক্ষাংশ ও দ্রাঘিমাংশ উল্লেখ করতে হবে। লোকেশন কতটা কাছাকাছি তা অ্যাডজাস্ট করতে, আপনি ব্যাসার্ধ যোগ করেন। অক্ষাংশ, দ্রাঘিমাংশ এবং ব্যাসার্ধ একটি জিওফেন্সকে সংজ্ঞায়িত করে, যা প্রাসঙ্গিক লোকেশনের চারপাশে একটি বৃত্তাকার এলাকা বা বেড়া তৈরি করে।
আপনার একাধিক অ্যাক্টিভ জিওফেন্স থাকতে পারে, যার সীমা অ্যাপ প্রতি ১০০টি, ডিভাইস ব্যবহারকারী প্রতি। প্রতিটি জিওফেন্সের জন্য, আপনি লোকেশন পরিষেবাকে প্রবেশ এবং প্রস্থান ইভেন্ট পাঠাতে বলতে পারেন, অথবা আপনি কোনও ইভেন্ট ট্রিগার করার আগে অপেক্ষা করতে বা থাকতে জিওফেন্স এলাকার মধ্যে একটি সময়কাল নির্দিষ্ট করতে পারেন। আপনি মিলি সেকেন্ডে মেয়াদ শেষ হওয়ার সময় উল্লেখ করে যেকোনও জিওফেন্সের সময়সীমা সীমিত করতে পারবেন। জিওফেন্সের মেয়াদ শেষ হয়ে গেলে, লোকেশন পরিষেবা অটোমেটিক এটি সরিয়ে দেয়।
এই পাঠে আপনি শিখবেন কীভাবে জিওফেন্স যোগ করতে ও সরাতে হয় এবং তারপর BroadcastReceiver ব্যবহার করে জিওফেন্স ট্রানজিশন
শুনতে হয়।
মনে রাখবেন: Wear ডিভাইসে, Geofencing API দক্ষতার সাথে ব্যাটারি ব্যবহার করে না। আমরা Wear-এ এইসব API সাজেস্ট করি না। আরও তথ্যের জন্য পাওয়ার ও ব্যাটারি সাশ্রয় করুন নিবন্ধটি পড়ুন।
জিওফেন্স মনিটরিংয়ের জন্য সেট-আপ করা
জিওফেন্স মনিটরিংয়ের অনুরোধ করার প্রথম ধাপ হল প্রয়োজনীয় অনুমতির জন্য অনুরোধ করা। জিওফেন্সিং ব্যবহার করতে, আপনার অ্যাপকে নিম্নলিখিত অনুরোধ করতে হবে:
-
ACCESS_FINE_LOCATION -
ACCESS_BACKGROUND_LOCATIONআপনার অ্যাপ Android 10 (API লেভেল 29) বা তার পরবর্তী যেকোনও ভার্সনকে টার্গেট করলে
আরও জানতে, কীভাবে লোকেশন সংক্রান্ত অনুমতি চাইবেন সেই সম্পর্কিত নির্দেশিকা দেখুন।
আপনি যদি জিওফেন্স ট্রানজিশন শোনার জন্য BroadcastReceiver ব্যবহার করতে চান,
তাহলে পরিষেবার নাম উল্লেখ করে একটি এলিমেন্ট যোগ করুন। এই এলিমেন্টটি অবশ্যই
<application> এলিমেন্টের চাইল্ড হতে হবে:
<application android:allowBackup="true"> ... <receiver android:name=".GeofenceBroadcastReceiver"/> <application/>
লোকেশন API অ্যাক্সেস করতে, আপনাকে জিওফেন্সিং ক্লায়েন্টের ইনস্ট্যান্স তৈরি করতে হবে। আপনার ক্লায়েন্টকে কীভাবে কানেক্ট করবেন তা জানতে:
Kotlin
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 সংজ্ঞায়িত করতে পারেন।
মনে রাখবেন: একজন ব্যবহারকারী ব্যবহার করেন এমন ডিভাইসে, অ্যাপ প্রতি ১০০টি জিওফেন্সের সীমা রয়েছে। একাধিক ব্যবহারকারী ব্যবহার করেন এমন ডিভাইসে, ডিভাইস ব্যবহারকারী প্রতি অ্যাপ প্রতি ১০০টি জিওফেন্সের সীমা রয়েছে।
জিওফেন্স অবজেক্ট তৈরি করুন
প্রথমে, জিওফেন্সের জন্য পছন্দসই ব্যাসার্ধ, সময়সীমা ও ট্রানজিশনের ধরন সেট করে,
জিওফেন্স তৈরি করতে
Geofence.Builder ব্যবহার করুন। যেমন, কোনও তালিকা অবজেক্ট পপুলেট করতে:
Kotlin
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 ক্লাস ব্যবহার করে
মনিটর করার জন্য জিওফেন্স নির্দিষ্ট করে এবং কীভাবে সম্পর্কিত জিওফেন্স ইভেন্ট ট্রিগার করা হয় তা সেট করে:
Kotlin
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 শুরু করে:
Kotlin
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 প্রদান করুন।
নিম্নলিখিত স্নিপেট ফলাফল প্রসেস করার বিষয়টি দেখায়:
Kotlin
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 চালু করা হয়েছে এবং
তারপর ইনটেন্ট থেকে জিওফেন্সিং ইভেন্ট পেতে পারে, জিওফেন্স ট্রানজিশনের ধরন নির্ধারণ করতে পারে
এবং কোন নির্দিষ্ট জিওফেন্স ট্রিগার করা হয়েছে তা নির্ধারণ করতে পারে। সম্প্রচার
রিসিভার কোনও অ্যাপকে ব্যাকগ্রাউন্ডে কাজ শুরু করার নির্দেশ দিতে পারে অথবা, প্রয়োজন হলে, আউটপুট হিসেবে বিজ্ঞপ্তি পাঠাতে পারে।
মনে রাখবেন: Android 8.0 (API লেভেল ২৬) এবং তার পরবর্তী যেকোনও ভার্সনে, জিওফেন্স মনিটর করার সময় কোনও অ্যাপ ব্যাকগ্রাউন্ডে চলতে থাকলে, ডিভাইসটি প্রতি কয়েক মিনিট অন্তর জিওফেন্সিং ইভেন্টে রেসপন্স করে। এইসব রেসপন্স সীমার সাথে আপনার অ্যাপকে কীভাবে মানানসই করে তুলবেন তা জানতে, ব্যাকগ্রাউন্ড লোকেশন সীমা দেখুন।
নিম্নলিখিত স্নিপেট থেকে বোঝা যাবে যে কীভাবে একটি
BroadcastReceiver
সংজ্ঞায়িত করতে হয় যা জিওফেন্স ট্রানজিশন হলে বিজ্ঞপ্তি পোস্ট করে। ব্যবহারকারী বিজ্ঞপ্তিতে
ক্লিক করলে, অ্যাপের প্রধান অ্যাক্টিভিটি দেখা যায়:
Kotlin
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
। পরিষেবাটি তখন একটি বিজ্ঞপ্তি পাঠায় এবং ট্রানজিশনের বিবরণ লগ করে।
জিওফেন্স মনিটর করা বন্ধ করুন
জিওফেন্স মনিটর করার আর প্রয়োজন না থাকলে বা আপনি না চাইলে, সেটি বন্ধ করে দিলে ডিভাইসের ব্যাটারি
পাওয়ার ও সিপিইউ সাইকেল সাশ্রয় করতে সাহায্য করতে পারে। আপনি জিওফেন্স মনিটর করা বন্ধ করতে পারেন
জিওফেন্স যোগ ও সরানোর জন্য ব্যবহৃত মূল অ্যাক্টিভিটিতে; জিওফেন্স সরিয়ে দিলে এটি সাথে সাথে
বন্ধ হয়ে যায়। API-তে অনুরোধ আইডি অথবা প্রদত্ত PendingIntent-এর সাথে যুক্ত জিওফেন্স সরানোর মাধ্যমে
জিওফেন্স সরানোর পদ্ধতি
দেওয়া আছে।
নিম্নলিখিত স্নিপেট PendingIntent-এর মাধ্যমে জিওফেন্স সরিয়ে দেয়, ডিভাইস আগে যোগ করা জিওফেন্সে প্রবেশ করলে বা সেখান থেকে বেরিয়ে গেলে
আরও বিজ্ঞপ্তি পাঠানো বন্ধ করে দেয়:
Kotlin
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-এর সাথে জিওফেন্সিং ব্যবহার করার জন্য সাজেশন দেওয়া হয়েছে।
বিদ্যুৎ খরচ কমানো
জিওফেন্সিং ব্যবহার করে এমন অ্যাপে ব্যাটারি খরচ অপ্টিমাইজ করতে আপনি নিম্নলিখিত কৌশলগুলি ব্যবহার করতে পারেন:
বিজ্ঞপ্তির রেসপন্সিভনেস আরও বেশি ভ্যালুতে সেট করুন। এটি করলে জিওফেন্স অ্যালার্টের লেটেন্সি বাড়িয়ে বিদ্যুতের খরচ উন্নত করা যায়। যেমন, আপনি যদি রেসপন্সিভনেস ভ্যালু পাঁচ মিনিট সেট করেন, তাহলে আপনার অ্যাপ প্রতি পাঁচ মিনিটে একবার প্রবেশ বা প্রস্থান সংক্রান্ত অ্যালার্ট চেক করে। কম ভ্যালু সেট করার অর্থ এই নয় যে ব্যবহারকারীকে সেই সময়সীমার মধ্যেই বিজ্ঞপ্তি পাঠানো হবে (যেমন, আপনি ৫ সেকেন্ডের ভ্যালু সেট করলে, বিজ্ঞপ্তি পেতে এর থেকে একটু বেশি সময় লাগতে পারে)।
ব্যবহারকারী যেখানে বেশি সময় কাটান, যেমন বাড়ি বা অফিস, সেখানে জিওফেন্সের ব্যাসার্ধ বেশি রাখুন। ব্যাসার্ধ বড় হলে সরাসরি বিদ্যুৎ খরচ কমে না, তবে অ্যাপটি কত ঘন ঘন প্রবেশ বা প্রস্থান চেক করে তা কমে যায়, যার ফলে সামগ্রিক বিদ্যুৎ খরচ কার্যকরভাবে কমে যায়।
আপনার জিওফেন্সের জন্য সবচেয়ে উপযুক্ত রেডিয়াস বেছে নিন
সেরা ফলাফলের জন্য, জিওফেন্সের ন্যূনতম ব্যাসার্ধ ১০০ - ১৫০ মিটারের মধ্যে সেট করা উচিত। ওয়াই-ফাই উপলভ্য থাকলে লোকেশন অ্যাকুরেসি সাধারণত ২০ - ৫০ মিটারের মধ্যে হয়। ইনডোর লোকেশন উপলভ্য থাকলে, অ্যাকুরেসি রেঞ্জ ৫ মিটারের মতো ছোট হতে পারে। জিওফেন্সের মধ্যে ইনডোর লোকেশন উপলভ্য আছে কিনা তা না জানলে, ওয়াই-ফাই লোকেশন অ্যাকুরেসি প্রায় ৫০ মিটার বলে ধরে নিন।
ওয়াই-ফাই লোকেশন উপলভ্য না থাকলে (যেমন, আপনি গ্রামাঞ্চলে গাড়ি চালালে) লোকেশন অ্যাকুরেসি কমে যায়। নির্ভুলতার রেঞ্জ কয়েকশো মিটার থেকে কয়েক কিলোমিটার পর্যন্ত হতে পারে। এই ধরনের ক্ষেত্রে, আপনাকে আরও বড় ব্যাসার্ধ ব্যবহার করে জিওফেন্স তৈরি করতে হবে।
আপনার অ্যাপ কেন জিওফেন্সিং ব্যবহার করে তা ব্যবহারকারীদের ব্যাখ্যা করুন
জিওফেন্সিং ব্যবহার করার সময় আপনার অ্যাপ ব্যাকগ্রাউন্ডে লোকেশন অ্যাক্সেস করে, তাই আপনার অ্যাপ কীভাবে ব্যবহারকারীদের সুবিধা প্রদান করে তা বিবেচনা করুন। ব্যবহারকারীর বোঝা ও স্বচ্ছতা বাড়াতে, আপনার অ্যাপের কেন এই অ্যাক্সেস প্রয়োজন তা তাদের স্পষ্টভাবে ব্যাখ্যা করুন।
জিওফেন্সিং সহ লোকেশন অ্যাক্সেস সম্পর্কিত পেশাদার পদ্ধতি সম্পর্কে আরও তথ্যের জন্য, গোপনীয়তা সংক্রান্ত পেশাদার পদ্ধতি পৃষ্ঠা দেখুন।
সতর্কতা স্প্যাম কমাতে ডুয়েল ট্রানজিশন টাইপ ব্যবহার করুন
আপনি যদি জিওফেন্সের পাশ দিয়ে অল্প সময়ের জন্য গাড়ি চালিয়ে যাওয়ার সময় অনেক বেশি সংখ্যক সতর্কতা পান, তাহলে সতর্কতা কমানোর সবচেয়ে ভালো উপায় হল
GEOFENCE_TRANSITION_ENTER-এর পরিবর্তে
GEOFENCE_TRANSITION_DWELL ট্রানজিশন টাইপ ব্যবহার করা। এইভাবে, ব্যবহারকারী নির্দিষ্ট সময়সীমার জন্য জিওফেন্সের মধ্যে
থামলে তবেই ডুয়েলিং অ্যালার্ট পাঠানো হয়। আপনি
ঘোরাঘুরি করার বিলম্ব সেট করে সময়সীমা বেছে নিতে পারবেন।
শুধুমাত্র প্রয়োজন হলে জিওফেন্স আবার রেজিস্টার করুন
রেজিস্টার করা জিওফেন্স com.google.process.location প্রসেসে রাখা হয় যার মালিকানা
com.google.android.gms প্যাকেজের কাছে থাকে।
নিম্নলিখিত ইভেন্টগুলি ম্যানেজ করার জন্য অ্যাপটিকে কিছু করতে হবে না, কারণ সিস্টেম
এই ইভেন্টগুলির পরে জিওফেন্স রিস্টোর করে:
- Google Play পরিষেবা আপগ্রেড করা হয়েছে।
- রিসোর্স সংক্রান্ত বিধিনিষেধের কারণে সিস্টেম Google Play পরিষেবা বন্ধ করে আবার চালু করেছে।
- লোকেশন প্রসেস ক্র্যাশ করে।
নিম্নলিখিত ইভেন্টের পরেও যদি জিওফেন্সের প্রয়োজন হয়, তাহলে অ্যাপটিকে অবশ্যই জিওফেন্স আবার রেজিস্টার করতে হবে, কারণ সিস্টেম নিম্নলিখিত ক্ষেত্রে জিওফেন্স ফিরিয়ে আনতে পারে না:
- ডিভাইস রিবুট করা হয়েছে। অ্যাপটি ডিভাইসের বুট সম্পূর্ণ করার অ্যাকশন শুনবে এবং তারপরে প্রয়োজনীয় জিওফেন্সগুলি আবার রেজিস্টার করবে।
- অ্যাপটি আনইনস্টল করে আবার ইনস্টল করা হয়।
- অ্যাপের ডেটা মুছে ফেলা হয়েছে।
- Google Play পরিষেবার ডেটা মুছে ফেলা হয়েছে।
- অ্যাপে
GEOFENCE_NOT_AVAILABLEটি সতর্কতা এসেছে। NLP (Android-এর নেটওয়ার্ক লোকেশন প্রোভাইডার) বন্ধ করে দেওয়ার পরে সাধারণত এটি হয়।
জিওফেন্স এন্ট্রান্স ইভেন্ট সংক্রান্ত সমস্যার সমাধান করা
ডিভাইস জিওফেন্সে প্রবেশ করার সময় জিওফেন্স ট্রিগার না হলে
(
GEOFENCE_TRANSITION_ENTER অ্যালার্ট ট্রিগার না হলে), প্রথমে নিশ্চিত করুন যে আপনার জিওফেন্স
এই গাইডে যেভাবে বর্ণনা করা হয়েছে সেইভাবে সঠিকভাবে রেজিস্টার করা হয়েছে।
অ্যালার্ট প্রত্যাশা অনুযায়ী কাজ না করার কিছু সম্ভাব্য কারণ এখানে দেওয়া হল:
- আপনার জিওফেন্সের মধ্যে সঠিক লোকেশন উপলভ্য নেই অথবা আপনার জিওফেন্স খুব ছোট। বেশিরভাগ ডিভাইসে, জিওফেন্স ট্রিগার করার জন্য জিওফেন্স পরিষেবা শুধুমাত্র নেটওয়ার্ক লোকেশন ব্যবহার করে। পরিষেবাটি এই পদ্ধতি ব্যবহার করে কারণ নেটওয়ার্ক লোকেশন অনেক কম পাওয়ার খরচ করে, এটি বিচ্ছিন্ন লোকেশন পেতে কম সময় নেয় এবং সবচেয়ে গুরুত্বপূর্ণভাবে এটি ঘরের ভিতরেও উপলভ্য।
ডিভাইসে ওয়াই-ফাই বন্ধ করা আছে। ওয়াই-ফাই চালু থাকলে লোকেশন অ্যাকুরেসি উল্লেখযোগ্যভাবে উন্নত হতে পারে, তাই ওয়াই-ফাই বন্ধ থাকলে, জিওফেন্সের ব্যাসার্ধ, ডিভাইসের মডেল বা Android ভার্সন সহ বিভিন্ন সেটিংসের উপর নির্ভর করে আপনার অ্যাপ্লিকেশন হয়ত কখনই জিওফেন্স অ্যালার্ট পাবে না। Android 4.3 (API লেভেল ১৮) থেকে শুরু করে, আমরা "শুধু ওয়াই-ফাই স্ক্যান মোড" যোগ করেছি যা ব্যবহারকারীদের ওয়াই-ফাই বন্ধ করার পরেও নেটওয়ার্ক লোকেশন পেতে সাহায্য করে। ব্যবহারকারীকে প্রম্পট করা এবং ওয়াই-ফাই বা ওয়াই-ফাই স্ক্যান মোড, দুটির মধ্যে কোনওটিই চালু না থাকলে, তা চালু করার জন্য শর্টকাট প্রদান করা ভালো অভ্যাস। SettingsClient ব্যবহার করে নিশ্চিত করুন যে ডিভাইসের সিস্টেম সেটিংস, লোকেশন শনাক্ত করার জন্য সঠিকভাবে কনফিগার করা আছে।
মনে রাখবেন: আপনার অ্যাপ Android 10 (API লেভেল ২৯) বা তার চেয়ে উন্নত ভার্সনকে টার্গেট করলে, আপনার অ্যাপ সিস্টেম অ্যাপ বা ডিভাইস নীতি কন্ট্রোলার (DPC) না হলে, আপনি সরাসরি
WifiManager.setEnabled()কল করতে পারবেন না। পরিবর্তে, সেটিংস প্যানেল ব্যবহার করুন।- আপনার জিওফেন্সের মধ্যে কোনও নির্ভরযোগ্য নেটওয়ার্ক কানেক্টিভিটি নেই। কোনও নির্ভরযোগ্য ডেটা কানেকশন না থাকলে, সতর্কতা তৈরি নাও হতে পারে। কারণ জিওফেন্স পরিষেবা নেটওয়ার্ক লোকেশন প্রদানকারীর উপর নির্ভর করে, যার জন্য ডেটা কানেকশন প্রয়োজন।
- সতর্কতা পেতে দেরি হতে পারে। জিওফেন্স পরিষেবা লোকেশনের জন্য ক্রমাগত কোয়েরি করে না, তাই সতর্কতা পাওয়ার সময় কিছুটা লেটেন্সি আশা করুন। সাধারণত লেটেন্সি ২ মিনিটের কম হয়, ডিভাইসটি চলতে থাকলে আরও কম হয়। ব্যাকগ্রাউন্ড লোকেশন সীমা কার্যকর থাকলে, লেটেন্সি গড়ে ২-৩ মিনিট হয়। ডিভাইসটি যদি দীর্ঘ সময় ধরে স্থির থাকে, তাহলে লেটেন্সি বেড়ে যেতে পারে (৬ মিনিট পর্যন্ত)।
অতিরিক্ত রিসোর্স
জিওফেন্সিং সম্পর্কে আরও জানতে, নিম্নলিখিত মেটেরিয়াল দেখুন:
নমুনা
জিওফেন্স তৈরি ও মনিটর করার জন্য স্যাম্পেল অ্যাপ।