অ্যান্ড্রয়েড এম - রানটাইম অনুমতি চেক করুন - ব্যবহারকারী "আবার কখনও জিজ্ঞাসা করবেন না" চেক করেছে কিনা তা কীভাবে নির্ধারণ করবেন?


307

এটি অনুসারে: http://developer.android.com/preview/features/runtime-perifications.html# একটি অ্যাপ্লিকেশন কোডিং করা রানটাইম অনুমতিগুলির জন্য পরীক্ষা করতে পারে এবং যদি ইতিমধ্যে তা মঞ্জুর না করা হয় তবে অনুমতিগুলির জন্য অনুরোধ করতে পারে। নিম্নলিখিত ডায়লগটি তখন প্রদর্শিত হবে:

এখানে চিত্র বর্ণনা লিখুন

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

  1. আবার চেষ্টা করুন (অনুমতি আবার অনুরোধ করা হয়)
  2. অস্বীকার করুন (অ্যাপ্লিকেশন সেই অনুমতি ব্যতীত কাজ করবে)।

ব্যবহারকারী যদি যাচাই করে থাকে Never ask againতবে ব্যাখ্যা সহ দ্বিতীয় ডায়ালগটি প্রদর্শিত হবে না, বিশেষত যদি ব্যবহারকারী ইতিমধ্যে একবারে অস্বীকার করে। এখন প্রশ্নটি: আমার অ্যাপটি কীভাবে জানতে পারে যে ব্যবহারকারী চেক করেছে কিনা Never ask again? আইএমও onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)আমাকে সেই তথ্য দেয় না।

দ্বিতীয় প্রশ্নটি হ'ল: গুগলের কি অনুমতি সংলাপে একটি কাস্টম বার্তা অন্তর্ভুক্ত করার পরিকল্পনা রয়েছে যা অ্যাপ্লিকেশনটির অনুমতি প্রয়োজন কেন তা ব্যাখ্যা করবে? এইভাবে কখনও দ্বিতীয় সংলাপ হতে পারে যা অবশ্যই আরও ভাল ইউএক্স তৈরি করবে।


9
"গুগলের কি অনুমতি সংলাপে একটি কাস্টম বার্তা অন্তর্ভুক্ত করার পরিকল্পনা রয়েছে যা অ্যাপ্লিকেশনটির অনুমতি প্রয়োজন কেন তা ব্যাখ্যা করবে?" - এম অনুমতি সিস্টেম সম্পর্কে গুগল আই | ও উপস্থাপনায়, আমি মনে করি কেউ প্রশ্নোত্তর থেকে জিজ্ঞাসা করেছিল, এবং উত্তরটি তারা এ সম্পর্কে চিন্তা করছে।
কমন্সওয়্যার

1
এটি নিজেই পরীক্ষা করে দেখেনি, তবে অ্যাক্টিভিটি.শল্ডশোরউকেস্টপিরমিশনেশন (স্ট্রিং) সম্পর্কে ডকুমেন্টেশনগুলি বলে: এই অ্যাপ্লিকেশনটি আগে এই অনুমতিটির জন্য অনুরোধ করে এবং ব্যবহারকারী অনুরোধটিকে অস্বীকার করলে এই পদ্ধতিটি সত্য হয়। এটি ইঙ্গিত দেয় যে আপনার অনুমতিটির প্রয়োজন কেন আপনার সম্ভবত ব্যবহারকারীকে ব্যাখ্যা করা উচিত। যদি ব্যবহারকারী অতীতে অনুমতি অনুরোধটি প্রত্যাখ্যান করে এবং অনুমতি অনুরোধ সিস্টেম সংলাপে পুনরায় জিজ্ঞাসা করবেন না বিকল্পটি চয়ন করে, এই পদ্ধতিটি মিথ্যা প্রত্যাখ্যান করে। যদি ডিভাইস নীতি অ্যাপ্লিকেশনটিকে সেই অনুমতি থেকে বাধা দেয় তবে পদ্ধতিটিও মিথ্যা ফেরত দেয়।
খুলতে পারবো

1
@ ফ্রিড: দেখে মনে হচ্ছে তারা এটিকে অ্যান্ড্রয়েড এম এর 2 2 পূর্বরূপের সাথে জুড়েছে: বিকাশকারী.অ্যান্ড্রয়েড / প্রিভিউ / সাপ্পুর্ট html#preview2- নোট এবং এটি সম্ভবত আমি যা খুঁজছিলাম। আমি এখনই এটি পরীক্ষা করতে পারছি না তবে পরের সপ্তাহে এটি করব। এটি যদি আশা করি যা করে তবে তা আপনি উত্তর হিসাবে পোস্ট করতে পারেন এবং কিছু খ্যাতি পেতে পারেন। এরই মধ্যে এটি অন্যকে সহায়তা করতে পারে: youtube.com/watch?v=f17qe9vZ8RM
ইমানুয়েল মেকলিন

বিপজ্জনক অনুমতি এবং বিশেষ অনুমতিগুলির উদাহরণ: github.com/henrychuangtw/AndroidRuntimePermission
হেনরিচুয়াং

1
@ বিকাশকারীদের পক্ষে অ্যালেক্স আরও শক্ত যা নিশ্চিত যে তবে কোনও ব্যবহারকারী দৃষ্টিকোণ থেকে নির্দিষ্ট অনুমতি প্রদান বা প্রত্যাখ্যান করতে সক্ষম হওয়া অর্থবোধ করে। প্রধান সমস্যাটি আমি দেখতে পাচ্ছি যে অনুমতিগুলির গ্রানুলারিটি খুব বেমানান এবং আপনি আপনার অ্যাপ্লিকেশনটিতে যা করার চেষ্টা করছেন তার সাথে প্রায় কিছুই করার নেই এমন অনুমতি চেয়েছিলেন (যেমন আমি যখন সংযোগ করতে চাই তখন যোগাযোগের অনুমতি) গুগল ড্রাইভ কারণ এর জন্য প্রমাণীকরণের উদ্দেশ্যে ডিভাইস অ্যাকাউন্টগুলির একটি তালিকা প্রয়োজন এবং অ্যাকাউন্ট অনুমতি যোগাযোগের অনুমতি গোষ্ঠীর অংশ)।
ইমানুয়েল মোইকলিন

উত্তর:


341

