onRequestPerificationsResult টুকরা এবং ক্রিয়াকলাপ উভয় ক্ষেত্রে সংজ্ঞায়িত হলে খণ্ডে কল করা হবে না


167

আমার একটি খণ্ড রয়েছে যার মধ্যে আমার পুনর্ব্যবহারযোগ্য ভিউ অ্যাডাপ্টার ব্যবহার করে এই পুনর্ব্যবহারযোগ্য ভিউতে ডেটা সেট করা আছে।

এখন, অ্যাডাপ্টারের তালিকার আইটেমটিতে আমার একটি বোতাম রয়েছে যার উপর ক্লিক করে আমার অ্যান্ড্রয়েডে নতুন অনুমতি মডেলের জন্য অ্যান্ড্রয়েডে READ_EXTERNAL_STORAGE অনুমতি পরীক্ষা করতে হবে।

অনুমতি দেওয়া হয়েছে কিনা তা যাচাই করার জন্য আমি এই অ্যাডাপ্টারের খণ্ডে একটি নতুন ফাংশন তৈরি করেছি এবং যদি ইতিমধ্যে অনুমোদিত না হয় তবে অনুমতিের জন্য অনুরোধ করব।

আমি মাইফ্রেগমেন্ট.এটি অ্যাডাপ্টারে একটি প্যারামিটার হিসাবে পাস করেছি এবং অ্যাডাপ্টারের বোতামে টুকরোটির পদ্ধতিটি কল করছি।

আমি খণ্ডে অনুরোধপরিমেশন কল করতে নীচের কোডটি ব্যবহার করেছি।

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED){
       requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                ConstantVariables.READ_EXTERNAL_STORAGE);
    }

আমি onRequestPermissionsResultনীচের কোডটি ব্যবহার করে টুকরোটিতে পদ্ধতিটি ওভাররাইড করেছি :

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case ConstantVariables.READ_EXTERNAL_STORAGE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, proceed to the normal flow.
                startImageUploading();
            } else {}

তবে এটি কল হচ্ছে না, পরিবর্তে এই ক্রিয়াকলাপের অন‍্যুয়েস্টপিরেশনস রেজাল্ট পদ্ধতি কল করা হচ্ছে।

খণ্ডের পিতামাতার ক্রিয়াকলাপেও আমি একই onRequestPermissionResult পদ্ধতিটি সংজ্ঞায়িত করেছি এবং এটি কল হচ্ছে।

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


1
খণ্ডে এই লিঙ্কটি রান টাইম অনুমতিগুলি উল্লেখ করুন এটি হ'ল সমাধান
অ্যান্টনি জ্যাকসন

উত্তর:


371

বিস্তৃত সমস্যাগুলি কভার করার জন্য সম্পাদিত উত্তর

আমি মনে করি আপনি খণ্ডন এবং ক্রিয়াকলাপের জন্য পদ্ধতিটিকে বিভ্রান্ত করছেন। আমার প্রকল্পটিও গত মাসে একই রকম ছিল। আপনার অবশেষে নিম্নলিখিতগুলি রয়েছে কিনা তা পরীক্ষা করে দেখুন:

  1. AppCompatActivity এ ActivityCompat.requestperifications পদ্ধতিটি ব্যবহার করুন
  2. ভি 4 সমর্থন খণ্ডে আপনার অনুরোধগুলি ব্যবহার করা উচিত
  3. ক্যাচটি হ'ল যদি আপনি আপনার খণ্ডে অ্যাপকম্প্যাটঅ্যাক্টিভিটি.রম্পেস্পেরেশনগুলি কল করেন তবে কলব্যাকটি ক্রিয়াকলাপে আসবে না খণ্ডে
  4. super.onRequestPermissionsResultক্রিয়াকলাপ থেকে কল করতে ভুলবেন না onRequestPermissionsResult

এটি সাহায্য করে কিনা দেখুন।


9
কেবলমাত্র দ্বিগুণ চেক করার জন্য আপনার কার্যকলাপে আপনার
সুপার.অনিরীক্ষণ সংবর্ধনা সংস্থান রয়েছে

27
super.onrequestpermissionresultক্রিয়াকলাপের ক্রমবর্ধমান সংযোজন সংক্রান্ত বিজ্ঞাপনে যোগ করার সময় আমি যখন অনুমতি ব্যবহারের জন্য অনুরোধ করব তখন এই বিভাগটির অনির্বাগ্রে সংবর্ধনা ডাকে কল করুন requestpermissions। এটি এখন
ঠিকঠাক


4
অনুরোধপরিমেশনের জন্য () এপিআই স্তরের 23 প্রয়োজন API
অ্যাডাম হুরউইৎস

