Google Play পরিষেবা এবং রানটাইম অনুমতি

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

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

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

পূর্বশর্ত

আপনাকে আপনার AndroidManifest.xml ফাইলে অনুমতিগুলি ঘোষণা করতে হবে৷ যেমন:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

নির্দেশিকা

API কল করার আগে অনুমতি যাচাই করুন

একবার আপনি আপনার AndroidManifest.xml ফাইলে যে APIগুলি ব্যবহার করতে চান সেগুলি ঘোষণা করলে, একটি API কল করার আগে আপনার প্রয়োজনীয় অনুমতি আছে কিনা তা যাচাই করুন৷ এটি ActivityCompat বা ContextCompat এর checkSelfPermission পদ্ধতি ব্যবহার করে করা যেতে পারে।

যদি কলটি মিথ্যা হয় তবে এর অর্থ হল অনুমতিগুলি মঞ্জুর করা হয়নি এবং আপনাকে অনুরোধ করার জন্য requestPermissions ব্যবহার করা উচিত। এটির প্রতিক্রিয়া একটি কলব্যাকে ফিরে আসে যা আপনি পরবর্তী ধাপে দেখতে পাবেন।

যেমন:

কোটলিন

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
            // Request Permissions Now
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                REQUEST_LOCATION_PERMISSION_CODE)
    } else {
        // permission has been granted, continue as usual
        val locationResult = LocationServices
            .getFusedLocationProviderClient(this /* Context */)
            .lastLocation
    }

জাভা

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
        // Request Permissions Now
        ActivityCompat.requestPermissions(
            this,
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
            REQUEST_LOCATION_PERMISSION_CODE);
    } else {
        // permission has been granted, continue as usual
        Task locationResult = LocationServices
            .getFusedLocationProviderClient(this /** Context */)
            .getLastLocation();
    }

অনুরোধ অনুমতি কলব্যাক বাস্তবায়ন

আপনার অ্যাপের প্রয়োজনীয় অনুমতি ব্যবহারকারীর দ্বারা মঞ্জুর করা না হলে, ব্যবহারকারীকে অনুমতি দিতে অনুরোধ করার জন্য requestPermissions পদ্ধতিটি কল করা উচিত। ব্যবহারকারীর প্রতিক্রিয়া onRequestPermissionsResult কলব্যাকে ক্যাপচার করা হয়। আপনার অ্যাপটিকে এটি বাস্তবায়ন করা উচিত এবং সর্বদা রিটার্ন মান পরীক্ষা করা উচিত কারণ অনুরোধটি অস্বীকার বা বাতিল করা যেতে পারে। আপনি একবারে একাধিক অনুমতির জন্য অনুরোধ ও পরীক্ষা করতে পারেন--নিম্নলিখিত নমুনা শুধুমাত্র একটি একক অনুমতির জন্য পরীক্ষা করে।

কোটলিন

    fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array,
        grantResults: IntArray
    ) {
        if (requestCode == REQUEST_LOCATION_PERMISSION_CODE) {
            if (grantResults.singleOrNull() == PackageManager.PERMISSION_GRANTED) {
               // We can now safely use the API we requested access to
               val locationResult: Task = LocationServices
                    .getFusedLocationProviderClient(this /* Context */)
                    .lastLocation // Request the last known location.
            } else {
                // Permission was denied or request was cancelled
            }
        }
    }

জাভা

    public void onRequestPermissionsResult(int requestCode,
                                            String[] permissions,
                                            int[] grantResults) {
        if (requestCode == REQUEST_LOCATION_PERMISSION_CODE) {
            if(grantResults.length == 1
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // We can now safely use the API we requested access to
                Task locationResult = LocationServices
                    .getFusedLocationProviderClient(this /** Context */)
                    .getLastLocation(); // Request the last known location.
            } else {
                // Permission was denied or request was cancelled
            }
        }
    }

অনুমতির যৌক্তিকতা দেখান

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

এই ক্ষেত্রে, কল করার requestPermissions আগে, আপনাকে কল করা উচিত shouldShowRequestPermissionRationale . যদি এটি সত্য হয়, তাহলে অনুমতির জন্য অতিরিক্ত প্রসঙ্গ প্রদর্শন করতে আপনার কিছু UI তৈরি করা উচিত।

উদাহরণস্বরূপ, আপনার কোড দেখতে এইরকম হতে পারে:

কোটলিন

    private const val REQUEST_LOCATION_PERMISSION_CODE = 2
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
        // Check Permissions Now
        if ActivityCompat.shouldShowRequestPermissionRationale(
            this,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) {
            // Display UI and wait for user interaction
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                REQUEST_LOCATION_PERMISSION_CODE)
        }
    } else {
        // Permission has already been granted, continue as usual
        val locationResult: Task = LocationServices
            .getFusedLocationProviderClient(this /* Context */)
            .lastLocation
    }

জাভা

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
        // Check Permissions Now
        private static final int REQUEST_LOCATION_PERMISSION_CODE = 2;
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {
            // Display UI and wait for user interaction
        } else {
            ActivityCompat.requestPermissions(
                this, new String[]{Manifest.permission.LOCATION_FINE},
                REQUEST_LOCATION_PERMISSION_CODE);
        }
    } else {
        // permission has been granted, continue as usual
        Task locationResult = LocationServices
            .getFusedLocationProviderClient(this /** Context */)
            .getLastLocation();
    }

Google Play পরিষেবা API কলগুলি স্বয়ংক্রিয়ভাবে হয় একটি ডায়ালগ (যদি ক্লায়েন্টকে একটি Activity সাথে ইনস্ট্যান্ট করা হয়) বা সিস্টেম ট্রে বিজ্ঞপ্তি (যদি ক্লায়েন্ট একটি Context দিয়ে ইনস্ট্যান্ট করা হয়) প্রদর্শন করবে যা ব্যবহারকারী অনুমতির রেজোলিউশনের অভিপ্রায় শুরু করতে ট্যাপ করতে পারেন। একবার অনুমতি দেওয়া হলে কল সারিবদ্ধ করা হবে এবং পুনরায় চেষ্টা করা হবে।