বিকাশকারী পূর্বরূপ 2 অ্যাপ্লিকেশনটির মাধ্যমে কীভাবে অনুমতিগুলির জন্য অনুরোধ করা হয় তাতে কিছু পরিবর্তন আনুন ( http://developer.android.com/preview/support.html#preview2- নোটগুলিও দেখুন )।

প্রথম ডায়ালগটি এখন এর মতো দেখায়:

এখানে চিত্র বর্ণনা লিখুন

কোনও "আবার কখনও দেখাবেন না" চেক-বাক্স নেই (বিকাশকারী পূর্বরূপ 1 এর বিপরীতে)। যদি ব্যবহারকারী অনুমতি অস্বীকার করে এবং যদি অ্যাপ্লিকেশনটির জন্য অনুমতিটি প্রয়োজনীয় হয় তবে অ্যাপ্লিকেশনটি সেই অনুমতি চাওয়ার কারণ ব্যাখ্যা করার জন্য এটি অন্য একটি ডায়ালগ উপস্থাপন করতে পারে, যেমন:

এখানে চিত্র বর্ণনা লিখুন

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

এখানে চিত্র বর্ণনা লিখুন

দ্বিতীয়বার "আর কখনও জিজ্ঞাসা করবেন না" চেক-বক্স প্রদর্শিত হবে। যদি ব্যবহারকারী আবার অস্বীকার করে এবং চেক-বাক্সটি টিক দেওয়া থাকে তবে আর কিছুই হওয়ার কথা না। চেক-বাক্সটি টিকযুক্ত কিনা তা নির্ধারণ করা যেতে পারে ক্রিয়াকলাপ.শল্ডশোরউইকুয়েস্টপিরমিশনেশন (স্ট্রিং) ব্যবহার করে, যেমন:

if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_CONTACTS)) {...

অ্যান্ড্রয়েড ডকুমেন্টেশন এটাই বলেছে ( https://developer.android.com/training/permission/requesting.html ):

আপনার অতিরিক্ত বিবরণ দেওয়ার যে পরিস্থিতিতে প্রয়োজন তা সন্ধান করতে, সিস্টেমটি Activity.shouldShowRequestPermissionRationale (স্ট্রিং) পদ্ধতি সরবরাহ করে। এই অ্যাপ্লিকেশনটি পূর্বে যদি এই অনুমতিটির জন্য অনুরোধ করে এবং ব্যবহারকারী অনুরোধটি প্রত্যাখ্যান করে তবে এই পদ্ধতিটি সত্য ফিরে আসে। এটি ইঙ্গিত দেয় যে আপনার অনুমতিটির প্রয়োজন কেন আপনার সম্ভবত ব্যবহারকারীকে ব্যাখ্যা করা উচিত।

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

ব্যবহারকারী "আর কখনও জিজ্ঞাসা করবেন না" দিয়ে অস্বীকার করেছে কিনা তা জানতে আপনি যখন ব্যবহারকারী অনুমতি না দিয়েছিলেন তখন আপনার onRequestPerificationsResult এ shouldShowRequestPermissionRationale পদ্ধতিটি চেক করতে পারেন ।

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_PERMISSION) {
        // for each permission check if the user granted/denied them
        // you may want to group the rationale in a single dialog,
        // this is just an example
        for (int i = 0, len = permissions.length; i < len; i++) {
            String permission = permissions[i];
            if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
            // user rejected the permission
                boolean showRationale = shouldShowRequestPermissionRationale( permission );
                if (! showRationale) {
                    // user also CHECKED "never ask again"
                    // you can either enable some fall back,
                    // disable features of your app
                    // or open another dialog explaining
                    // again the permission and directing to
                    // the app setting
                } else if (Manifest.permission.WRITE_CONTACTS.equals(permission)) {
                    showRationale(permission, R.string.permission_denied_contacts);
                    // user did NOT check "never ask again"
                    // this is a good place to explain the user
                    // why you need the permission and ask if he wants
                    // to accept it (the rationale)
                } else if ( /* possibly check more permissions...*/ ) {
                }
            }
        }
    }
}

আপনি এই কোডটি দিয়ে আপনার অ্যাপ্লিকেশন সেটিংটি খুলতে পারেন:

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, REQUEST_PERMISSION_SETTING);

ব্যবহারকারীকে সরাসরি অনুমোদনের পৃষ্ঠায় প্রেরণের কোনও উপায় নেই।


29
"" আর কখনও জিজ্ঞাসা করবেন না "নির্বাচন করা হয়েছে কিনা তা পরীক্ষা করে দেখার জন্য আমি shouldSowRequestPermissionRationale () পদ্ধতির ফেরতের মানটি যাচাই করেছি। অনুমতি চাইলে আমি প্রথমবারের মতো এটির মানও মিথ্যা হিসাবে পেয়ে যাচ্ছি। সুতরাং ব্যবহারকারী "আবার জিজ্ঞাসা করবেন না" চেকবক্সটি নির্বাচন না করে আমি আলাদা করতে পারছি না। সুপারিশ করুন??
সাগর ত্রিহান

31
আমার বোধগম্যতা অনুসারে শোরআরশনালপিরমিশন রেশনাল () পদ্ধতিটি তিনটি ক্ষেত্রে মিথ্যা প্রত্যাবর্তন করে: ১. যদি আমরা অনুমতি জিজ্ঞাসার আগে এই পদ্ধতিটিকে খুব প্রথমবার বলে থাকি। ২. যদি ব্যবহারকারী "আবার জিজ্ঞাসা করবেন না" নির্বাচন করে এবং অনুমতি অস্বীকার করে। ৩. যদি ডিভাইস নীতি অ্যাপ্লিকেশনটিকে সেই অনুমতিটি থেকে
বিরত রাখে

24
সব ভাল ... তবে আমাদের, বিকাশকারীরা, ব্যবহারকারী "কখনই আর জিজ্ঞাসা করবেন না" বলেছিল কিনা তা সত্যই জানা দরকার। একটি বৈশিষ্ট্য অ্যাক্সেস করার জন্য আমার কাছে একটি সুন্দর বোতাম আছে। প্রথমবার ব্যবহারকারী ক্লিক করুন: যুক্তি জিজ্ঞাসা করা উচিত? না, অনুমতি জিজ্ঞাসা করুন। ব্যবহারকারী অস্বীকার করে। ব্যবহারকারী আবার ক্লিক করুন বোতাম: যুক্তি? হাঁ! যুক্তি দেখান, ব্যবহারকারী ওকে বলুন, তারপরে অস্বীকার করুন এবং আবার কখনও জিজ্ঞাসা করবেন না (ঠিক আছে তিনি একজন নির্বোধ, তবে ব্যবহারকারীরা প্রায়শই থাকেন)। পরে ব্যবহারকারী আবার বোতাম টিপুন, যুক্তি? না, অনুমতি জিজ্ঞাসা করুন, ব্যবহারকারীর জন্য কিছুই ঘটে না। ব্যবহারকারীকে বলার জন্য আমার সত্যিই একটি উপায় দরকার: আরে ম্যান আপনি যদি এই বৈশিষ্ট্যটি চান তবে এখন অ্যাপ্লিকেশন সেটিংসে যান এবং অনুমতি দিন।
ড্যানিয়েল সেগাটো

4
গ্রেট @ ইমানুয়েলমেকলিন এখন গুগল ডকুমেন্টেশন এর চেয়ে আরও ভাল: ডি
ড্যানিয়েল সেগাটো

4
onRequestPerificationsResult কল করা হবে না আপনি অনুমতি অনুমতি না দিলে। যেহেতু কোনও চেক-বাক্স নেই "কখনই আবার জিজ্ঞাসা করবেন না" প্রথমবার যখন অনুমতিটির অনুরোধ করা হয়, তবে শো-রিকোয়েস্টপিরমিশনেশনটি সত্য ফিরে আসবে (অনুমতি অনুরোধ করা হয়েছে তবে আবার কখনও জিজ্ঞাসা না করে)। ফলস্বরূপ যুক্তিটি সর্বদা প্রথমবার ব্যবহারকারীর অনুমতি প্রত্যাখ্যান করার পরে প্রদর্শিত হয় তবে তার পরে কেবল যদি চেক-বাক্সটি টিক না দেওয়া হয়।
ইমানুয়েল মোইকলিন

95

আপনি না পরীক্ষা করতে shouldShowRequestPermissionRationale()আপনার onRequestPermissionsResult()

shouldShowRequestPermissionRationale https://youtu.be/C8lUdPVSzDk?t=2m23s

অনুমতি দেওয়া হয়েছে কি না তা পরীক্ষা করে দেখুন onRequestPermissionsResult()। যদি না তারপর পরীক্ষা shouldShowRequestPermissionRationale()

  1. যদি এই পদ্ধতিটি ফিরে আসে trueতবে কেন এই নির্দিষ্ট অনুমতি প্রয়োজন তা একটি ব্যাখ্যা দেখান। তারপরে আবার ব্যবহারকারীর পছন্দের উপর নির্ভর করে requestPermissions()
  2. যদি এটি ফিরে আসে falseতবে একটি ত্রুটি বার্তা দেখান যে অনুমতি দেওয়া হয়নি এবং অ্যাপ্লিকেশনটি আরও এগিয়ে যেতে পারে না বা একটি নির্দিষ্ট বৈশিষ্ট্য অক্ষম করা আছে।

