অ্যান্ড্রয়েড এম অনুমতি: onRequestPermissionResult () কল করা হচ্ছে না


291

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

আমি ডিগ্রিগ করেছি এবং onRequestPerificationsResult () পদ্ধতিতে ব্রেকপয়েন্ট সেট করেছি তবে এটি কখনই এর মধ্যে যায় না।

এই পদ্ধতিটি প্রথম বলা হয়:

    private void askForPermission() {
    String[] permissions = new String[]{Manifest.permission.SEND_SMS};
    ActivityCompat.requestPermissions(getActivity(), permissions, PERMISSIONS_CODE);
}

এবং তারপরে আমার কলব্যাকটি এমন দেখাচ্ছে:

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

    if (requestCode == PERMISSIONS_CODE) {
        for (int i = 0; i < permissions.length; i++) {
            String permission = permissions[i];
            int grantResult = grantResults[i];

            if (permission.equals(Manifest.permission.SEND_SMS)) {
                if (grantResult == PackageManager.PERMISSION_GRANTED) {
                    onPPSButtonPress();
                } else {
                    requestPermissions(new String[]{Manifest.permission.SEND_SMS}, PERMISSIONS_CODE);
                }
            }
        }
    }
}

কেউ কি একই রকম সমস্যা নিয়ে চলেছে? এটির সাথে কোনও সহায়তার প্রশংসা করুন। ধন্যবাদ

উত্তর:


576

আমি একই ইস্যুতে দৌড়েছি এবং আমি সবেমাত্র সমাধানটি পেয়েছি। সমর্থন লাইব্রেরি ব্যবহার করার সময়, আপনাকে সঠিক পদ্ধতি কলগুলি ব্যবহার করতে হবে। উদাহরণ স্বরূপ:

  • AppCompatActivity এ থাকা অবস্থায় , আপনার ActivityCompat.requestPermission ব্যবহার করা উচিত ;
  • যখন android.support.v4.app.Fraament এ থাকে , আপনার কেবল অনুরোধের অনুরোধগুলি ব্যবহার করা উচিত (এটি android.support.v4.app.Fraament এর উদাহরণ পদ্ধতি)

আপনি যদি কোনও খণ্ডে ক্রিয়াকলাপকেম্পট.আরকুয়েস্টপিরিশনগুলি কল করেন তবে onRequestPerferencesResult কলব্যাকটি ক্রিয়াকলাপে কল করা হয় না খণ্ডে।

আশাকরি এটা সাহায্য করবে!


13
এটি noHistory ক্রিয়াকলাপগুলির সাথেও ঘটে: কোড. google.com/p/android-developer-preview/issues/…
অ্যান্টনি বোবনেরিথ

11
"যখন android.support.v4.app.Fraament এ থাকে, আপনার কেবল অনুরোধের অনুরোধগুলি ব্যবহার করা উচিত" - আপনাকে ধন্যবাদ!
টিগ্রান সার্কিসিয়ান

5
@ অ্যান্টনিবোজনরিথ তাই নোহোস্টরি অ্যাক্টিভেটদের এখানে কী সমাধান? আমরা কেবল তাদের কাছ থেকে অনুমতি চাইতে পারি না?
ডিন ওয়াইল্ড

2
লিঙ্কটি নষ্ট হয়েছে @ অ্যান্থনিবোয়েনরিথ। কোন ইতিহাসের কোন সমাধান আছে কি?
fersarr

3
ব্যবহার করার সময় Fragment.requestPermissions(), পিতামাতার ক্রিয়াকলাপটি আসলে তা গ্রহণ করে onRequestPermissionsResult()। (এটি সমর্থন লাইব্রেরি ২৩.৩.০ সহ)
কেউ কোথাও

101

আপনি এটি চেষ্টা করতে পারেন:

requestPermissions(permissions, PERMISSIONS_CODE);

আপনি যদি এই কোডটি কোনও খণ্ড থেকে কল করে থাকেন তবে এটির নিজস্ব অনুরোধপরিমেশন পদ্ধতি রয়েছে। আমি বিশ্বাস করি যে সমস্যাটি হ'ল আপনি স্থিতিশীল পদ্ধতিটি কল করছেন।

