রানটাইমে অবস্থান অ্যাক্সেস অনুরোধ

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

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

ব্যবহারকারী ‘শেয়ার লোকেশন’ বাটনটি নির্বাচন করার পর, সিস্টেমের লোকেশন পারমিশন ডায়ালগ বক্সটি প্রদর্শিত হয়।
চিত্র ১. অবস্থান শেয়ার করার একটি ফিচার, যার জন্য ফোরগ্রাউন্ড লোকেশন অ্যাক্সেস প্রয়োজন। ব্যবহারকারী ‘শুধুমাত্র অ্যাপ ব্যবহারের সময় অনুমতি দিন’ নির্বাচন করলে ফিচারটি সক্রিয় হয়।

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

অ্যান্ড্রয়েড ১২ (এপিআই লেভেল ৩১) বা তার উচ্চতর সংস্করণে, আপনার অ্যাপ 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 উভয়ের জন্য অনুরোধ করে, তখন সিস্টেম পারমিশন ডায়ালগে ব্যবহারকারীর জন্য নিম্নলিখিত অপশনগুলো অন্তর্ভুক্ত থাকে:

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

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

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

ডায়ালগ বক্সটি শুধুমাত্র আনুমানিক অবস্থান নির্দেশ করে এবং এতে একটির উপরে আরেকটি করে ৩টি বাটন রয়েছে।
চিত্র ২. সিস্টেম পারমিশন ডায়ালগ বক্স যা তখন প্রদর্শিত হয় যখন আপনার অ্যাপ শুধুমাত্র 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
অস্বীকার করুন অবস্থানের কোনো অনুমতি নেই অবস্থানের কোনো অনুমতি নেই

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

কোটলিন

@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 পারমিশনগুলো আবার একসাথে অনুরোধ করুন। যেহেতু ব্যবহারকারী ইতিমধ্যেই আপনার অ্যাপকে আনুমানিক অবস্থান জানানোর জন্য সিস্টেমকে অনুমতি দিয়েছেন, তাই এবার সিস্টেম ডায়ালগটি ভিন্ন হবে, যেমনটি চিত্র ৪ এবং চিত্র ৫-এ দেখানো হয়েছে:
ডায়ালগ বক্সে 'সুনির্দিষ্ট অবস্থানে পরিবর্তন করুন', 'শুধুমাত্র এইবারের জন্য', এবং 'অস্বীকার করুন' বিকল্পগুলো রয়েছে।
চিত্র ৪। ব্যবহারকারী পূর্বে ( চিত্র ৩- এর ডায়ালগ বক্সে) ‘Approximate’ এবং ‘ While using the app’ নির্বাচন করেছিলেন।
ডায়ালগ বক্সে 'শুধুমাত্র এইবারের জন্য' এবং 'অস্বীকার করুন' বিকল্প দুটি রয়েছে।
চিত্র ৫। ব্যবহারকারী পূর্বে ( চিত্র ৩- এর ডায়ালগ বক্সে) ‘আনুমানিক’ এবং ‘শুধুমাত্র এইবার’ নির্বাচন করেছিলেন।

প্রাথমিকভাবে শুধুমাত্র সম্মুখভাগের অবস্থানের জন্য অনুরোধ করুন

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

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

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

ক্রমবর্ধমান অনুরোধগুলি সম্পাদন করার প্রক্রিয়াটি নিম্নরূপ:

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

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

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

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

অ্যান্ড্রয়েডে অবস্থান অনুমতি সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত উপকরণগুলি দেখুন:

কোডল্যাবস

ভিডিও

নমুনা