নীচে নমুনা কোড দেওয়া আছে।

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case STORAGE_PERMISSION_REQUEST:
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted :)
                downloadFile();
            } else {
                // permission was not granted
                if (getActivity() == null) {
                    return;
                }
                if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    showStoragePermissionRationale();
                } else {
                    Snackbar snackbar = Snackbar.make(getView(), getResources().getString(R.string.message_no_storage_permission_snackbar), Snackbar.LENGTH_LONG);
                    snackbar.setAction(getResources().getString(R.string.settings), new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (getActivity() == null) {
                                return;
                            }
                            Intent intent = new Intent();
                            intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null);
                            intent.setData(uri);
                            OrderDetailFragment.this.startActivity(intent);
                        }
                    });
                    snackbar.show();
                }
            }
            break;
    }
}

স্পষ্টতই, গুগল মানচিত্র অবস্থানের অনুমতিের জন্য ঠিক এটি করে।


ছবি এবং ইউটিউব লিঙ্কের জন্য আপনাকে ধন্যবাদ। এটি কম বেশি আমার নিজের উত্তর মিলছে। এটি লক্ষ্য রাখতে হবে যে যখন প্রশ্নটি তখনই জিজ্ঞাসা করা হয়েছিল যখন কেবল বিকাশকারী পূর্বরূপ 1 উপলব্ধ ছিল যা শো-রেকুয়েস্টপিরমিরিশনেশন পদ্ধতিটি থাকা উচিত ছিল না।
ইমানুয়েল মেকলিন

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

39

বর্তমান অনুমতি স্থিতি পরীক্ষা করার জন্য এখানে একটি দুর্দান্ত এবং সহজ পদ্ধতি:

    @Retention(RetentionPolicy.SOURCE)
    @IntDef({GRANTED, DENIED, BLOCKED_OR_NEVER_ASKED })
    public @interface PermissionStatus {}

    public static final int GRANTED = 0;
    public static final int DENIED = 1;
    public static final int BLOCKED_OR_NEVER_ASKED = 2;

    @PermissionStatus 
    public static int getPermissionStatus(Activity activity, String androidPermissionName) {
        if(ContextCompat.checkSelfPermission(activity, androidPermissionName) != PackageManager.PERMISSION_GRANTED) {
            if(!ActivityCompat.shouldShowRequestPermissionRationale(activity, androidPermissionName)){
                return BLOCKED_OR_NEVER_ASKED;
            }
            return DENIED;
        }
        return GRANTED;
    }

ক্যাভিয়েট: ব্যবহারকারী প্রম্পট (এসডিকে 23+ ডিভাইসে) ব্যবহারের মাধ্যমে অনুমতি গ্রহণ / অস্বীকার করার আগে প্রথম অ্যাপ্লিকেশন শুরু করে BLOCKED_OR_NEVER_ASKED ফেরত দেয়

হালনাগাদ:

অ্যান্ড্রয়েড সমর্থন লাইব্রেরিতেও এখন একই ধরণের শ্রেণি android.support.v4.content.PermissionCheckerরয়েছে বলে মনে হচ্ছে checkSelfPermission()যা প্রত্যাবর্তন করে:

public static final int PERMISSION_GRANTED = 0;
public static final int PERMISSION_DENIED = -1;
public static final int PERMISSION_DENIED_APP_OP = -2;

1
প্রথম প্রবর্তনের জন্য, আমি ভাগ করা পছন্দগুলিতে একটি বুলিয়ান সংরক্ষণ করছি।
সাইদ ফারিভার

5
BLOCKED_OR_NEVER_ASKEDঅনুমতিটির অনুরোধ না করা থাকলে এটি সর্বদা ফিরে আসে ।
সায়েত

6
হ্যাঁ, এ কারণেই এটি "BLOCKED_OR_NEVER_ASKED" নামে পরিচিত, শেষ
প্যাট্রিক ফ্যাভ্রে

3
android.content.pmইতিমধ্যে সংজ্ঞায়িত PERMISSION_GRANTED = 0এবং PERMISSION_DENIED = -1। সম্ভবত সেট BLOCKED_OR_NEVER_ASKED = PERMISSION_DENIED - 1বা কিছু?
সমিস

দেখুন mVck এর সতর্কীকরণ পরিচালনা করার জন্য নিচের উত্তর।
সামিস

28

একবার ব্যবহারকারী "আবার জিজ্ঞাসা করবেন না" চিহ্নিত করে আবার প্রশ্নটি প্রদর্শিত হবে না। তবে এটি ব্যবহারকারীকে বোঝানো যেতে পারে যে তিনি এর আগে অনুমতি অস্বীকার করেছেন এবং সেটিংসে অবশ্যই অনুমতি দিতে হবে। এবং নিম্নলিখিত কোড সহ সেটিংসে তাকে উল্লেখ করুন:

@Override
public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults) {

    if (grantResults.length > 0
            && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // now, you have permission go ahead
        // TODO: something

    } else {

        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.READ_CALL_LOG)) {
            // now, user has denied permission (but not permanently!)

        } else {

            // now, user has denied permission permanently!

            Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "You have previously declined this permission.\n" +
                "You must approve this permission in \"Permissions\" in the app settings on your device.", Snackbar.LENGTH_LONG).setAction("Settings", new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));

            }
        });
        View snackbarView = snackbar.getView();
        TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
        textView.setMaxLines(5);  //Or as much as you need
        snackbar.show();

        }

    }
    return;
}

অ্যান্ড্রয়েডএক্সে মাইগ্রেশনে আপনি com.google.android.matory.R এর সাথে android.support.design.R প্রতিস্থাপন করতে পারেন
রিধা রেজ্জাগ

26

কারও জন্য উপকারী হতে পারে: -

আমি যেটা লক্ষ্য করেছি তা হ'ল, আমরা যদি অন-রিকুয়েস্টপিয়ারিশন রিসাল্ট () কলব্যাক পদ্ধতিতে শো-রেকুয়েস্টপিরমিরিশনেশন () পতাকাটি পরীক্ষা করি, তবে এটি কেবলমাত্র দুটি স্থিতি দেখায়

রাজ্য 1: -প্রসূত সত্য: - যে কোনও সময় ব্যবহারকারী অনুমতিগুলি অস্বীকার করে ক্লিক করুন (খুব প্রথমবার সহ)।

স্থিতি 2: -প্রার্থনা মিথ্যা: - ব্যবহারকারী যদি "আর কখনও জিজ্ঞাসা করেন না" নির্বাচন করে।

বিস্তারিত কাজের উদাহরণের লিঙ্ক


2
এটি ব্যবহারকারী সঠিকভাবে পুনরায় বিকল্প জিজ্ঞাসা না করে তা সনাক্ত করার সঠিক উপায়।
মুহাম্মদ বাবর

আহ, এখানে মূল কীটি হ'ল আপনি এটি হ্যান্ডেল করুন onRequestPermissionsResult, অনুমতিটির অনুরোধ করার সময় নয়।
জোশুয়া পিন্টার 12'18

26

কলব্যাক পদ্ধতির ভিতরে অনুমতি যুক্তি প্রদর্শন করতে হবে কিনা তা পরীক্ষা করে আপনি এটি নির্ধারণ করতে পারেন । আপনি যদি আবার কখনও জিজ্ঞাসা না করে এমন কোনও অনুমতি সেট পান তবে আপনি ব্যবহারকারীদের সেটিংস থেকে অনুমতি দেওয়ার জন্য অনুরোধ করতে পারেন।onRequestPermissionsResult()