আপনি যদি onRequestPermissionsResult()কোনও খণ্ডে চান তবে প্রো টিপ : FragmentCompat.requestPermissions(Fragment fragment, String[] permissions, int requestCode)


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

এটি আমার জন্য অ্যান্ড্রয়েড এম তে কাজ করেছে তবে কেবল ভাবছেন যে এটি প্রি-এম ডিভাইসে কোনও সমস্যা সৃষ্টি করবে?
বালা বিষ্ণু

4
@ গুডগেমারগুয়ে নিশ্চিত করে নিন যে আপনি অনুরোধ কোডটি onRequestPermissionResult এর ক্রিয়াকলাপে ব্যবহার করবেন না। যদি আপনার ক্রিয়াকলাপেও রেকর্ডপিরমিজেশনস রেজাল্ট কলব্যাক ব্যবহার করে তবে আপনাকে ডিফল্ট প্রদান করতে হবে: সুপার.অনগ্রিসটপ্রিটারেশনস রেজাল্ট (অনুরোধ কোড, অনুমতি, অনুদানের ফলাফল);
টিমি সাইমনস

68

আমি আশা করি এটি ঠিক আছে

ক্রিয়াকলাপের জন্য:

 ActivityCompat.requestPermissions(this,permissionsList,REQUEST_CODE);

খণ্ডের জন্য:

 requestPermissions(permissionsList,REQUEST_CODE);

এসডিকে 15 এবং নিম্নের কী হবে?
জুলকরনাইন শাহ

4
আপনার এসডিকে 15 সম্পর্কে অনুমতি প্রয়োজন নেই, কেবল
মার্শমালো

50

আমিও এই সমস্যার মুখোমুখি হয়েছি। আপনি যদি এমন কার্যকলাপ চান যা ইতিহাস / রিসেন্টগুলিতে নয় অনুমতিগুলি পরিচালনা করে তবে আপনি আপনার AndroidManifest.xmlপ্রবেশ পরিবর্তন পরিবর্তন করতে প্ররোচিত হবেন ।

আপনি কার্যকলাপ সেট করেন তাহলে যে আপনাকে কল requestPermissionsবা AppCompatActivity.requestPermissionsসঙ্গে

android:noHistory="true"
android:excludeFromRecents="true"

আপনার AndroidManifest.xmlতখন onRequestPermissionsResult()বলা হবে না। এই সত্য আপনার কার্যকলাপ থেকে প্রাপ্ত করা হয় যদি Activityবা AppCompatActivity

'AndroidManLive.xML' থেকে দুটি পতাকা সরিয়ে এবং finishAndRemoveTask()পরিবর্তে আপনার ক্রিয়াকলাপ শেষ করে এটি ঠিক করা যেতে পারে ।


আমি বরং ইতিহাস সম্পর্কিত বৈশিষ্ট্য অপসারণ করতে হবে না, কিন্তু এটি আমার জন্য কাজ করে সমাধান ছিল। ধন্যবাদ!
এরিক শ্লেঞ্জ

1
আমার ইস্যুটি মার্শমেলোতে হয়েছিল তবে নওগাতে নয়, ধন্যবাদ এটি আমার পক্ষে কাজ করেছে
Yohan Dahmani

37

আপনার যদি onRequestPermissionsResultক্রিয়াকলাপ এবং খণ্ড দুটোই থাকে তবে ক্রিয়াকলাপে কল করতে ভুলবেন super.onRequestPermissionsResultনা। এটি খণ্ডে প্রয়োজন হয় না, তবে এটি ক্রিয়াকলাপে রয়েছে।


এছাড়াও, মনে রাখবেন যে আপনি যদি কোনও এপিআই লক্ষ্য করে থাকেন (যেমন 19 হিসাবে উদাহরণস্বরূপ), আপনি এখনও পুরানো অনুমতি মডেল সিস্টেমের অধীনে থাকবেন এবং এইভাবে, অনুরোধের অনুমতি সম্পর্কিত ফাংশন কলগুলি গ্রহণ করবেন না
বোনাটি

