onRequestPermissionsResult tidak dipanggil dalam fragmen jika didefinisikan dalam fragmen dan aktivitas

167

Saya memiliki fragmen di mana saya memiliki recyclerview dan pengaturan data dalam recyclerview ini menggunakan adaptor recyclerview.

Sekarang, saya memiliki tombol di daftar item adaptor yang mengklik di mana saya perlu memeriksa izin READ_EXTERNAL_STORAGE di android untuk model izin baru di android.

Saya telah membuat fungsi baru dalam fragmen adaptor ini untuk memeriksa apakah izin diberikan atau tidak dan meminta izin jika belum diberikan.

Saya telah melewati MyFragment.ini sebagai parameter di adaptor dan memanggil metode fragmen pada tombol klik di adaptor.

Saya telah menggunakan kode di bawah ini untuk memanggil requestPermission secara terpisah.

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

Saya telah mengganti onRequestPermissionsResultmetode dalam fragmen dengan menggunakan kode di bawah ini:

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

Tapi itu tidak dipanggil, alih-alih metode onRequestPermissionsResult Kegiatan ini dipanggil.

Saya telah mendefinisikan metode onRequestPermissionsResult yang sama dalam aktivitas induk fragmen juga dan ia dipanggil.

Saya tidak bisa menghapus metode onRequestPermissionsResult aktivitas tetapi ingin memanggil metode onRequestPermissionsResult fragmen ketika saya meminta izin dari fragmen. Bagaimana saya bisa melakukan ini? Apakah saya melakukan sesuatu yang salah di sini, tolong bantu saya jika ada yang punya ide di sini.

Prithniraj Nicyone
sumber
1
referensikan tautan ini run time izin dalam fragmen Ini adalah solusi tepat
Antony jackson

Jawaban:

372

Jawaban yang diedit untuk membahas masalah yang lebih luas

Saya pikir Anda membingungkan metode untuk fragmen dan aktivitas. Punya masalah serupa proyek saya bulan lalu. Silakan periksa apakah Anda akhirnya memiliki yang berikut:

  1. Di AppCompatActivity gunakan metode ActivityCompat.requestpermissions
  2. Dalam fragmen dukungan v4, Anda harus menggunakan komisi permintaan
  3. Catch adalah jika Anda memanggil AppcompatActivity.requestpermissions dalam fragmen Anda maka callback akan datang ke aktivitas dan bukan fragmen
  4. Pastikan untuk menelepon super.onRequestPermissionsResultdari aktivitas onRequestPermissionsResult.

Lihat apakah itu membantu.

VarunJoshi129
sumber
9
Hanya untuk mengecek pastikan Anda memiliki set super.onrequestpermissionresult ditetapkan dalam aktivitas Anda
VarunJoshi129
27
Menambahkan super.onrequestpermissionresultpada permintaan penerimaan pada aktivitas, panggil permintaan penerimaan pada fragmen ketika saya meminta izin untuk menggunakan requestpermissions. Ini berfungsi dengan baik sekarang, terima kasih banyak .. :)
Prithniraj Nicyone
1
Hasil super.onrequestpermission hilang dari callback aktivitas, yang menyebabkan callback fragmen saya tidak dipanggil
sakis kaliakoudas
4
requestPermissions () membutuhkan API level 23. Apakah ada solusi lain yang kompatibel untuk API level 21?
Adam Hurwitz
2
@ msc87 1. di onRequestPermissionsResult kegiatan dan fragmen, baris pertama harus: super.onRequestPermissionsResult (requestCode, izin, grantResult); 2.dalam fragmen di mana Anda mengenali izin yang tidak diberikan, panggil saja metode requestPermission seperti ini: requestPermissions (String baru [] {Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);
AREF
122

Saya meminta izin lokasi dari sebuah fragmen dan dalam fragmen itu, saya perlu mengubahnya:

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

untuk ini:

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

kemudian onRequestPermissionsResult dipanggil dalam fragmen.

Badr
sumber
2
Bekerja seperti pesona :)
Antonio Vlasic
1
itu tidak berfungsi dengan kotlin, bisakah tolong bantu saya untuk hal yang sama di sini digunakan requestPermissions
Arbaz.in
Terima kasih :), Anda menghemat waktu saya
Axrorxo'ja Yodgorov
19

Ini adalah kesalahan umum yang dilakukan orang saat membuat kode untuk marshmallow.

Saat di AppCompatActivity, Anda harus menggunakan ActivityCompat.requestPermissions; Ketika di android.support.v4.app.Fragment, Anda harus menggunakan cukup requestPermissions (ini adalah metode instance dari android.support.v4.app.Fragment) Jika Anda memanggil ActivityCompat.requestPermissions dalam sebuah fragmen, panggilan balik onRequestPermissionsResult dipanggil aktivitas dan bukan fragmen.

requestPermissions(permissions, PERMISSIONS_CODE);

Jika Anda memanggil kode ini dari sebuah fragmen, ia memiliki metode requestPermissions sendiri.

Jadi konsep dasarnya adalah, Jika Anda berada dalam suatu Kegiatan, maka panggilan

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

