রানটাইমে লোকেশন অ্যাক্সেস করার অনুরোধ করা

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

লোকেশন অ্যাক্সেস করার অনুমতি সংক্রান্ত নির্দেশিকা

আপনার অ্যাপে লোকেশন অ্যাক্সেস কীভাবে প্রয়োগ করবেন সেই বিষয়ে সিদ্ধান্ত নেওয়ার সময় কিছু সাধারণ নিয়ম অনুসরণ করতে হবে।

প্রসঙ্গ অনুযায়ী লোকেশন অ্যাক্সেস করুন

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

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

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

ব্যবহারকারী শুধুমাত্র আনুমানিক লোকেশন অ্যাক্সেস করার অনুমতি দিতে পারবেন

Android 12 (API লেভেল 31) বা তার পরবর্তী ভার্সনে, ব্যবহারকারী আপনার অ্যাপকে শুধুমাত্র আনুমানিক লোকেশন তথ্য উদ্ধার করার অনুরোধ করতে পারেন, এমনকি আপনার অ্যাপ ACCESS_FINE_LOCATION রানটাইম অনুমতির অনুরোধ করলেও।

ব্যবহারকারীর এই সম্ভাব্য আচরণ ম্যানেজ করতে, ACCESS_FINE_LOCATION অনুমতির জন্য নিজে থেকে অনুরোধ করবেন না। পরিবর্তে, একটি রানটাইম অনুরোধে ACCESS_FINE_LOCATION অনুমতি এবং ACCESS_COARSE_LOCATION অনুমতি, দুটিই অনুরোধ করুন। আপনি শুধু ACCESS_FINE_LOCATION-এর জন্য অনুরোধ করার চেষ্টা করলে, Android 12-এর কিছু রিলিজে সিস্টেম অনুরোধটি উপেক্ষা করে। আপনার অ্যাপ যদি Android 12 বা তার পরবর্তী ভার্সনকে টার্গেট করে, তাহলে সিস্টেম Logcat-এ নিম্নলিখিত ত্রুটি মেসেজ লগ করে:

ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

আপনার অ্যাপ ACCESS_FINE_LOCATION এবং ACCESS_COARSE_LOCATION, দুটিরই অনুরোধ করলে, সিস্টেম অনুমতির ডায়ালগে ব্যবহারকারীর জন্য নিম্নলিখিত বিকল্পগুলি অন্তর্ভুক্ত থাকে:

  • সুনির্দিষ্ট: আপনার অ্যাপকে সুনির্দিষ্ট লোকেশন সংক্রান্ত তথ্য পাওয়ার অনুমতি দেয়।
  • আনুমানিক: আপনার অ্যাপকে শুধুমাত্র আনুমানিক লোকেশন তথ্য পেতে দেয়।

ছবি ৩-এ দেখানো হয়েছে যে ডায়ালগে দুটি বিকল্পের জন্যই ভিজ্যুয়াল ইঙ্গিত রয়েছে, যাতে ব্যবহারকারী সহজেই বেছে নিতে পারেন। ব্যবহারকারী লোকেশন অ্যাকুরেসি সম্পর্কে সিদ্ধান্ত নেওয়ার পরে, অনুমতি দেওয়ার সময়সীমা বেছে নিতে তিনটি বোতামের মধ্যে একটিতে ট্যাপ করেন।

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

ডায়ালগটি শুধুমাত্র আনুমানিক লোকেশনকে বোঝায় এবং
         এতে ৩টি বোতাম থাকে, একটির উপরে আরেকটি
ছবি ২. সিস্টেম অনুমতির ডায়ালগ যা আপনার অ্যাপ শুধুমাত্র ACCESS_COARSE_LOCATION-এর জন্য অনুরোধ করলে দেখা যায়।
ডায়ালগে ২ সেট বিকল্প আছে, একটির উপরে আরেকটি
ছবি ৩. সিস্টেম অনুমতির ডায়ালগ যা আপনার অ্যাপ একক রানটাইম অনুরোধে ACCESS_FINE_LOCATION এবং ACCESS_COARSE_LOCATION দুটিরই অনুরোধ করলে দেখা যায়।

ব্যবহারকারীর পছন্দ অনুমতি প্রদানের উপর প্রভাব ফেলে

রানটাইম ডায়ালগে ব্যবহারকারীর বেছে নেওয়া বিকল্পের উপর ভিত্তি করে সিস্টেম আপনার অ্যাপকে যেসব অনুমতি দেয়, সেগুলি নিম্নলিখিত সারণীতে দেখানো হয়েছে:

সুনির্দিষ্ট নিকটবর্তী
অ্যাপ ব্যবহার করাকালীন ACCESS_FINE_LOCATION এবং
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
শুধুমাত্র এই সময় ACCESS_FINE_LOCATION এবং
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
বাতিল করুন লোকেশন অ্যাক্সেস করার অনুমতি নেই লোকেশন অ্যাক্সেস করার অনুমতি নেই

সিস্টেম আপনার অ্যাপকে কোন কোন অনুমতি দিয়েছে তা নির্ধারণ করতে, আপনার অনুমতির অনুরোধের রিটার্ন ভ্যালু চেক করুন। আপনি কোডে Jetpack লাইব্রেরি ব্যবহার করতে পারেন যা নিম্নলিখিত কোডের মতো, অথবা আপনি প্ল্যাটফর্ম লাইব্রেরি ব্যবহার করতে পারেন, যেখানে আপনি অনুমতির অনুরোধের কোড নিজেই ম্যানেজ করেন।

Kotlin