আমার উত্তরটি দেখুন যদি আপনি অন্য কোনও ক্রিয়াকলাপ বাড়িয়ে দিয়েছেন যা সুপার না বলে
টাচবোর্ডার

3
হোঁচট খেয়েছে এইটাকে। FragmentActivity.onRequestPermissionsResult(..)যেখানে খণ্ডগুলিতে কলটি onRequestPermissionsResult(..)ফরোয়ার্ড করা হয়েছে।
জানপল

@ বনাত্তি তাই যদি আমি অ্যান্ড্রয়েড ৪.৪.২ এ অনুমতি চেয়ে অনুরোধ করার চেষ্টা করি তবে আমি কোনও ফল পাব না? সুতরাং আমি কি অনুমতিগুলি পরিবর্তন করতে পারি না, কেবল সেগুলি দেখতে পারি?
অ্যালেক্স ফ্রেগোটসিস

পছন্দ করুন কেবল পার্থক্য হ'ল আপনাকে অনুমতি দেওয়ার জন্য বলা হবে না, পরিবর্তে আপনাকে স্বয়ংক্রিয়ভাবে সিস্টেম দ্বারা মঞ্জুরি দেওয়া হবে।
দুসান জিভকোভিচ

33

উত্তর অবহেলিত দয়া করে এখানে দেখুন: https://developer.android.com/training/permission/requesting

খণ্ডের ভিতরে, আপনাকে কল করতে হবে:

FragmentCompat.requestPermissions(permissionsList, RequestCode)

না:

ActivityCompat.requestPermissions(Activity, permissionsList, RequestCode);

2
Android.support.v13.app.FragmentCompat
Udi Oshi

1
ফ্রেগমেন্টকম্প্যাটটি এপিআই 27.1.0 হিসাবে অবহিত করা হয়েছে।
বিগ ম্যাকলার্জহিউজ

আমার উত্তরটি
অবহেলা

15

আপনি যদি খণ্ডে অনুরোধপরিমেশনগুলি ব্যবহার করছেন তবে এটি 3 এর পরিবর্তে 2 টি পরামিতি গ্রহণ করে।

আপনার ব্যবহার করা উচিত requestPermissions(permissions, PERMISSIONS_CODE);


1
আসলে এটি প্রশ্নের উত্তর দেয়। ActivityCompat.requestPerifications এর পরিবর্তে অনুরোধকে পেরেকিংয়ের অনুরোধগুলি (টুকরো টুকরো করার পদ্ধতি), ফলাফল পদ্ধতিটি ট্রিগার করা হয়। যা এখানে মূল ইস্যু। আপনাকে ডন ধন্যবাদ
ওয়াকলক

15

যদি কোনও কারণে আপনি কিছু বাহ্যিক লাইব্রেরিতে অবস্থিত একটি কাস্টম ক্রিয়াকলাপ বাড়িয়ে দিয়েছেন যা সুপারকে কল করে না তবে আপনাকে নিজের অ্যাক্টিভিটি'র অনির্বাচনপর্বশ্রুতিতে নিজেকে ক্রিয়াকলাপটিকে কল করতে হবে।