2
@ এমএসসিএইচএ 1. ক্রিয়াকলাপ এবং বিভাজনের ফলাফলগুলিতে, প্রথম লাইনটি হওয়া উচিত: সুপার.অন রিকোয়েস্টপিরেশনস রেজাল্ট (অনুরোধকোড, অনুমতি, অনুদানের ফলাফল); ২. খণ্ডের যেখানে আপনি অনুমতিটি স্বীকৃত হলেন কেবল অনুরোধটি কল করুন না পারফরমেশন পদ্ধতি: অনুরোধপরিমেশনস (নতুন স্ট্রিং [] {Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
এআরএফ

122

আমি একটি খণ্ড এবং অংশে অবস্থানের অনুমতিের জন্য অনুরোধ করেছি, আমাকে এটি পরিবর্তন করতে হবে:

            ActivityCompat.requestPermissions(getActivity(), new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

এটি:

            requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);

তারপরে onRequestPermissionResult কে খণ্ডে ডাকা হত।


2
কবজির মতো কাজ করে :)
আন্তোনিও ভ্ল্যাসিক

1
এটি কোটলিনের সাথে কাজ করছে না আপনি দয়া করে এখানে আমাকে অনুরোধ করতে পারেন এই অনুরোধটির জন্য ব্যবহৃত হয় প্রেরেশনস (ক্রিয়াকলাপ হিসাবে প্রসঙ্গ, অনুমতি তালিকা, টোপাইড অ্যারে (), এমওয়াইপર્મিএসআইএসএনএসকিউএসইটি)
আরবাজ.ইন

ধন্যবাদ :), আপনি আমার সময় বাঁচান
অ্যাক্সরক্সো'জা যোডগোরোভ

19

মার্শমেলো কোডিংয়ের সময় লোকেদের এটি একটি সাধারণ ভুল।

AppCompatActivity এ থাকা অবস্থায় আপনার ActivityCompat.requestPermission ব্যবহার করা উচিত; Android.support.v4.app.Fraਮੈਂਟ এ থাকাকালীন আপনার অনুরোধের অনুরোধটি সহজেই ব্যবহার করা উচিত (এটি একটি android.support.v4.app.Fraਮੈਂਟ এর একটি উদাহরণ পদ্ধতি) আপনি যদি কোনও খণ্ডে ক্রিয়াকলাপ.টাকে পুনঃসংশোধন কল করেন তবে onRequestPerferencesResult কলব্যাক কল করা হবে ক্রিয়াকলাপ এবং খণ্ড না।

requestPermissions(permissions, PERMISSIONS_CODE);

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

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

ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);

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

requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);

রেফারেন্সের জন্য, আমি এই লিঙ্কটি থেকে https://www.coderzheaven.com/2016/10/12/onrequestpermissionresult-not-called-on-frations/- এ উত্তরটি পেয়েছি


6

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

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

প্রথমে আপনাকে সমর্থন-ভি 13 নির্ভরতা যুক্ত করতে হবে:

implementation "com.android.support:support-v13:$supportLibVersion"

ফ্র্যাগমেন্টকম্প্যাটটি 27.1.0 সংস্করণ থেকে অবহিত করা হয়েছে
রাজ

6

এই পরিবর্তন :

ActivityCompat.requestPermissions(
    activity,
    arrayOf(Manifest.permission.READ_CONTACTS),
    PERMISSIONS_REQUEST_READ_CONTACTS
)

এটি:

requestPermissions(
     arrayOf(Manifest.permission.READ_CONTACTS),
     PERMISSIONS_REQUEST_READ_CONTACTS
)

নীচের অংশটি একটি খণ্ডে ব্যবহারের জন্য হয় (onRequestPerificationsResultকে খণ্ডে বলা হয়), ক্রিয়াকলাপে অনারেক্টপিরমিশনসাল্ট বসানো হলে অ্যাক্টিভিটিকম্প্যাট সংস্করণটি ব্যবহার করা হয়।
গর্জন গ্রানমো

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

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

অনুমতি পরিবর্তন করুন


2
হাই ব্যবহারকারী 2002721; আপনার কোডটি সঠিক হতে পারে তবে কিছু প্রসঙ্গে এটি আরও ভাল উত্তর দিতে পারে; উদাহরণস্বরূপ, আপনি ব্যাখ্যা করতে পারেন কীভাবে এবং কেন এই প্রস্তাবিত পরিবর্তনটি প্রশ্নকারীর সমস্যার সমাধান করবে, সম্ভবত প্রাসঙ্গিক ডকুমেন্টেশনের লিঙ্ক সহ। এটি তাদের কাছে এটি আরও দরকারী এবং অন্যান্য সাইটের পাঠকদের জন্য আরও দরকারী যারা একই ধরণের সমস্যার সমাধান খুঁজছেন।
ভিন্স বাউডরেন