@RequiresApi(Build.VERSION_CODES.N)
fun requestPermissions() {
    val locationPermissionRequest = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        when {
            permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
                // Precise location access granted.
            }
            permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
                // Only approximate location access granted.
            }
            else -> {
                // No location access granted.
            }
        }
    }

    // Before you perform the actual permission request, check whether your app
    // already has the permissions, and whether your app needs to show a permission
    // rationale dialog. For more details, see Request permissions:
    // https://developer.android.com/training/permissions/requesting#request-permission
    locationPermissionRequest.launch(
        arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )
}

জাভা

private void requestPermissions() {

    ActivityResultLauncher<String[]> locationPermissionRequest =
            registerForActivityResult(new ActivityResultContracts
                            .RequestMultiplePermissions(), result -> {

                Boolean fineLocationGranted = null;
                Boolean coarseLocationGranted = null;

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    fineLocationGranted = result.getOrDefault(
                            Manifest.permission.ACCESS_FINE_LOCATION, false);
                    coarseLocationGranted = result.getOrDefault(
                            Manifest.permission.ACCESS_COARSE_LOCATION,false);
                }

                if (fineLocationGranted != null && fineLocationGranted) {
                    // Precise location access granted.
                } else if (coarseLocationGranted != null && coarseLocationGranted) {
                    // Only approximate location access granted.
                } else {
                    // No location access granted.
                }
            }
        );

    // ...

    // Before you perform the actual permission request, check whether your app
    // already has the permissions, and whether your app needs to show a permission
    // rationale dialog. For more details, see Request permissions.
    locationPermissionRequest.launch(new String[] {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
    });
}

সুনির্দিষ্ট লোকেশন অ্যাক্সেস করার জন্য আপগ্রেড করার অনুরোধ করুন

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

ব্যবহারকারীকে আপনার অ্যাপের লোকেশন অ্যাক্সেস আনুমানিক থেকে সুনির্দিষ্ট লোকেশনে আপগ্রেড করার অনুরোধ করতে, নিম্নলিখিত কাজগুলি করুন:

  1. প্রয়োজন হলে, আপনার অ্যাপের কেন অনুমতি প্রয়োজন তা ব্যাখ্যা করুন।
  2. ACCESS_FINE_LOCATION এবং ACCESS_COARSE_LOCATION অনুমতির জন্য আবার একসাথে অনুরোধ করুন। ব্যবহারকারী আগে থেকেই আপনার অ্যাপকে আনুমানিক লোকেশন অ্যাক্সেস করার অনুমতি দিয়ে রেখেছেন, তাই সিস্টেম ডায়ালগ এইবার আলাদা, যেমন ছবি ৪ ও ছবি ৫-এ দেখানো হয়েছে:
ডায়ালগে 'সুনির্দিষ্ট লোকেশনে পরিবর্তন করুন', 'শুধুমাত্র এইবার' এবং 'প্রত্যাখ্যান করুন' বিকল্পগুলি রয়েছে।
ছবি ৪. ব্যবহারকারী আগে আনুমানিক এবং অ্যাপ ব্যবহার করার সময় (ছবি ৩-এর ডায়ালগ থেকে) বিকল্প বেছে নিয়েছেন।
ডায়ালগে 'শুধুমাত্র এইবার' এবং
         'প্রত্যাখ্যান করুন' বিকল্প থাকে।
ছবি ৫. ব্যবহারকারী আগে আনুমানিক এবং শুধুমাত্র এইবার বিকল্প বেছে নিয়েছেন (ছবি ৩-এর ডায়ালগ থেকে)।

প্রথমে শুধু ফোরগ্রাউন্ড লোকেশন অ্যাক্সেস করার অনুরোধ করুন

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

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

যে বোতামটি ফোরগ্রাউন্ড লোকেশন অ্যাক্সেস চালু করে সেটি
    ব্যাকগ্রাউন্ড লোকেশন চালু করার বোতাম থেকে স্ক্রিনের দৈর্ঘ্যের অর্ধেক দূরত্বে
    অবস্থিত
ছবি ৬. দুটি ফিচারের ক্ষেত্রেই লোকেশন অ্যাক্সেস প্রয়োজন, তবে শুধুমাত্র "আশেপাশের ফিচার সাজেস্ট করুন" ফিচারের জন্য ব্যাকগ্রাউন্ড লোকেশন অ্যাক্সেস প্রয়োজন।

ইনক্রিমেন্টাল অনুরোধ করার প্রসেস নিচে দেওয়া হল:

  1. প্রথমে, আপনার অ্যাপ ব্যবহারকারীদের সেইসব ফিচারের দিকে নিয়ে যাবে যেগুলির জন্য ফোরগ্রাউন্ড লোকেশন অ্যাক্সেস প্রয়োজন, যেমন ছবি ১-এ "লোকেশন শেয়ার করুন" ফিচার বা ছবি ২-এ "বর্তমান লোকেশন দেখুন" ফিচার।

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

  2. পরবর্তী সময়ে, ব্যবহারকারী যখন ব্যাকগ্রাউন্ড লোকেশন অ্যাক্সেস প্রয়োজন এমন ফিচার এক্সপ্লোর করেন, তখন আপনি ব্যাকগ্রাউন্ড লোকেশন অ্যাক্সেসের অনুরোধ করতে পারেন।

অতিরিক্ত রিসোর্স

Android-এ লোকেশন সংক্রান্ত অনুমতির বিষয়ে আরও তথ্যের জন্য, নিম্নলিখিত মেটেরিয়াল দেখুন:

কোডল্যাবস

ভিডিও

নমুনা