YourActivity extends SomeActivityNotCallingSuperOnRequestPermissionsResult{
Fragment requestingFragment;//the fragment requesting the permission
...
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(requestingFragment!=null)
            requestingFragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
...

12

আপনার ফ্রেগমেন্টকম্পেটে প্রাক মার্শমেলো ডিভাইসের জন্য চেকপিরমিশন ফাংশন রয়েছে । আমি এটি ব্যবহার করি:

FragmentCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

2
এটি কেবল তখনই কাজ করছে যদি অ্যান্ড্রয়েড.এপ.ফ্রেগমেন্টের ভিতরে অনুমতি জিজ্ঞাসা করা হয় এবং আপনাকে সমর্থন-ভি 13 লাইব্রেরি আমদানি করতে হবে!
মোহাম্মদরেজা

4
ফ্রেগমেন্টকম্প্যাট.রেকস্টপিরমিশন () android.support.v4.app.Fraament এর সাথে কাজ করে না। যে কেউ এটি পরিচালনা করতে জানেন।
জুটিকর্ন

12

আমি খুঁজে পেয়েছি যে আপনি কল যেখানে এটা গুরুত্বপূর্ণ android.support.v4.app.Fragment.requestPermissions

যদি আপনি এটি করেন onCreate(),onRequestPermissionsResult() কখনও বলা হয়।

সমাধান: এটি কল onActivityCreated();

@Override
public void onActivityCreated(Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    if (ContextCompat.checkSelfPermission(context, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) 
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 0);

}

1
আমি একই সমস্যার মুখোমুখি হয়েছি তবে আমি আমার কোডটিতে আসতে পারছি না onActivityCreated()। SDK 23.
kAmol


আমি খণ্ডে নেই, আমি কোনও ক্রিয়াকলাপের
অনকারে

হুম, না ব্যবহার onPause()?
almisoft

10

এই সমস্যাটি আসলে নেস্টেডফ্রেগমেন্টগুলির কারণে ঘটছিল। মূলত বেশিরভাগ টুকরোগুলির মধ্যে আমরা একটি হোস্টেডফ্র্যাগমেন্ট প্রসারিত করি যা ঘুরে ফিরে কমপ্যাটফ্র্যাগমেন্ট প্রসারিত করে। এই নেস্টেড টুকরো টুকরো টুকরোটি থাকার কারণে সমস্যাগুলি শেষ পর্যন্ত এই প্রকল্পের অন্য বিকাশকারী সমাধান করেছেন।

এই কাজটি পেতে তিনি কিছুটা নিম্ন স্তরের জিনিস যেমন বিট স্যুইচিং করছিলেন তাই আসল চূড়ান্ত সমাধান সম্পর্কে আমি খুব বেশি নিশ্চিত নই


এটি আমার সমস্যা সমাধানে আমাকে সহায়তা করেছে: আমাকে পিতা-মাতা টুকরা থেকে বাচ্চা (নেস্টেড) টুকরাটিতে পুনঃনির্দেশ করতে হয়েছিল R ভকভগক!
মারফি

9
 /* use the object of your fragment to call the 
 * onRequestPermissionsResult in fragment after
 * in activity and use different request Code for 
 * both Activity and Fragment */

   if (isFragment)
    mFragment.requestPermissions(permissions.toArray(new
    String[permissions.size()]),requestPermission);

   else
    ActivityCompat.requestPermissions(mActivity,permissions.toArray(new
    String[permissions.size()]),requestPermission);


5

আপনি যদি এই কোডটি কোনও খণ্ড থেকে কল করে থাকেন তবে এটির নিজস্ব অনুরোধপরিমেশন পদ্ধতি রয়েছে।

সুতরাং বেসিক ধারণাটি হ'ল, আপনি যদি কোনও ক্রিয়াকলাপে থাকেন তবে কল করুন

ActivityCompat.requestPermissions(this,
                            permissionsList,
                            permissionscode);

এবং যদি কোনও খণ্ডে থাকে তবে কেবল কল করুন

requestPermissions(permissionsList,
                            permissionscode);

1
এপিআই স্তরের 23 প্রয়োজন ... পূর্বেরগুলিতে ব্যবহার করুন FragmentCompat.requestPermissions()
মিনাস মিনা

5

আমি কল করার জন্য একটি বোতাম টিপানো বাদ দিয়ে আমার একইরকম সমস্যা হয়েছিল, যা কলআইন্টেন্টকে ট্রিগার করে। আমি প্রথমে অনুমতি চেক করেছি, যদি মঞ্জুর না করা হয় তবে আমি অনুমতি চাইব এবং অন্বেষণপিরমিশন ফলাফল আমি চেকের অনুমতিটি কল করি এবং আবার কল করি call

 @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case Constants.PERMISSIONS_REQUEST_CALL_PHONE: {
            if ( grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                checkPermissionsAndCall();
            }
        }
    }
}

