onRequestPermissionsResult, hem fragmanda hem de aktivitede tanımlandıysa parça içinde çağrılmıyor


167

Ben hangi recyclerview ve recyclerview adaptörü kullanarak bu recyclerview veri ayarlama var bir parçası var.

Şimdi, android yeni izin modeli için android READ_EXTERNAL_STORAGE iznini kontrol etmek gerekir üzerine tıklayarak adaptörün liste öğesinde bir düğme yaşıyorum.

Bu bağdaştırıcının parçasında izin verilip verilmediğini kontrol etmek ve henüz verilmemişse izin istemek için yeni bir işlev oluşturdum.

Bağdaştırıcıda bir parametre olarak MyFragment.this'i geçtim ve bağdaştırıcıdaki düğmenin parçasının yöntemini çağırıyorum.

Aşağıdaki kodu parça parça requestPermission aramak için kullandım.

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

onRequestPermissionsResultAşağıdaki kodu kullanarak parça yöntem geçersiz kıldı :

@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 {}

Ancak çağrılmıyor, bunun yerine bu Aktivitenin onRequestPermissionsResult yöntemi çağrılıyor.

Ben de parçanın üst etkinliğinde de aynı onRequestPermissionsResult yöntemini tanımladım ve çağrılıyor.

Etkinliğin onRequestPermissionsResult yöntemini kaldıramıyorum ama parçadan izin istediğinde parçanın onRequestPermissionsResult yöntemini çağırmak istiyorum. Bunu nasıl yapabilirim? Burada yanlış bir şey mi yapıyorum, burada birinin fikri varsa lütfen bana yardım et.


1
Bu bağlantıya bakın çalışma süresi izinleri parça halinde Bu tam çözüm
Antony jackson

Yanıtlar:


373

Daha geniş sorunları kapsayacak şekilde düzenlenmiş cevap

Bence parçalanma ve aktivite yöntemini karıştırıyorsunuz. Geçen ay da projemde benzer bir sorun vardı. Lütfen nihayet aşağıdakilere sahip olup olmadığınızı kontrol edin:

  1. AppCompatActivity'de ActivityCompat.requestpermissions yöntemini kullanın
  2. V4 destek parçasında requestpermissions kullanmalısınız
  3. Yakalama, parçanızda AppcompatActivity.requestpermissions'ı çağırırsanız, geri çağırma parçaya değil etkinliğe gelir
  4. super.onRequestPermissionsResultEtkinliklerden aradığınızdan emin olun onRequestPermissionsResult.

Yardım edip etmediğine bakın.


9
Sadece iki kez kontrol etmek için faaliyetinizde super.onrequestpermissionresult ayarladığınızdan emin olun
VarunJoshi129

27
Etkinliğin super.onrequestpermissionresultonrequestpermissionresult öğesine ekleme , izin istediğimde parçanın onrequestpermissionresult öğesini çağırır requestpermissions. Bu şimdi iyi çalışıyor, çok teşekkür ederim .. :)
Prithniraj Nicyone

1
Super.onrequestpermissionresult, etkinlik geri aramasında eksikti, parçam geri aramasının çağrılmamasına yol açtı
sakis kaliakoudas

4
requestPermissions () , API düzey 23 gerektirir. API düzey 21 için geriye doğru uyumlu başka bir çözüm var mı?
Adam Hurwitz

2
@ msc87 1. onRequestPermissionsRes etkinliğinde ve parçasında, ilk satır şöyle olmalıdır: super.onRequestPermissionsResult (requestCode, permissions, grantResults); 2. izin verilmeyen bir parçada sadece requestPermission yöntemini şu şekilde arayın: requestPermissions (new String [] {Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
ALAN

122

Bir parçadan konum izni istedim ve parçada bunu değiştirmem gerekiyordu:

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

buna:

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

sonra parçada onRequestPermissionsResult çağrıldı.


2
Bir cazibe gibi çalışır :)
Antonio Vlasic

1
o KOTLIN ile çalışmıyor bu kullanılır Burada aynı için yardým beni mutlu edebilir requestPermissions (Etkinlik olarak bağlamı, permissionList.toTypedArray (), MY_PERMISSIONS_REQUEST)
Arbaz.in

Teşekkürler :), zamandan tasarruf edersiniz
Axrorxo'ja Yodgorov

19

Bu, insanların hatmi kodlarken sık yaptıkları bir hatadır.

AppCompatActivity'deyken ActivityCompat.requestPermissions kullanmalısınız; Android.support.v4.app.Fragment içinde olduğunuzda, sadece requestPermissions kullanmalısınız (bu android.support.v4.app.Fragment'ın örnek bir yöntemidir) Bir parçada ActivityCompat.requestPermissions öğesini çağırırsanız, onRequestPermissionsResult geri çağrısı çağrılır etkinlik değil parça.