আমার সম্পূর্ণ বাস্তবায়ন নীচের মত হবে। এটি একক বা একাধিক অনুমতি অনুরোধের জন্য কাজ করে । নিম্নলিখিত ব্যবহার করুন বা সরাসরি আমার লাইব্রেরি ব্যবহার করুন।

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(permissions.length == 0){
        return;
    }
    boolean allPermissionsGranted = true;
    if(grantResults.length>0){
        for(int grantResult: grantResults){
            if(grantResult != PackageManager.PERMISSION_GRANTED){
                allPermissionsGranted = false;
                break;
            }
        }
    }
    if(!allPermissionsGranted){
        boolean somePermissionsForeverDenied = false;
        for(String permission: permissions){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
                //denied
                Log.e("denied", permission);
            }else{
                if(ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){
                    //allowed
                    Log.e("allowed", permission);
                } else{
                    //set to never ask again
                    Log.e("set to never ask again", permission);
                    somePermissionsForeverDenied = true;
                }
            }
        }
        if(somePermissionsForeverDenied){
            final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
            alertDialogBuilder.setTitle("Permissions Required")
                    .setMessage("You have forcefully denied some of the required permissions " +
                            "for this action. Please open settings, go to permissions and allow them.")
                    .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                    Uri.fromParts("package", getPackageName(), null));
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                        }
                    })
                    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    })
                    .setCancelable(false)
                    .create()
                    .show();
        }
    } else {
        switch (requestCode) {
            //act according to the request code used while requesting the permission(s).
        }
    }
}

হাই হাই @ নাবিন আমার প্রয়োজনীয়তা যখন আমি ডাউনলোড বোতামে ক্লিক করি (যা পিডিএফ ফাইল ডাউনলোড করে) তখন সেই সময় যাচাই করতে হয় লেখার অনুমতি অনুমোদিত বা অস্বীকার করা হয় যাতে এই কোডটি কীভাবে ব্যবহার করা যায়! আপনি কি আমাকে plz গাইড করতে পারেন
রুচা ভট্ট জোশী

হ্যালো @ রুচাভট্ট আমার লাইব্রেরিটি একবার দেখুন। github.com/nabinbhandari/Android-Permissions
নবীন ভান্ডারী

15

আপনি যদি সমস্ত "রাজ্য" সনাক্ত করতে চান (প্রথমবার অস্বীকৃত, কেবল অস্বীকার করা হয়েছে, "আবার জিজ্ঞাসা করবেন না" বা স্থায়ীভাবে অস্বীকার করা হয়েছে) আপনি নিম্নলিখিতটি করতে পারেন:

2 বুলিয়ান তৈরি করুন

private boolean beforeClickPermissionRat;
private boolean afterClickPermissionRat;

অনুমতি চাইতে আগে প্রথম সেট করুন:

beforeClickPermissionRat = shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE);

আপনার onRecquestPermissionResult পদ্ধতিতে দ্বিতীয়টি সেট করুন:

afterClickPermissionRat = shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE);

আরউইকুয়েস্টপিয়ারিশনস রিসাল্ট () (আপনার এখনও অনুমতি নেই তা যাচাই করার পরে) আপনার যা যা প্রয়োজন তা করতে নিম্নলিখিত "টেবিল" ব্যবহার করুন:

// before after
// FALSE  FALSE  =  Was denied permanently, still denied permanently --> App Settings
// FALSE  TRUE   =  First time deny, not denied permanently yet --> Nothing
// TRUE   FALSE  =  Just been permanently denied --> Changing my caption to "Go to app settings to edit permissions"
// TRUE   TRUE   =  Wasn't denied permanently, still not denied permanently --> Nothing

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

2
@ ইমানুয়েলমেকলিন, যতদূর আমি জানি এটি ইতিমধ্যে অস্বীকার করা হয়েছে কিনা তা যাচাই করার একমাত্র উপায় (আমার সত্যের টেবিলে ব্যাখ্যা করার আগে এবং পরে এটি পরীক্ষা করে) বা যদি এটি প্রথমবার অস্বীকার করে (আমার ক্ষেত্রে আমি ব্যবহারকারীকে পুনঃনির্দেশিত করি) অ্যাপ্লিকেশন সেটিংস যদি এটি স্থায়ীভাবে অস্বীকার করা হয়)
mVck

1
// TRUE FALSEপূর্বে অস্বীকার করার পরে যখন ব্যবহারকারী কোনও অনুমতি দেয় তখনও ঘটে।
সামিস

11

আমারও একই সমস্যা ছিল এবং আমি এটি বের করে ফেললাম। জীবনকে আরও সহজ করে তোলার জন্য, রানটাইম অনুমতিগুলি হ্যান্ডেল করার জন্য আমি একটি ব্যবহারের ক্লাস লিখেছিলাম।

public class PermissionUtil {
    /*
    * Check if version is marshmallow and above.
    * Used in deciding to ask runtime permission
    * */
    public static boolean shouldAskPermission() {
        return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
    }
private static boolean shouldAskPermission(Context context, String permission){
        if (shouldAskPermission()) {
            int permissionResult = ActivityCompat.checkSelfPermission(context, permission);
            if (permissionResult != PackageManager.PERMISSION_GRANTED) {
                return true;
            }
        }
        return false;
    }
public static void checkPermission(Context context, String permission, PermissionAskListener listener){
/*
        * If permission is not granted
        * */
        if (shouldAskPermission(context, permission)){
/*
            * If permission denied previously
            * */
            if (((Activity)context).shouldShowRequestPermissionRationale(permission)) {
                listener.onPermissionPreviouslyDenied();
            } else {
                /*
                * Permission denied or first time requested
                * */
if (PreferencesUtil.isFirstTimeAskingPermission(context, permission)) {
                    PreferencesUtil.firstTimeAskingPermission(context, permission, false);
                    listener.onPermissionAsk();
                } else {
                    /*
                    * Handle the feature without permission or ask user to manually allow permission
                    * */
                    listener.onPermissionDisabled();
                }
            }
        } else {
            listener.onPermissionGranted();
        }
    }
/*
    * Callback on various cases on checking permission
    *
    * 1.  Below M, runtime permission not needed. In that case onPermissionGranted() would be called.
    *     If permission is already granted, onPermissionGranted() would be called.
    *
    * 2.  Above M, if the permission is being asked first time onPermissionAsk() would be called.
    *
    * 3.  Above M, if the permission is previously asked but not granted, onPermissionPreviouslyDenied()
    *     would be called.
    *
    * 4.  Above M, if the permission is disabled by device policy or the user checked "Never ask again"
    *     check box on previous request permission, onPermissionDisabled() would be called.
    * */
    public interface PermissionAskListener {
/*
        * Callback to ask permission
        * */
        void onPermissionAsk();
/*
        * Callback on permission denied
        * */
        void onPermissionPreviouslyDenied();
/*
        * Callback on permission "Never show again" checked and denied
        * */
        void onPermissionDisabled();
/*
        * Callback on permission granted
        * */
        void onPermissionGranted();
    }
}

এবং পছন্দসই পদ্ধতিগুলি নিম্নরূপ।

public static void firstTimeAskingPermission(Context context, String permission, boolean isFirstTime){
SharedPreferences sharedPreference = context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE;
 sharedPreference.edit().putBoolean(permission, isFirstTime).apply();
 }
public static boolean isFirstTimeAskingPermission(Context context, String permission){
return context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE).getBoolean(permission, true);
}

এখন, আপনার প্রয়োজন কেবল সঠিক যুক্তিযুক্ত * চেকপিরমিশন * পদ্ধতিটি ব্যবহার করা।

এখানে একটি উদাহরণ,

PermissionUtil.checkPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    new PermissionUtil.PermissionAskListener() {
                        @Override
                        public void onPermissionAsk() {
                            ActivityCompat.requestPermissions(
                                    thisActivity,
              new String[]{Manifest.permission.READ_CONTACTS},
                            REQUEST_EXTERNAL_STORAGE
                            );
                        }
@Override
                        public void onPermissionPreviouslyDenied() {
                       //show a dialog explaining permission and then request permission
                        }
@Override
                        public void onPermissionDisabled() {
Toast.makeText(context, "Permission Disabled.", Toast.LENGTH_SHORT).show();
                        }
@Override
                        public void onPermissionGranted() {
                            readContacts();
                        }
                    });

