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) {
  // Check Permissions Now
  ActivityCompat.requestPermissions(this,
      new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
      REQUEST_LOCATION);
} else {
  // permission has been granted, continue as usual
  Task<Location> locationResult = LocationServices
      .getFusedLocationProviderClient(this /** Context */)
      .getLastLocation();
}

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

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

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

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

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

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

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

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
    != PackageManager.PERMISSION_GRANTED) {
    // Check Permissions Now
    private static final int REQUEST_LOCATION = 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},
            ACCESS_FINE_LOCATION);
    }
} else {
    // permission has been granted, continue as usual
    Task<Location> locationResult = LocationServices
        .getFusedLocationProviderClient(this /** Context */)
        .getLastLocation();
}

সংযোগ ব্যর্থতা হ্যান্ডেল

যদি আপনার অ্যাপটি বন্ধ করা GoogleApiClient ব্যবহার করে, আপনি যখন connect() কল করেন, তখন Google Play পরিষেবাগুলি যাচাই করে যে এটিতে প্রয়োজনীয় সমস্ত প্রয়োজনীয় অনুমতি রয়েছে৷ connect() ব্যর্থ হয় যখন Google Play পরিষেবাগুলির জন্য প্রয়োজনীয় কোনো অনুমতি গোষ্ঠী অনুপস্থিত থাকে।

connect() কল ব্যর্থ হলে, আপনার অ্যাপ সংযোগ ব্যর্থতা সঠিকভাবে পরিচালনা করে তা নিশ্চিত করুন। যদি Google Play পরিষেবাগুলি নিজেই অনুমতি অনুপস্থিত থাকে, তাহলে আপনি তাদের ঠিক করার জন্য ব্যবহারকারীর প্রবাহ শুরু করতে startResolutionForResult() ডাকতে পারেন।

উদাহরণ স্বরূপ:

@Override
public void onConnectionFailed(ConnectionResult result) {
    if (mResolvingError) {
        // Already attempting to resolve an error.
        return;
    } else if (result.hasResolution()) {
        try {
            mResolvingError = true;
            result.startResolutionForResult(this, REQUEST_RESOLVE_ERROR);
        } catch (SendIntentException e) {
            // There was an error with the resolution intent. Try again.
            mGoogleApiClient.connect();
        }
    } else {
        // Show dialog using GooglePlayServicesUtil.getErrorDialog()
        showErrorDialog(result.getErrorCode());
        mResolvingError = true;
    }
}

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