requestPermissions(permissions, PERMISSIONS_CODE);

Bu kodu bir parçadan çağırıyorsanız, kendi requestPermissions yöntemi vardır.

Temel kavram şudur: Eğer bir Faaliyette bulunuyorsanız,

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

ve eğer bir Fragment ise,

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

Referans için, bu bağlantıdan cevabı https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/ aldım.


6

requestPermissionsParçalar üzerindeki yöntem , API seviyesi 23 veya üstü gerektirir.
Uygulamanız daha düşük bir sürümü hedefliyorsa,

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

Öncelikle support-v13 bağımlılığını eklemeniz gerekir:

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

FragmentCompat, 27.1.0 sürümünden kaldırıldı
Raj kannan Iyyappan

6

bunu değiştir :

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

buna :

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

Alt kısım bir parçada kullanım içindir (onRequestPermissionsResult parçada çağrılır), ActivityCompat sürümü onRequestPermissionsResult, Aktivitede bulunduğunda kullanım içindir.
Roar Grønmo

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();
 }
 }

izni değiştir


2
Merhaba user2002721; kodunuz doğru olabilir, ancak bazı bağlamlarda daha iyi bir yanıt verir; örneğin, önerilen bu değişikliğin, belki de ilgili belgelere bir bağlantı da dahil olmak üzere, sorgunun sorununu nasıl ve neden çözeceğini açıklayabilirsiniz. Bu, onlar için daha yararlı ve aynı sorunlara çözüm arayan diğer site okuyucuları için daha yararlı olacaktır.
Vince Bowdren

Önce uzunluğu kontrol etmeden grantResults'un 0 dizinine erişmeye çalışırsanız, program bir dizi sınır dışı özel durumu atabilir. Programıma oldu. Bunun olmasını önlemek için grantResults için if deyimini iç if ifadesi olarak ayırdım ve şimdi iyi çalışıyor.
Peter Griffin

1

Bu kabul edilen cevap benim için işe yaramadı, bu yüzden aşağıda açıklanan kendi çözümümü buldum:

İlk olarak, bir yöntem, parçalanmış:

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");
        }
}

2.Ve daha sonra onu altta yatan faaliyetinden çağırdı:

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

Ve çalışıyor ...


0

Her iki doğrulayın PERMISSION_REQUEST_CODEiçinde onRequestPermissionsResultve iç senin Fragmentaynı değeri içerir.


0

SDK 28, SDK kontrolü (> 23) ve parçadan gelen istek izinleri işe yarayacaktır. ActivityCompat.requestPermissions başarısız oluyor (65536'nın altında istek kodu ayarlarsanız, izin iletişim kutusu görünür ve kullanıcı izin verirse, izinler sağlanır, ancak geri arama yapılmaz. hemen başarısız ol. Bu mantığın ardındaki mantığı bilmiyorum. bir hata veya kasıtlı olabilir).

Çalışma kodu:

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

sürüm kontrolü yapmanız gerekmez. 23'ün altındaki sürümlerde, yalnızca 'izin verilen' değeri döndürür. Geliştiricinin buradaki seçimi: basitlik için 'if' bloğundan kaçının veya gerekmediğinde istek çağrısından kaçının
Psest328


0

Aynı sorunu yaşadım. Parçanız etkinlik düzeninden başlatılabilir. Bunun gibi:

main_activty.xml

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

Bunun FragmentTransactionyerine kullandığımda bu sorun benim için çözüldü


0

23'ün altındaki API'larda, etkinlikte bir arabirim oluşturabilir ve daha sonra alt parçaya uygulayabilirsiniz ve izin isteği aldığınızda etkinlik, parçayı uygulanan arabirime iletir. Bu kadar basit :)


0

aşağıdaki Fragment yöntemini çağırabilirsiniz

@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

Bu soruna aslında NestedFragments neden oluyordu. Temelde çoğu parça bir HostedFragment'ı genişletir ve bu da bir CompatFragment'ı genişletir. Bu yuvalanmış parçalara sahip olmak, sonunda projedeki başka bir geliştirici tarafından çözülen sorunlara neden oldu.

Bu çalışmayı elde etmek için biraz anahtarlama gibi düşük seviyeli şeyler yapıyordu, bu yüzden gerçek nihai çözümden çok emin değilim


3
Bir yanıtı kopyalamak yerine, sadece bir bağlantı sağlayabilirsiniz - stackoverflow.com/a/33081173/630833
jayeffkay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.