ব্যবহারকারী "পুনরায় জিজ্ঞাসা করবেন না" চেক করেছে কিনা তা আমার অ্যাপ্লিকেশনটি কীভাবে জানতে পারে?

যদি ব্যবহারকারী চেক করা থাকে তবে আর কখনও জিজ্ঞাসা করবেন না , আপনি অন পারমিশনডিয়েজড-এ কলব্যাক পাবেন ।

শুভ কোডিং :)


shouldShowRequestPermissionRationale আমি এখানে ত্রুটি পেয়েছি, আপনি আমাকে সাহায্য করতে পারেন?
রুচা ভট্ট জোশী

আমি এই পদ্ধতিটি খুঁজে পাচ্ছি না, শর্ত রেকর্ডপ্রেমিশন রেশনাল প্রসঙ্গটি পেতে ব্যর্থ হতে পারে .. তবে এটি ঠিক আছে আমি অন্যান্য বিকল্প সমাধান খুঁজে পেয়েছি .. সাহায্যের জন্য আপনাকে ধন্যবাদ :)
রুচা ভট্ট জোশী

1
আমার খারাপ। shouldShowRequestPermissionRationale কার্যকলাপের মাধ্যমে উপলব্ধ, প্রসঙ্গে নয়। আমি সেই পদ্ধতিটি কল করার আগে ক্রিয়াকলাপে প্রসঙ্গটি কাস্ট করে আমার উত্তর আপডেট করেছি। এটি দেখুন :)
মুথুরাজ

1
shouldShowRequestPermissionRationaleব্যবহারকারীকে প্রেরিত অনুরোধটিকে অগ্রাধিকার হিসাবে সংরক্ষণ করে প্রথম মিথ্যা মানটি দিয়ে ফিরে আসার একমাত্র উপায় । আমি একই ধারণা পেয়েছিলাম এবং আপনার উত্তর খুঁজে পেয়েছি। ভাল কাজের লোক
ম্যাটপ্যাগ

4

অনুমতি প্রতিটি ক্ষেত্রে সম্পূর্ণ ব্যাখ্যা

/**
 *    Case 1: User doesn't have permission
 *    Case 2: User has permission
 *
 *    Case 3: User has never seen the permission Dialog
 *    Case 4: User has denied permission once but he din't clicked on "Never Show again" check box
 *    Case 5: User denied the permission and also clicked on the "Never Show again" check box.
 *    Case 6: User has allowed the permission
 *
 */
public void handlePermission() {
    if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        // This is Case 1. Now we need to check further if permission was shown before or not

        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            // This is Case 4.
        } else {
            // This is Case 3. Request for permission here
        }

    } else {
        // This is Case 2. You have permission now you can do anything related to it
    }
}

public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // This is Case 2 (Permission is now granted)
    } else {
        // This is Case 1 again as Permission is not granted by user

        //Now further we check if used denied permanently or not
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            // case 4 User has denied permission but not permanently

        } else {
            // case 5. Permission denied permanently.
            // You can open Permission setting's page from here now.
        }

    }
}

4

একটি স্বেচ্ছাসেবী অনুমতি অনুরোধ করা থেকে নিষিদ্ধ করা হয়েছে তা নির্ধারণ করার জন্য একটি কার্যকর ফাংশন (কোটলিনে):

private fun isPermissionBlockedFromAsking(activity: Activity, permission: String): Boolean {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        return ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED
            && !activity.shouldShowRequestPermissionRationale(permission)
            && PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(permission, false)
    }
    return false
}

এর ব্যবহারের জন্য আপনি প্রথমে যখন কোনও অনুমতি চান তখন আপনার পছন্দসই অনুমতি (যেমন android.Manifest.permission.READ_PHONE_STATE) এর নামের সাথে একটি ভাগ করা পছন্দসই বুলিয়ান সেট করা দরকার true


ব্যাখ্যা:

Build.VERSION.SDK_INT >= Build.VERSION_CODES.M যেহেতু কিছু কোড কেবলমাত্র 23+ এপিআই স্তরে চালানো যেতে পারে।

ContextCompat.checkSelfPermission(activity, permission) != PackageManager.PERMISSION_GRANTED আমাদের কাছে ইতিমধ্যে অনুমতি নেই তা যাচাই করতে।

!activity.shouldShowRequestPermissionRationale(permission)ব্যবহারকারী আবার অ্যাপটি জিজ্ঞাসা করতে অস্বীকার করেছে কিনা তা পরীক্ষা করতে। এই ফাংশনটির quirks কারণে , নিম্নলিখিত লাইনটিও প্রয়োজন।

PreferenceManager.getDefaultSharedPreferences(activity).getBoolean(permission, false) "কখনই জিজ্ঞাসা করা হয়নি" এবং "আর কখনও জিজ্ঞাসা করবেন না" রাজ্যগুলির মধ্যে পার্থক্য করার জন্য এটি (প্রথম অনুমতি অনুরোধে মানটিকে সত্য হিসাবে নির্ধারণের পাশাপাশি) ব্যবহৃত হয়, কারণ পূর্ববর্তী লাইনটি এই তথ্য ফেরত দেয় না।


3

এই সমাধানের জন্য দয়া করে আমার দিকে পাথর নিক্ষেপ করবেন না।

এটি কাজ করে তবে কিছুটা "হ্যাকি"।

আপনি যখন কল করবেন তখন requestPermissionsবর্তমান সময়টি নিবন্ধ করুন।

        mAskedPermissionTime = System.currentTimeMillis();

তারপরে onRequestPermissionsResult

ফলাফল না মঞ্জুর হলে আবার সময় পরীক্ষা করে দেখুন।

 if (System.currentTimeMillis() - mAskedPermissionTime < 100)

যেহেতু ব্যবহারকারী সম্ভবত অস্বীকার বোতামটিতে এত দ্রুত ক্লিক করতে পারে না, তাই আমরা জানি যে তিনি "আবার কখনও জিজ্ঞাসা করবেন না" নির্বাচন করেছিলেন কারণ কলব্যাক তাত্ক্ষণিক।

আপনার নিজের ঝুঁকিতে ব্যবহার করুন।


আমরা যদি 5 মিনিটের জন্য অনুরোধ করা ডায়লগটি দেখতে পাই এবং তারপরে অস্বীকার করি?
সাকশাম

তারপরে এটির কী প্রয়োজন যদি এটি মৌলিক প্রয়োজনীয়তা পূরণ করতে না পারে। কোনও কোড হ্যাক হতে পারে গ্রহণযোগ্য হিসাবে যদি তা স্পষ্টভাবে সমস্ত ক্ষেত্রে সমস্ত প্রয়োজনীয়তা পূরণ করে তবে তা নয়।
স্যাকশাম

হ্যাঁ এটা খারাপ।
এটির

3

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

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

এ জাতীয় কেস সনাক্ত করতে, হয় আপনি ক্রমটি মিথ্যা-সত্য-মিথ্যা সনাক্ত করতে পারেন, বা (আরও সহজ) আপনার একটি পতাকা থাকতে পারে যা ডায়ালগটি প্রদর্শিত হওয়ার সময়টিকে ট্র্যাক করে। এর পরে, সেই পদ্ধতিটি সত্য বা মিথ্যা প্রত্যাবর্তন করে, যেখানে বিকল্পটি নির্বাচন করা হলে ভুয়া আপনাকে সনাক্ত করতে দেয়।


2

আমি অ্যান্ড্রয়েড এম এ অনুমতি অনুরোধের জন্য একটি শর্টহ্যান্ড লিখেছি এই কোডটি পুরানো অ্যান্ড্রয়েড সংস্করণগুলির পিছনে সামঞ্জস্যতাও পরিচালনা করে।