public void checkPermissionsAndCall(){
    if (Build.VERSION.SDK_INT > 22) {
        if(ContextCompat.checkSelfPermission(getContext(),
                Manifest.permission.CALL_PHONE)
                != PackageManager.PERMISSION_GRANTED){
            requestPermissions( new String[]{Manifest.permission.CALL_PHONE}, Constants.PERMISSIONS_REQUEST_CALL_PHONE);
        }
        else{
            callIntent();
        }
    }
}


2

উপরের উত্তর অনুসারে আপনি সবকিছু যাচাই করার আগে নিশ্চিত করুন যে আপনার অনুরোধ কোডটি 0 নয়!

ফ্র্যাগমেন্টএকটিভিটি.জভাতে অনক্রিপস্টেরেশনস রেজাল্ট () এর কোডটি পরীক্ষা করুন:

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {
    int index = (requestCode>>16)&0xffff;
    if (index != 0) {
        index--;

        String who = mPendingFragmentActivityResults.get(index);
        mPendingFragmentActivityResults.remove(index);
        if (who == null) {
            Log.w(TAG, "Activity result delivered for unknown Fragment.");
            return;
        }
        Fragment frag = mFragments.findFragmentByWho(who);
        if (frag == null) {
            Log.w(TAG, "Activity result no fragment exists for who: " + who);
        } else {
            frag.onRequestPermissionsResult(requestCode&0xffff, permissions, grantResults);
        }
    }
}

2
private void showContacts() {
    if (getActivity().checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, PERMISSIONS_REQUEST_READ_CONTACTS);
    } else {
        doShowContacts();
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSIONS_REQUEST_READ_CONTACTS && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        doShowContacts();
    }
}

2

