Як перевірити дозвіл у фрагменті


92

Я хочу перевірити дозвіл усередині фрагмента.

мій код:

        // 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.
            }
        }

але onRequestPermissionsResultне викликається після дозволу чи заборони.

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

Відповіді:


51

Я зробив наступне, щоб перевірити дозвіл усередині фрагмента.

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

3
Нам все одно потрібно запитати дозволу, якщо користувач не надав його.
Каран Таккар

17
Пам’ятайте, що якщо ви зробите це, результат дозволу вашого запиту буде надходити до активності, яка розпочала ваш фрагмент. Дивіться відповідь ThetNaing Mizo щодо способу отримання результату у вашому фрагменті.
lsrom

253

Ось як я це зробив, це працює для мене. Дякую!

Для активності:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Для фрагмента:

requestPermissions(permissionsList, REQUEST_CODE);

Запит на фрагменти Дозволи вимагають Android M, але він доступний у FragmentCompat для старих версій API.
Брайан Уайт

20
Правильний спосіб запиту дозволу всередині фрагмента
Тарун

requestPermissions є використання маршалом і рівень вгору SDk
Хаміда

76

Фрагмент має requestPermissions()і onRequestPermissionsResult()методи, використовуйте його.

Але checkSelfPermission()це від ActivityCompat(не вимагати Activity, лише 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();
        }
    }
}

Запит на фрагменти Для отримання дозволів потрібен Android M, але він доступний у FragmentCompat.
Брайан Уайт

4

onRequestPermissionsResultвикликається в операції, а не у фрагменті. onRequestPermissionsResultНатомість спробуйте замінити активність.


Незважаючи на те, що це правда, в ньому відсутнє пояснення, чому це правда і як це виправити - як потрапити onRequestPermissionResultу фрагмент. Пояснення та спосіб отримання результату фрагментовано пояснюються у відповіді ThetNaing Mizo .
lsrom

Дякую, мені було цікаво, чому мій код не працює всередині Fragment
Azizjon Kholmatov

4

За допомогою Kotlin ви телефонуєте requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE)та додаєте наступну заміну до свого фрагмента

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

}

4

Для обробки дозволів у методі Fragmentвиклику requestPermissions. Якщо ви перевизначаєте onRequestPermissionsResultметод як у фрагменті, так і в активі, що містить цей фрагмент, обов’язково викликайте super.onRequestPermissionsResult(...)метод активності для розповсюдження виклику onRequestPermissionsResultметоду у фрагменті.


3

У мене спрацювало виклик методу onRequestPermissionsResult у діяльності, усередині якої реалізований фрагмент , а не виклик його у самому фрагменті. Усередині методу onCreateView у фрагменті:

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

        }
});

В Activity, який допомагає реалізувати фрагмент, поза методом 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;
    }
}

2

Якщо ви закрили свій дозвіл програми з налаштувань, ви не можете відкрити свій дозвіл з коду або вашої версії Android нижче Marshmallow.

Ви можете перевірити цю документацію https://developer.android.com/training/permissions/requesting.html І це приклад https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html


0

Я спокушувався, використовуючи checkSelfPermission()a, Fragmentі цікавився, що було б найкращим підходом для Contextнульового значення (конкретно для Котліна) ... чи варто використовувати !!чи щось інше ?

Я пішов з чимось іншим на основі коду, який я знайшов у iosched . Погляньте на зразок нижче і пам’ятайте, перед тим, Fragmentяк прикріпити до Activity, Contextзаповіт буде нульовим.

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.