সমস্ত কুরুচিপূর্ণ কোডটি একটি খণ্ডে বের করা হয়েছে যা অনুমতিগুলির অনুরোধ করে ক্রিয়াকলাপের সাথে সংযুক্ত থাকে এবং নিজেকে আলাদা করে দেয় You আপনি PermissionRequestManagerনিম্নলিখিত হিসাবে ব্যবহার করতে পারেন :

new PermissionRequestManager()
        // We need a AppCompatActivity here, if you are not using support libraries you will have to slightly change 
        // the PermissionReuqestManager class
        .withActivity(this)

        // List all permissions you need
        .withPermissions(android.Manifest.permission.CALL_PHONE, android.Manifest.permission.READ_CALENDAR)

        // This Runnable is called whenever the request was successfull
        .withSuccessHandler(new Runnable() {
            @Override
            public void run() {
                // Do something with your permissions!
                // This is called after the user has granted all 
                // permissions, we are one a older platform where 
                // the user does not need to grant permissions 
                // manually, or all permissions are already granted

            }
        })

        // Optional, called when the user did not grant all permissions
        .withFailureHandler(new Runnable() {
            @Override
            public void run() {
                // This is called if the user has rejected one or all of the requested permissions
                L.e(this.getClass().getSimpleName(), "Unable to request permission");

            }
        })

        // After calling this, the user is prompted to grant the rights
        .request();

একবার দেখুন: https://gist.github.com/crysxd/385b57d74045a8bd67c4110c34ab74aa


2
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSIONS_REQUEST_EXTERNAL_STORAGE: {
            if (grantResults.length > 0) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    // Denied
                } else {
                    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                        // To what you want
                    } else {
                       // Bob never checked click
                    }
                }
            }
        }
    }
}

2

এই সাধারণ অনুমতি গ্রন্থাগার চেষ্টা করুন। এটি 3 সহজ পদক্ষেপে অনুমতি সম্পর্কিত সমস্ত ক্রিয়াকলাপ পরিচালনা করবে। এটা আমার সময় সাশ্রয়। আপনি 15 মিনিটের মধ্যে সমস্ত অনুমতি সম্পর্কিত কাজ শেষ করতে পারেন

এটি অস্বীকার করতে পারে অনুমতি এবং ইত্যাদি

https://github.com/ParkSangGwon/TedPermission

পদক্ষেপ 1: আপনার নির্ভরতা যুক্ত করুন

dependencies {
     compile 'gun0912.ted:tedpermission:2.1.1'
     //check the above link for latest libraries
}

পদক্ষেপ 2: অনুমতি জিজ্ঞাসা করুন

TedPermission.with(this)
    .setPermissionListener(permissionlistener)
    .setDeniedMessage("If you reject permission,you can not use this service\n\nPlease turn on permissions at [Setting] > [Permission]")
    .setPermissions(Manifest.permission.READ_CONTACTS, Manifest.permission.ACCESS_FINE_LOCATION)
    .check();

পদক্ষেপ 3: অনুমতি প্রতিক্রিয়া পরিচালনা করুন

PermissionListener permissionlistener = new PermissionListener() {
    @Override
    public void onPermissionGranted() {
        Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onPermissionDenied(ArrayList<String> deniedPermissions) {
        Toast.makeText(MainActivity.this, "Permission Denied\n" + deniedPermissions.toString(), Toast.LENGTH_SHORT).show();
    }
};

গ্রেট। এটি আমার সময় সাশ্রয় করেছে
Vigneswaran A

সুন্দর, ব্যবহার করা সহজ
উরে ফেব্রুয়ারি

2

আপনি শ্রোতা সুন্দর করতে পারেন।

শ্রোতা

interface PermissionListener {
    fun onNeedPermission()
    fun onPermissionPreviouslyDenied(numberDenyPermission: Int)
    fun onPermissionDisabledPermanently(numberDenyPermission: Int)
    fun onPermissionGranted()
}

অনুমতি জন্য মেইনক্লাস

class PermissionUtil {

    private val PREFS_FILENAME = "permission"
    private val TAG = "PermissionUtil"

    private fun shouldAskPermission(context: Context, permission: String): Boolean {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val permissionResult = ActivityCompat.checkSelfPermission(context, permission)
            if (permissionResult != PackageManager.PERMISSION_GRANTED) {
                return true
            }
        }
        return false
    }

    fun checkPermission(context: Context, permission: String, listener: PermissionListener) {

        Log.i(TAG, "CheckPermission for $permission")

        if (shouldAskPermission(context, permission)) {

            // Load history permission
            val sharedPreference = context.getSharedPreferences(PREFS_FILENAME, 0)
            val numberShowPermissionDialog = sharedPreference.getInt(permission, 0)

            if (numberShowPermissionDialog == 0) {

                (context as? Activity)?.let {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(it, permission)) {
                        Log.e(TAG, "User has denied permission but not permanently")
                        listener.onPermissionPreviouslyDenied(numberShowPermissionDialog)
                    } else {
                        Log.e(TAG, "Permission denied permanently.")
                        listener.onPermissionDisabledPermanently(numberShowPermissionDialog)
                    }
                } ?: kotlin.run {
                    listener.onNeedPermission()
                }

            } else {
                // Is FirstTime
                listener.onNeedPermission()
            }


            // Save history permission
            sharedPreference.edit().putInt(permission, numberShowPermissionDialog + 1).apply()


        } else {
            listener.onPermissionGranted()
        }

    }
}

এইভাবে ব্যবহার করা হয়

      PermissionUtil().checkPermission(this, Manifest.permission.ACCESS_FINE_LOCATION,
                object : PermissionListener {
                    override fun onNeedPermission() {
                        log("---------------------->onNeedPermission")

//                            ActivityCompat.requestPermissions(this@SplashActivity,
//                                    Array(1) { Manifest.permission.ACCESS_FINE_LOCATION },
//                                    118)

                    }

                    override fun onPermissionPreviouslyDenied(numberDenyPermission: Int) {
                        log("---------------------->onPermissionPreviouslyDenied")
                    }

                    override fun onPermissionDisabledPermanently(numberDenyPermission: Int) {
                        log("---------------------->onPermissionDisabled")
                    }

                    override fun onPermissionGranted() {
                        log("---------------------->onPermissionGranted")
                    }

                })

ক্রিয়াকলাপ বা ফ্রেমনেটের উপর ওভাররাইড onRequestPermissionResult

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
 if (requestCode == 118) {
        if (permissions[0] == Manifest.permission.ACCESS_FINE_LOCATION && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            getLastLocationInMap()
        }
        }
    }

1

পরিবর্তে আপনি onRequestPermissionsResult()মিথ্যা অবস্থায় পড়ে যখন আবার অনুমতিের জন্য অনুরোধ করবেন তখন PERMISSION_DENIED হিসাবে কলব্যাক পাবেনshouldShowRequestPermissionRationale()

অ্যান্ড্রয়েড ডক থেকে:

সিস্টেমটি ব্যবহারকারীকে অনুমতি দেওয়ার জন্য বললে, ব্যবহারকারীকে সেই অনুমতি আবার না চাইতে সিস্টেমকে বলার বিকল্প থাকে। requestPermissions()সেক্ষেত্রে যে কোনও সময় কোনও অ্যাপ্লিকেশন আবার সেই অনুমতি চাইতে চাইলে সিস্টেমটি তত্ক্ষণাত অনুরোধটিকে অস্বীকার করে। সিস্টেমটি আপনার onRequestPermissionsResult()কলব্যাক পদ্ধতিতে কল করে এবং পাস হয়ে যায় PERMISSION_DENIED, একইভাবে যদি ব্যবহারকারী স্পষ্টভাবে আপনার অনুরোধটি আবার প্রত্যাখ্যান করে। এর অর্থ এই যে আপনি যখন কল করবেন তখন আপনি requestPermissions()ধরে নিতে পারবেন না যে ব্যবহারকারীর সাথে কোনও সরাসরি মিথস্ক্রিয়া হয়েছে।