প্রোগ্রামটি প্রথমে দৈর্ঘ্য পরীক্ষা না করেই অনুদানের 0 সূচকটি অ্যাক্সেস করে অ্যাক্সেস করতে পারলে প্রোগ্রামটি সীমা ব্যতিক্রমের বাইরে অ্যারে ফেলে দিতে পারে। এটা আমার প্রোগ্রামে ঘটেছে। এটিকে রোধ করার জন্য আমি যদি বিবৃতিটিকে অভ্যন্তরীণ হিসাবে গ্র্যান্টের ফলাফলের জন্য পৃথক করে থাকি এবং এটি এখন ঠিকঠাক কাজ করে।
পিটার গ্রিফিন

1

এই গৃহীত উত্তরটি আমার পক্ষে কার্যকর হয় নি, তাই আমি নিজের সমাধানটি পেয়েছি, যা নীচে ব্যাখ্যা করা হয়েছে:

প্রথম প্রথম খণ্ডে একটি পদ্ধতি তৈরি করেছি:

public static void MyOnRequestPermissionResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
        if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.d(TAG, "Permission: true");
        } else {
            Log.d(TAG, "permission: false");
        }
}

২. এবং এরপরে এর অন্তর্নিহিত ক্রিয়াকলাপ থেকে এটিকে ডাকল:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if(requestCode ==1){
        SignupFragment.MyOnRequestPermissionResult(requestCode, permissions, grantResults);
    }
}

এবং এটি কাজ করছে ...


0

যাচাই করুন যে উভয় PERMISSION_REQUEST_CODEমধ্যে onRequestPermissionsResultএবং ভিতরে আপনার Fragmentএকই মান রয়েছে।


0

TragetSDK 28 এর জন্য, SDK চেক (> 23) এবং খণ্ডের অনুরোধগুলি কাজ করবে। ActivityCompat.requestPerifications ব্যর্থ হচ্ছে (যদি আপনি 65536 এর নীচে অনুরোধ কোড সেট করেন, অনুমতি ডায়ালগটি উপস্থিত হবে এবং ব্যবহারকারী যদি অনুমতি অনুমতি দেয় তবে অনুমতিগুলি সরবরাহ করা হয়, তবে কোনও কলব্যাক ঘটবে না But তবে আপনি যদি 65536 এর উপরে সেট করেন তবে ActivityCompat.requestPerferences তাত্ক্ষণিকভাবে ব্যর্থ। আমি এই যুক্তির পিছনে যুক্তি জানি না a কোনও বাগ বা ইচ্ছাকৃত হতে পারে)।

কাজের কোড:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }

আপনার সংস্করণ চেক করার দরকার নেই। ২৩ এর নীচের সংস্করণগুলিতে এটি কেবল 'অনুমতি দেওয়া' মানটি ফিরিয়ে দেবে। বিকাশকারীর পছন্দ এখানে: সরলতার জন্য 'যদি' অবরুদ্ধ করুন বা প্রয়োজন নেই তখন অনুরোধ কলটি
এড়ান

0

আপনি যদি কোটলিনের সাথে কাজ করছেন তবে আপনাকে স্পষ্টভাবে উল্লেখ করতে হবে যে আপনি ক্রিয়াকলাপ নয়, খণ্ডিত পদ্ধতিতে কল করছেন

 fragment.requestPermissions(permissions, PERMISSIONS_CODE);

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

ভি 4.ফ্রেগমেন্ট থেকে রানটাইম অনুমতিগুলির জন্য অনুরোধ করুন এবং কলব্যাক ফ্র্যাগমেন্টে যান?


0

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

main_activty.xml

<fragment
    android:id="@+id/fragment"
    android:name="com.exampe.SomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

আমি FragmentTransactionপরিবর্তে ব্যবহার করার সময় এই সমস্যাটি আমার জন্য সমাধান হয়েছিল


0

২৩ এর নীচে থাকা এপিআইগুলিতে আপনি ক্রিয়াকলাপে একটি ইন্টারফেস তৈরি করতে পারেন তারপরে এটি শিশু খণ্ডে প্রয়োগ করুন এবং যখন আপনি অনুমতি অনুরোধের ফলস্বরূপ ক্রিয়াকলাপটি এটিকে খণ্ডের মধ্যে প্রয়োগ করা ইন্টারফেসে প্রেরণ করে। এটি এই সহজ :)


0

আপনি নীচে ফ্রেগমেন্ট পদ্ধতি কল করতে পারেন

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case REQUEST_CODE:
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission is granted. Continue the action or workflow
                // in your app.
                doActionBecauseNowYouCanBro();
            } else {
                // Explain to the user that the feature is unavailable because
                // the features requires a permission that the user has denied.
                // At the same time, respect the user's decision. Don't link to
                // system settings in an effort to convince the user to change
                // their decision.
                showWhyRequestPermissionsAndDontBlockUserItsCalledManners();
            }
            return;
    }
    // Other 'case' lines to check for other
    // permissions this app might request.

}

-5

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

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


3
- একটি উত্তর অনুলিপি করার পরিবর্তে, আপনি শুধু একটি লিঙ্ক প্রদান করতে পারে stackoverflow.com/a/33081173/630833
jayeffkay
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.