এটি অর্জনের জন্য আমার কাছে একটি আশ্চর্যজনক সমাধান রয়েছে এটির মতো বেসএকটিভিটি করুন।

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this));


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
    switch (requestCode) {
        case 1: {
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                CustomToast.getInstance().setCustomToast("Now you can share the Hack.");

            } else {
                Toast.makeText(this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

}

এখন আপনি কোডটির জন্য এই জাতীয় অনুমতি চাইলে কল করতে পারেন

 ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

এখন প্রতিবার এটি আপনার খণ্ডে বা কোনও ক্রিয়াকলাপে বেস ক্রিয়াকলাপটিকে কল করা হোক না কেন যেখানেই ঘটে।

ধন্যবাদ


1

আপনি ব্যবহার করতে পারেন requestPermissions(PERMISSIONS, MULTIPLE_PERMISSIONS_CODE);। আপনি যদি v4 ব্যবহার করেন তবে ফ্র্যাগমেন্টকম্প্যাট ব্যবহার করবেন না।


কেন দয়া করে বিশদ।
পরিবর্তনযোগ্য

1

বিস্তারিত

  • কোটলিন 1.2.70
  • minSdkVersion 19 এ পরীক্ষা করা হয়েছে
  • অ্যান্ড্রয়েড স্টুডিও 3.1.4

অ্যালগরিদম

মডিউল - ক্যামেরা, অবস্থান, ....

  1. সিস্টেম সিস্টেমের বৈশিষ্ট্য আছে কিনা তা পরীক্ষা করুন (যদি ফোনে মডিউল বিদ্যমান থাকে)
  2. ব্যবহারকারীর মডিউলে অ্যাক্সেস আছে কিনা তা পরীক্ষা করুন
  3. অনুমতিগুলির অনুরোধ প্রেরণ করুন (ব্যবহারকারীকে মডিউল ব্যবহারের অনুমতি দিতে বলুন )

বৈশিষ্ট্য

  1. ক্রিয়াকলাপ এবং খণ্ডগুলি নিয়ে কাজ করুন
  2. শুধুমাত্র একটি ফলাফল প্রতিক্রিয়া আছে
  3. এক অনুরোধে বেশ কয়েকটি মডিউল পরীক্ষা করতে পারে

সমাধান

class PermissionType(val manifest_permission: String, val packageManager: String) {
    object Defined {
        val camera = PermissionType(Manifest.permission.CAMERA, PackageManager.FEATURE_CAMERA)
        val currentLocation = PermissionType(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.FEATURE_LOCATION_GPS)
    }
}

class  Permission {

    enum class PermissionResult {
        ACCESS_ALLOWED, ACCESS_DENIED, NO_SYSTEM_FEATURE;
    }

    interface ManagerDelegate {
        fun permissionManagerDelegate(result: Array<Pair<String, PermissionResult>>)
    }

    class Manager internal constructor(private val delegate: ManagerDelegate?) {

        private var context: Context? = null
        private var fragment: Fragment? = null
        private var activity: AppCompatActivity? = null
        private var permissionTypes: Array<PermissionType> = arrayOf()
        private val REQUEST_CODE = 999
        private val semaphore = Semaphore(1, true)
        private var result: Array<Pair<String, PermissionResult>> = arrayOf()


        constructor(permissionType: PermissionType, delegate: ManagerDelegate?): this(delegate) {
            permissionTypes = arrayOf(permissionType)
        }

        constructor(permissionTypes: Array<PermissionType>, delegate: ManagerDelegate?): this(delegate) {
            this.permissionTypes = permissionTypes
        }

        init {
            when (delegate) {
                is Fragment -> {
                    this.fragment = delegate
                    this.context = delegate.context
                }

                is AppCompatActivity -> {
                    this.activity = delegate
                    this.context = delegate
                }
            }
        }

        private fun hasSystemFeature(permissionType: PermissionType) : Boolean {
            return context?.packageManager?.hasSystemFeature(permissionType.packageManager) ?: false
        }

        private fun hasAccess(permissionType: PermissionType) : Boolean {
            return if (Build.VERSION.SDK_INT < 23) true else {
                context?.checkSelfPermission(permissionType.manifest_permission) == PackageManager.PERMISSION_GRANTED
            }
        }

        private fun sendRequest(permissionTypes: Array<String>) {

            if (fragment != null) {
                fragment?.requestPermissions(permissionTypes, REQUEST_CODE)
                return
            }

            if (activity != null){
                ActivityCompat.requestPermissions(activity!!, permissionTypes, REQUEST_CODE)
            }
        }

        fun check() {

            semaphore.acquire()
            AsyncTask.execute {
                var permissionsForSendingRequest: Array<String> = arrayOf()
                this.result = arrayOf()

                for (it in permissionTypes) {
                    if (!hasSystemFeature(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.NO_SYSTEM_FEATURE)
                        continue
                    }

                    if (hasAccess(it)) {
                        result += Pair(it.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                    } else {
                        permissionsForSendingRequest += it.manifest_permission
                    }
                }

                if (permissionsForSendingRequest.isNotEmpty()) {
                    sendRequest(permissionsForSendingRequest)
                } else {
                    delegate?.permissionManagerDelegate(result)
                }
            }
        }

        fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
            when (requestCode) {
                REQUEST_CODE -> {
                    if (grantResults.isEmpty()) {
                        return
                    }
                    for ((i,permission) in permissions.withIndex()) {
                        for (item in this.permissionTypes) {
                            if (permission == item.manifest_permission && i < grantResults.size) {
                                result += if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_ALLOWED)
                                } else {
                                    Pair(item.manifest_permission, PermissionResult.ACCESS_DENIED)
                                }
                                break
                            }
                        }
                    }
                    delegate?.permissionManagerDelegate(result)
                }
            }
            semaphore.release()
        }
    }
}

ক্রিয়াকলাপের ব্যবহার (একই খণ্ডে)

class BaseActivity : AppCompatActivity(), Permission.ManagerDelegate {