1

if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)কখনও জিজ্ঞাসা করা হয়নি কিনা তা পরীক্ষা করার জন্য আপনি পদ্ধতিটি ব্যবহার করতে পারেন ।

আরও রেফারেন্সের জন্য: এটি পরীক্ষা করে দেখুন

একাধিক অনুমতি ব্যবহারের জন্য পরীক্ষা করতে:

  if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)
                                || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                                || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)
                                || ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECORD_AUDIO)) {
                            showDialogOK("Service Permissions are required for this app",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            switch (which) {
                                                case DialogInterface.BUTTON_POSITIVE:
                                                    checkAndRequestPermissions();
                                                    break;
                                                case DialogInterface.BUTTON_NEGATIVE:
                                                    // proceed with logic by disabling the related features or quit the app.
                                                    finish();
                                                    break;
                                            }
                                        }
                                    });
                        }
                        //permission is denied (and never ask again is  checked)
                        //shouldShowRequestPermissionRationale will return false
                        else {
                            explain("You need to give some mandatory permissions to continue. Do you want to go to app settings?");
                            //                            //proceed with logic by disabling the related features or quit the app.
                        }

() পদ্ধতি ব্যাখ্যা

private void explain(String msg){
        final android.support.v7.app.AlertDialog.Builder dialog = new android.support.v7.app.AlertDialog.Builder(this);
        dialog.setMessage(msg)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        //  permissionsclass.requestPermission(type,code);
                        startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.exampledemo.parsaniahardik.marshmallowpermission")));
                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
                        finish();
                    }
                });
        dialog.show();
    }

উপরের কোডটিতে ডায়লগও প্রদর্শিত হবে, যা ব্যবহারকারীদের অ্যাপ্লিকেশন সেটিংস স্ক্রিনে পুনর্নির্দেশ করবে যেখানে তিনি আবার কখনও বোতাম জিজ্ঞাসা না করে যদি তিনি অনুমতি দিতে পারেন can


1

তুমি ব্যবহার করতে পার

shouldShowRequestPermissionRationale()

ভিতরে

onRequestPermissionsResult()

নীচের উদাহরণটি দেখুন:

ব্যবহারকারীর বোতামটি ক্লিক করলে এর অনুমতি রয়েছে কিনা তা পরীক্ষা করুন:

@Override
public void onClick(View v) {
    if (v.getId() == R.id.appCompatBtn_changeProfileCoverPhoto) {
        if (Build.VERSION.SDK_INT < 23) { // API < 23 don't need to ask permission
            navigateTo(MainActivity.class); // Navigate to activity to change photos
        } else {
            if (ContextCompat.checkSelfPermission(SettingsActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                // Permission is not granted yet. Ask for permission...
                requestWriteExternalPermission();
            } else {
                // Permission is already granted, good to go :)
                navigateTo(MainActivity.class);
            }
        } 
    }
}

যখন ব্যবহারকারী অনুমতি কথোপকথন বাক্সের উত্তর দেয় আমরা অনুরুপপ্রিমেশনরেসাল্টে যাব:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == WRITE_EXTERNAL_PERMISSION_REQUEST_CODE) {
        // Case 1. Permission is granted.  
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {  
            if (ContextCompat.checkSelfPermission(SettingsActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                // Before navigating, I still check one more time the permission for good practice.
                navigateTo(MainActivity.class);
            }
        } else { // Case 2. Permission was refused
            if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                // Case 2.1. shouldShowRequest... returns true because the
                // permission was denied before. If it is the first time the app is running we will 
                // end up in this part of the code. Because he need to deny at least once to get 
                // to onRequestPermissionsResult. 
                Snackbar snackbar = Snackbar.make(findViewById(R.id.relLayout_container), R.string.you_must_verify_permissions_to_send_media, Snackbar.LENGTH_LONG);
                snackbar.setAction("VERIFY", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ActivityCompat.requestPermissions(SettingsActivity.this
                                , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}
                                , WRITE_EXTERNAL_PERMISSION_REQUEST_CODE);
                    }
                });
                snackbar.show();
            } else {
                // Case 2.2. Permission was already denied and the user checked "Never ask again". 
                // Navigate user to settings if he choose to allow this time.
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage(R.string.instructions_to_turn_on_storage_permission)
                        .setPositiveButton(getString(R.string.settings), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                                Uri uri = Uri.fromParts("package", getPackageName(), null);
                                settingsIntent.setData(uri);
                                startActivityForResult(settingsIntent, 7);
                            }
                        })
                        .setNegativeButton(getString(R.string.not_now), null);
                Dialog dialog = builder.create();
                dialog.show();
            }
        }
    }

}

0

ব্যবহারকারীরা "আবার কখনও জিজ্ঞাসা করবেন না" বাছাই করেছে কিনা তাও আমি এই তথ্যটি পেতে চাই। আমি কুৎসিত চেহারার পতাকা সহ একটি 'প্রায় সমাধান' অর্জন করেছি, তবে কীভাবে বলার আগে, আমি আপনাকে আমার অনুপ্রেরণার বিষয়ে বলব:

আমি প্রাথমিকভাবে কার্যকারিতা উল্লেখ করার অনুমতিটি দিতে চাই। যদি ব্যবহারকারী এটি ব্যবহার করে এবং তার কোনও অধিকার না থাকে তবে সে উপরে থেকে 1 তম ডায়ালগ বা 2 য় এবং 3 য় উভয়ই পাবে। যখন ব্যবহারকারী 'আর কখনও জিজ্ঞাসা করবেন না' নির্বাচন করেছেন তখন আমি কার্যকারিতাটি অক্ষম করতে এবং এটি অন্যভাবে প্রদর্শন করতে চাই। - আমার ক্রিয়াটি কোনও স্পিনার পাঠ্য এন্ট্রি দ্বারা ট্রিগার করা হয়েছে, আমি প্রদর্শিত লেবেলের পাঠ্যে '(অনুমতি প্রত্যাহার)' যুক্ত করতে চাই। এটি ব্যবহারকারীকে দেখায়: 'কার্যকারিতা রয়েছে তবে আমার অনুমতি সেটিংসের কারণে আমি এটি ব্যবহার করতে পারি না।' তবে এটি সম্ভব বলে মনে হচ্ছে না, কারণ 'আবার কখনও জিজ্ঞাসা করব না' বাছাই করা হয়েছে কিনা তা আমি যাচাই করতে পারি না।

আমি একটি সমাধানে এসেছি যার সাথে আমি আমার কার্যকারিতা সবসময় সক্রিয় অনুমতি চেক সহ সক্ষম করে থাকি live আমি নেতিবাচক প্রতিক্রিয়ার ক্ষেত্রে onRequestPerificationsResult () এ টোস্ট বার্তাটি দেখিয়ে দিচ্ছি তবে কেবল যদি আমি আমার কাস্টম যুক্তি পপআপ না দেখি। সুতরাং যদি ব্যবহারকারী 'আর কখনও জিজ্ঞাসা করবেন না' চয়ন করে থাকে তবে সে কেবল টোস্টের বার্তা পায়। ব্যবহারকারী যদি 'আর কখনও জিজ্ঞাসা না করেন' বেছে নিতে নারাজ হন তবে তিনি কেবল কাস্টম যুক্তি এবং অপারেশন সিস্টেমের দ্বারা অনুমতি অনুরোধ পপআপ পায় তবে টোস্ট না, কারণ পর পর তিনটি বিজ্ঞপ্তি অত্যধিক ব্যথা হতে পারে।


0