dan jika dalam Fragmen, panggil saja

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

Untuk referensi, saya telah memperoleh jawaban dari tautan ini https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/

Farruh Habibullaev
sumber
6

Metode requestPermissionspada Fragmen membutuhkan API level 23 atau lebih tinggi.
Jika aplikasi Anda menargetkan versi yang lebih rendah, Anda dapat menggunakan

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

Pertama, Anda perlu menambahkan dependensi dukungan-v13:

implementation "com.android.support:support-v13:$supportLibVersion"
Juan Cruz Soler
sumber
FragmentCompat sudah tidak digunakan lagi dari versi 27.1.0
Raj
6

ubah ini:

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

untuk ini :

requestPermissions(
     arrayOf(Manifest.permission.READ_CONTACTS),
     PERMISSIONS_REQUEST_READ_CONTACTS
)
delayKg
sumber
Yang lebih rendah adalah untuk digunakan dalam fragmen (onRequestPermissionsResult disebut dalam fragmen), versi ActivityCompat untuk digunakan ketika onRequestPermissionsResult diletakkan di dalam Activity.
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();
 }
 }

ubah izin

pengguna2002721
sumber
2
Hai pengguna2002721; kode Anda mungkin benar, tetapi dengan beberapa konteks itu akan membuat jawaban yang lebih baik; misalnya, Anda dapat menjelaskan bagaimana dan mengapa perubahan yang diusulkan ini akan menyelesaikan masalah si penanya, mungkin termasuk tautan ke dokumentasi yang relevan. Itu akan membuatnya lebih bermanfaat bagi mereka, dan juga lebih bermanfaat bagi pembaca situs lain yang mencari solusi untuk masalah yang sama.
Vince Bowdren
Program ini mungkin membuang array keluar batas kecuali jika Anda mencoba dan mengakses indeks 0 dari grantResult tanpa memeriksa panjang terlebih dahulu. Itu terjadi pada program saya. Saya memisahkan pernyataan if untuk grantResults sebagai pernyataan if batin untuk mencegah hal itu terjadi, dan sekarang berfungsi dengan baik.
Peter Griffin
1

Jawaban yang diterima ini tidak berfungsi untuk saya, jadi saya menemukan solusi sendiri, dijelaskan di bawah:

1. Pertama saya membuat metode, dalam fragmen:

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.Dan kemudian menyebutnya dari aktivitas yang mendasarinya:

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

Dan itu berfungsi ...

Biplob Das
sumber
0

Verifikasi bahwa baik PERMISSION_REQUEST_CODEdi dalam maupun di onRequestPermissionsResultdalam Anda Fragmentberisi nilai yang sama.

dianakarenms
sumber
0

Untuk tragetSDK 28, cek SDK (> 23) dan permintaan dari fragmen akan berfungsi. ActivityCompat.requestPermissions gagal (jika Anda menetapkan kode permintaan di bawah 65536, dialog izin akan muncul dan jika pengguna mengizinkan izin, izin diberikan, tetapi tidak ada panggilan balik akan terjadi. Tetapi jika Anda menetapkan di atas 65536, ActivityCompat.requestPermissions akan gagal segera. saya tidak tahu alasan di balik logika ini. mungkin bug atau disengaja).

Kode kerja:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }
Raj kannan Iyyappan
sumber
Anda tidak perlu melakukan pemeriksaan versi. dalam versi di bawah 23, itu hanya akan mengembalikan nilai 'izin yang diberikan'. Pilihan pengembang di sini: hindari blok 'jika' untuk kesederhanaan atau hindari panggilan permintaan saat tidak diperlukan
Psest328
0

Saya memiliki masalah yang sama. Fragmen Anda dapat diinisialisasi dari tata letak aktivitas. Seperti itu:

main_activty.xml

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

Masalah ini dipecahkan bagi saya ketika saya digunakan FragmentTransactionsebagai gantinya

Bohdan Ishchenko
sumber
0

dalam API di bawah 23 Anda dapat membuat antarmuka dalam aktivitas kemudian mengimplementasikannya dalam fragmen anak dan ketika Anda mendapatkan hasil permintaan izin, aktivitas meneruskannya ke antarmuka yang diimplementasikan dalam fragmen. Ini sederhana ini :)

A.sobhdel
sumber
0

Anda dapat memanggil metode Fragmen di bawah ini

@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.

}
MFQ
sumber
-5

Masalah ini sebenarnya disebabkan oleh NestedFragments. Pada dasarnya sebagian besar fragmen kami telah memperpanjang HostedFragment yang pada gilirannya memperluas CompatFragment. Memiliki fragmen bersarang ini menyebabkan masalah yang akhirnya diselesaikan oleh pengembang lain di proyek.

Dia melakukan beberapa hal tingkat rendah seperti bit switching untuk membuatnya bekerja jadi saya tidak terlalu yakin dengan solusi akhir yang sebenarnya

Manikandan K
sumber
3
Alih-alih menyalin jawaban, Anda bisa memberikan tautan - stackoverflow.com/a/33081173/630833
jayeffkay