    private lateinit var permissionManager: Permission.Manager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.base_activity)

        permissionManager = Permission.Manager(arrayOf(PermissionType.Defined.camera, PermissionType.Defined.currentLocation), this)
        permissionManager.check()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        permissionManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }


    override fun permissionManagerDelegate(result: Array<Pair<String, Permission.PermissionResult>>) {
        result.forEach {
            println("!!! ${it.first} ${it.second}")
//            when (it.second) {
//                Permission.PermissionResult.NO_SYSTEM_FEATURE -> {
//                }
//
//                Permission.PermissionResult.ACCESS_DENIED  -> {
//                }
//
//                Permission.PermissionResult.ACCESS_ALLOWED -> {
//                }
//            }
        }
    }
}

1

আমি এখানে আমার কোডটি প্রদর্শন করতে চাই যে আমি এটি কীভাবে পরিচালনা করেছি।

public class CheckPermission {

public Context context;

public static final int PERMISSION_REQUEST_CODE =  200;

public CheckPermission(Context context){
    this.context = context;
}

public boolean isPermissionGranted(){
    int read_contact = ContextCompat.checkSelfPermission(context.getApplicationContext() , READ_CONTACTS);
    int phone = ContextCompat.checkSelfPermission(context.getApplicationContext() , CALL_PHONE);

    return read_contact == PackageManager.PERMISSION_GRANTED && phone == PackageManager.PERMISSION_GRANTED;
   }
}

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

public void requestForPermission() {
       ActivityCompat.requestPermissions(MainActivity.this, new String[]    {READ_CONTACTS, CALL_PHONE}, PERMISSION_REQUEST_CODE);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (shouldShowRequestPermissionRationale(ACCESS_FINE_LOCATION)) {
                    showMessageOKCancel("You need to allow access to both the permissions",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                        requestPermissions(new String[]{Manifest.permission.READ_CONTACTS, Manifest.permission.CALL_PHONE},
                                                PERMISSION_REQUEST_CODE);
                                    }
                                }
                            });
                    return;
                }
            }
    }
}

এখন অনক্রিয়েট পদ্ধতিতে আপনাকে অনুরোধের জন্য কল করতে হবে অনুরোধফোর্ডারেশন () ফাংশন।

এটিই। এছাড়াও আপনি একবারে একাধিক অনুমতি চাইতে পারেন।


1

আপডেট:super.onRequestPermissionResult() ক্রিয়াকলাপে কল করার বিষয়ে অন্য কারও উত্তর দেখেছিল এবং এটি যে উল্লিখিত অনুরোধ কোড ইস্যুটি আমি উল্লেখ করেছি তা ঠিক করে এবং এই খণ্ডটির অনারেক্সটপিয়ারেশন রিসাল্টকে কল করে

এই জিনিস উপেক্ষা করুন:

আমার কল করার onRequestPermissionResultপরেও এটি আমার কাছে ক্রিয়াকলাপ ডেকেছিলfragment.requestPermission(...) দিচ্ছিল, তবে এটি একটি ভুল অনুরোধকোড দিয়ে ফলাফলটি ফেরত দিয়েছে (111 কেন 65657 এ পরিণত হয়েছে কেন ??? আমি কখনই জানতে পারব না)।

ভাগ্যক্রমে আমরা কেবলমাত্র সেই পর্দায় অনুরোধ করছি তাই আমি কেবল অনুরোধ কোডটি উপেক্ষা করছি (কেন এখনই এটি সঠিক নয় তা জানার সময় নেই)


65536 এবং 111 যোগ করুন এবং আপনি এটি পাবেন। এটি বিট মাস্কগুলির কারণে। কিছু বিষয় দেখুন।
কুলমাইন্ড

0

আমি একটি সমস্যার মুখোমুখি হয়েছি যে আপনি যদি সঠিক অনুরোধপরিশক্তিগুলি কল করেন তবে আপনার এখনও এই সমস্যা হতে পারে have সমস্যাটি হ'ল পিতামাতার ক্রিয়াকলাপ সুপার না বলে এই পদ্ধতিটিকে ওভাররাইড করতে পারে। সুপার যোগ করুন এবং এটি স্থির করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.