আমাকে ক্যামেরার জন্য গতিশীল অনুমতি প্রয়োগ করতে হবে। যেখানে 3 সম্ভাব্য কেস দেখা দেয়: 1. মঞ্জুরি দিন, 2. অস্বীকার করেছেন, 3. আবার জিজ্ঞাসা করবেন না।

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    for (String permission : permissions) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permission)) {
            //denied
            Log.e("denied", permission);
        } else {
            if (ActivityCompat.checkSelfPermission(getActivity(), permission) == PackageManager.PERMISSION_GRANTED) {
                //allowed
                Log.e("allowed", permission);
            } else {
                //set to never ask again
                Log.e("set to never ask again", permission);
                //do something here.
            }
        }
    }
    if (requestCode != MaterialBarcodeScanner.RC_HANDLE_CAMERA_PERM) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        return;
    }
    if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        mScannerView.setResultHandler(this);
        mScannerView.startCamera(mCameraId);
        mScannerView.setFlash(mFlash);
        mScannerView.setAutoFocus(mAutoFocus);
        return;
    } else {
        //set to never ask again
        Log.e("set to never ask again", permissions[0]);
    }
    DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            dialog.cancel();
        }
    };
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
    builder.setTitle("Error")
            .setMessage(R.string.no_camera_permission)
            .setPositiveButton(android.R.string.ok, listener)
            .show();


}

private void insertDummyContactWrapper() {
        int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.CAMERA);
        if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.CAMERA},
                    REQUEST_CODE_ASK_PERMISSIONS);
            return;
        }
        mScannerView.setResultHandler(this);
        mScannerView.startCamera(mCameraId);
        mScannerView.setFlash(mFlash);
        mScannerView.setAutoFocus(mAutoFocus);
    }

private int checkSelfPermission(String camera) {
    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
            != PackageManager.PERMISSION_GRANTED) {
        return REQUEST_CODE_ASK_PERMISSIONS;
    } else {
        return REQUEST_NOT_CODE_ASK_PERMISSIONS;
    }
}

0

উপর সম্প্রসারিত mVck এর উত্তর উপরে, নিম্নলিখিত যুক্তিবিজ্ঞান কিনা তা নির্ধারণ করে "নেভার আবার জিজ্ঞাসা" একটি প্রদত্ত অনুমতির অনুরোধ জন্য চেক করা হয়েছে:

bool bStorage = grantResults[0] == Permission.Granted;
bool bNeverAskForStorage =
    !bStorage && (
        _bStorageRationaleBefore == true  && _bStorageRationaleAfter == false ||
        _bStorageRationaleBefore == false && _bStorageRationaleAfter == false
    );

যা নীচে থেকে উদ্ধৃত হয়েছে (পুরো উদাহরণের জন্য এই উত্তরটি দেখুন )

private bool _bStorageRationaleBefore;
private bool _bStorageRationaleAfter;        
private const int ANDROID_PERMISSION_REQUEST_CODE__SDCARD = 2;
//private const int ANDROID_PERMISSION_REQUEST_CODE__CAMERA = 1;
private const int ANDROID_PERMISSION_REQUEST_CODE__NONE = 0;

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    switch (requestCode)
    {
        case ANDROID_PERMISSION_REQUEST_CODE__SDCARD:               
            _bStorageRationaleAfter = ShouldShowRequestPermissionRationale(Android.Manifest.Permission.WriteExternalStorage);
            bool bStorage = grantResults[0] == Permission.Granted;
            bool bNeverAskForStorage =
                !bStorage && (
                    _bStorageRationaleBefore == true  && _bStorageRationaleAfter == false ||
                    _bStorageRationaleBefore == false && _bStorageRationaleAfter == false
                );      
            break;                
    }
}

private List<string> GetRequiredPermissions(out int requestCode)
{
    // Android v6 requires explicit permission granting from user at runtime for security reasons            
    requestCode = ANDROID_PERMISSION_REQUEST_CODE__NONE; // 0
    List<string> requiredPermissions = new List<string>();

    _bStorageRationaleBefore = ShouldShowRequestPermissionRationale(Android.Manifest.Permission.WriteExternalStorage);
    Permission writeExternalStoragePerm = ApplicationContext.CheckSelfPermission(Android.Manifest.Permission.WriteExternalStorage);
    //if(extStoragePerm == Permission.Denied)
    if (writeExternalStoragePerm != Permission.Granted)
    {
        requestCode |= ANDROID_PERMISSION_REQUEST_CODE__SDCARD;
        requiredPermissions.Add(Android.Manifest.Permission.WriteExternalStorage);
    }

    return requiredPermissions;
}

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

        // Android v6 requires explicit permission granting from user at runtime for security reasons
        int requestCode;
        List<string> requiredPermissions = GetRequiredPermissions(out requestCode);
        if (requiredPermissions != null && requiredPermissions.Count > 0)
        {
            if (requestCode >= ANDROID_PERMISSION_REQUEST_CODE__SDCARD)                    
            {
                _savedInstanceState = savedInstanceState;
                RequestPermissions(requiredPermissions.ToArray(), requestCode);
                return;
            }
        }
    }            

    OnCreate2(savedInstanceState);
}

0

আপনি অ্যান্ড্রয়েড অফিসিয়াল ডকুমেন্টটি অ্যাপ্লিকেশন অনুমতিগুলির অনুরোধটি পড়তে পারেন

অথবা আপনি গিথুব এ অনেক জনপ্রিয় অ্যান্ড্রয়েড অনুমতি গ্রন্থাগার খুঁজে পেতে পারেন


2
কেবল একটি লাইব্রেরির পরামর্শ দেওয়া ভাল উত্তম নয়: সমস্যাটি সমাধানের জন্য কীভাবে সেগুলি ব্যবহার করবেন তা অন্তত ব্যাখ্যা করুন।
এম

0

প্রশ্নের সঠিকভাবে উত্তর দিতে, ব্যবহারকারী "কখনই জিজ্ঞাসা করবেন না" চাপলে কী ঘটে?

ওভাররাইড পদ্ধতি / ফাংশন

onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)

মঞ্জুরিরসাল্ট অ্যারে খালি হয়ে আসে, তাই আপনি সেখানে কিছু করতে পারেন? তবে সেরা অনুশীলন না।

"আর কখনও জিজ্ঞাসা করবেন না" কীভাবে পরিচালনা করবেন?

আমি ফ্র্যাগমেন্টের সাথে কাজ করছি, যার READ_EXTERNAL_STORAGE অনুমতি দরকার।

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        when {
            isReadPermissionsGranted() -> {

                /**
                 * Permissions has been Granted
                 */

                getDirectories()
            }

            isPermissionDeniedBefore() -> {

                /**
                 * User has denied before, explain why we need the permission and ask again
                 */

                updateUIForDeniedPermissions()
                checkIfPermissionIsGrantedNow()

            }
            else -> {

                /**
                 * Need to ask For Permissions, First Time
                 */

                checkIfPermissionIsGrantedNow()

                /**
                 * If user selects, "Dont Ask Again" it will never ask again! so just update the UI for Denied Permissions
                 */

                updateUIForDeniedPermissions()

            }
        }
    }

অন্যান্য ফাংশনগুলি তুচ্ছ।

// Is Read Write Permissions Granted
fun isReadWritePermissionGranted(context: Context): Boolean {
    return (ContextCompat.checkSelfPermission(
        context as Activity,
        Manifest.permission.READ_EXTERNAL_STORAGE
    ) == PackageManager.PERMISSION_GRANTED) and
            (ContextCompat.checkSelfPermission(
                context,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            ) == PackageManager.PERMISSION_GRANTED)
}

fun isReadPermissionDenied(context: Context) : Boolean {
    return ActivityCompat.shouldShowRequestPermissionRationale(
        context as Activity,
        PermissionsUtils.READ_EXTERNAL_STORAGE_PERMISSIONS)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.