Cara memeriksa izin dalam fragmen

92

Saya ingin memeriksa izin di dalam sebuah fragmen.

kode saya:

        // Here, thisActivity is the current activity
        if (ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {


            // Should we show an explanation?
            if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
                    android.Manifest.permission.ACCESS_FINE_LOCATION)) {

                // Show an explanation to the user *asynchronously* -- don't block
                // this thread waiting for the user's response! After the user
                // sees the explanation, try again to request the permission.

            } else {

                // No explanation needed, we can request the permission.

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



                // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
                // app-defined int constant. The callback method gets the
                // result of the request.
            }
        }

tapi onRequestPermissionsResulttidak dipanggil setelah mengizinkan atau menolak.

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

                // permission was granted, yay! Do the
                // contacts-related task you need to do.
                //yes

                Log.e("test","1");

                Intent intent = new Intent(getActivity(), MapsActivity.class);
                intent.putExtra("latitude", 35.694828);
                intent.putExtra("longitude", 51.378129);
                startActivity(intent);

            } else {
                utilityFunctions.showSweetAlertWarning(getActivity(),r.getString(R.string.str_warning_title_empty),
                        r.getString(R.string.str_you_must_allow_this_permission_toast),
                        r.getString(R.string.str_warning_btn_login));

                Log.e("test","2");
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}
S.M_Emamian
sumber

Jawaban:

51

Saya telah selesai mengikuti untuk memeriksa izin di dalam sebuah fragmen.

if (ActivityCompat.checkSelfPermission(getContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getContext(),
                    android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
         requestPermissions(getActivity(),
                new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION,
                        android.Manifest.permission.ACCESS_FINE_LOCATION},
                REQUEST_LOCATION);
    } else {
        Log.e("DB", "PERMISSION GRANTED");
    }
rookieDeveloper
sumber
3
Kami masih perlu meminta izin jika pengguna belum memberikannya.
Karan Thakkar
17
Ingatlah bahwa jika Anda melakukan ini, hasil izin permintaan Anda akan datang ke aktivitas yang memulai fragmen Anda. Lihat jawaban ThetNaing Mizo untuk cara menerima hasil di fragmen Anda.
Dari
253

Beginilah cara saya melakukannya, itu berhasil untuk saya. Terima kasih!

Untuk Aktivitas:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Untuk Fragmen:

requestPermissions(permissionsList, REQUEST_CODE);
ThetNaing Mizo
sumber
Fragment requestPermissions membutuhkan Android M tetapi tersedia di FragmentCompat untuk versi API yang lebih lama.
Brian White
20
Cara yang benar untuk meminta izin di dalam sebuah fragmen
Tarun
requestPermissions menggunakan marshal dan level up sdk
hamid
76

Fragmen memiliki requestPermissions()dan onRequestPermissionsResult()metode, gunakanlah.

Tapi checkSelfPermission()dari ActivityCompat(tidak perlu Activity, hanya Context).

if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions( //Method of Fragment
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        REQUEST_PERMISSIONS_CODE_WRITE_STORAGE
    );
} else {
    downloadImage();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_PERMISSIONS_CODE_WRITE_STORAGE) {
        if (permissions[0].equals(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            proceedWithSdCard();
        }
    }
}
Evgeny Nozdrev
sumber
Fragment requestPermissions membutuhkan Android M tetapi tersedia di FragmentCompat.
Brian White
4

onRequestPermissionsResultdipanggil dalam aktivitas bukan fragmen. Coba onRequestPermissionsResultganti dalam aktivitas sebagai gantinya.

Ryan
sumber
Meskipun ini benar, tidak ada penjelasan tentang mengapa ini benar dan bagaimana memperbaikinya - bagaimana membuat onRequestPermissionResultfragmen. Baik penjelasan maupun cara penerimaan hasil terpecah-pecah dijelaskan dalam jawaban ThetNaing Mizo .
Dari
Terima kasih, saya bertanya-tanya mengapa kode saya tidak berfungsi di dalam Fragmen
Azizjon Kholmatov
4

Menggunakan Kotlin, Anda memanggil requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)dan menambahkan penggantian berikut ke fragmen Anda

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out kotlin.String>, grantResults: IntArray): Unit {

}
Erik
sumber
4

Untuk menangani izin dalam metode Fragmentpanggilan requestPermissions. Jika Anda mengganti onRequestPermissionsResultmetode dalam fragmen dan aktivitas, yang berisi fragmen tersebut, pastikan untuk memanggil super.onRequestPermissionsResult(...)metode aktivitas untuk menyebarkan panggilan ke onRequestPermissionsResultmetode dalam fragmen.

Sergey
sumber
3

Yang berhasil bagi saya adalah memanggil metode onRequestPermissionsResult dalam aktivitas di mana fragmen diimplementasikan, bukan memanggilnya dalam fragmen itu sendiri. Di dalam metode onCreateView dalam fragmen:

    Button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int permissionCheck = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE);

            if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_MEDIA);
            }else{
                //Do your work
                fetchMethod();
            }

        }
});

Dalam Aktivitas yang membantu mengimplementasikan fragmen, di luar metode onCreate :

    @Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_MEDIA:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                fetchMethod();

            }else{
                Toast.makeText(getApplicationContext(), "Permission not granted!", Toast.LENGTH_SHORT).show();
            }
            break;

        default:
            break;
    }
}
Pranay Anand
sumber
0

Saya tersandung menggunakan checkSelfPermission()di Fragmentdan bertanya-tanya apa pendekatan terbaik untuk Contextmenjadi null (khusus Kotlin) ... yang harus saya gunakan !!atau yang lain ?

Saya menggunakan sesuatu yang lain berdasarkan kode yang saya temukan di iosched . Lihat contoh di bawah ini, dan ingat, sebelum Fragmentdilampirkan ke Activity, Contextakan menjadi null.

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
codingjeremy
sumber