Parçadaki izin nasıl kontrol edilir


92

Bir parçanın içindeki izni kontrol etmek istiyorum.

benim kodum:

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

ancak onRequestPermissionsResultizin ver veya reddetten sonra çağrılmaz.

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

Yanıtlar:


50

Bir parçanın içindeki izni kontrol etmek için aşağıdakileri yaptım.

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
Kullanıcı izin vermediyse yine de izin istememiz gerekiyor.
Karan Thakkar

17
Bunu yaparsanız, izin isteğinizin sonucunun parçanızı başlatan etkinliğe geleceğini unutmayın. Parçanızla sonuç almanın bir yolu için ThetNaing Mizo'nun yanıtına bakın .
lsrom

253

Ben böyle yaptım, benim için çalışıyor. Teşekkürler!

Aktivite için:

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

Parça için:

requestPermissions(permissionsList, REQUEST_CODE);

Fragment requestPermissions, Android M gerektirir, ancak eski API sürümleri için FragmentCompat'ta mevcuttur.
Brian White

20
Bir parça içinde izin istemenin doğru yolu
Tarun

requestPermissions kullanım mareşal ve seviye atlama sdk
hamid

76

Parçanın var requestPermissions()ve onRequestPermissionsResult()yöntemleri, onu kullanın.

Ama checkSelfPermission()dan ActivityCompat(gerektirmeyen Activity, sadece 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();
        }
    }
}

Fragment requestPermissions, Android M gerektirir, ancak FragmentCompat'ta mevcuttur.
Brian White

4

onRequestPermissionsResultparçada değil, aktivitede çağrılır. onRequestPermissionsResultBunun yerine aktiviteyi geçersiz kılmayı deneyin .


Bu doğru olsa da, bunun neden doğru olduğuna ve nasıl düzeltileceğine - nasıl onRequestPermissionResultparçalanacağına dair bir açıklamadan yoksundur . Hem açıklaması hem de sonucun parçalı olarak alınma şekli ThetNaing Mizo tarafından verilen cevapta açıklanmıştır .
lsrom

Teşekkürler,
kodumun

4

Kotlin'i kullanarak requestPermissions(arrayOf(Manifest.permission.THE_PERMISSION_CODE_YOU_WANT), PERMISSION_REQUEST_CODE), aşağıdaki geçersiz kılmayı çağırır ve parçanıza eklersiniz

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

}

4

Bir Fragmentçağrı requestPermissionsyöntemindeki izinleri işlemek için . onRequestPermissionsResultYöntemi, bu parçayı içeren parçada ve etkinlikte geçersiz kılarsanız , çağrıyı super.onRequestPermissionsResult(...)parçadaki yönteme yaymak için etkinlik yöntemini çağırdığınızdan emin olun onRequestPermissionsResult.


3

Benim için işe yarayan şey, onRequestPermissionsResult yöntemini , parçanın kendisi olarak adlandırmak yerine, parçanın uygulandığı etkinlik içinde çağırmaktı. İçinde onCreateView fragmanı gibi bir yöntem:

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

        }
});

Parçanın uygulanmasına yardımcı olan Activity'de onCreate yönteminin dışında :

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


0

Ben kullanarak takıldı başlamıştı checkSelfPermission()bir de Fragmentve en iyi yaklaşım ne olacağını merak Contextkullanmalıyım ... (Kotlin özel) boş olan !!veya başka bir şey ?

İosched'te bulduğum koda göre başka bir şeyle gittim . Önce, aşağıdaki örnekte göz at ve unutmayın bir takılır , boş olacaktır.FragmentActivityContext

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
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.