조각에서 권한을 확인하는 방법


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

답변:


50

조각 내부의 권한을 확인하기 위해 다음을 수행했습니다.

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
사용자가 권한을 부여하지 않은 경우 여전히 권한을 요청해야합니다.
Karan Thakkar

17
이렇게하면 요청 권한 결과가 프래그먼트를 시작한 활동에 제공됩니다. 조각에서 결과를받는 방법 은 ThetNaing Mizo 의 답변을 참조하십시오 .
lsrom

253

이것이 제가 한 방식입니다. 감사!

활동 :

ActivityCompat.requestPermissions(this, permissionsList, REQUEST_CODE);

조각의 경우 :

requestPermissions(permissionsList, REQUEST_CODE);

Fragment requestPermissions에는 Android M이 필요하지만 이전 API 버전의 경우 FragmentCompat에서 사용할 수 있습니다.
Brian White

20
조각 내부의 권한을 요청하는 올바른 방법
Tarun

requestPermissions는 marshal을 사용하고 sdk를 레벨 업합니다
hamid

76

조각에는 방법 requestPermissions()onRequestPermissionsResult()방법이 있습니다.

그러나 checkSelfPermission()에서 왔습니다 ActivityCompat(필요하지 않고 ActivityContext).

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이 필요하지만 FragmentCompat에서 사용할 수 있습니다.
Brian White

4

onRequestPermissionsResult조각이 아닌 활동에서 호출됩니다. onRequestPermissionsResult대신 활동에서 재정의하십시오 .


이것이 사실이지만 이것이 사실 인 이유와 그것을 고치는 방법에 대한 설명이 부족 onRequestPermissionResult합니다. 조각화 된 결과를받는 방법과 설명은 ThetNaing Mizo 의 답변에 설명되어 있습니다.
lsrom

덕분에, 난 내 코드 조각 내부에서 작동하지 않는 이유를 궁금 해서요
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

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

        }
});

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


0

나는 checkSelfPermission()a에서 사용 하면서 넘어 지고 null (Kotlin 특정)에 Fragment대한 최선의 접근 방식이 무엇인지 궁금해했습니다 Context... !!또는 다른 것을 사용해야 합니까?

나는 iosched에서 찾은 코드를 기반으로 다른 것을 가지고 갔다 . 가되기 전에, 아래의 예제를 살펴 보라 기억 에 연결된 는이 null이됩니다.FragmentActivityContext

private fun fineLocationPermissionApproved(): Boolean {

    val context = context ?: return false

    return PackageManager.PERMISSION_GRANTED == checkSelfPermission(
        context,
        Manifest.permission.ACCESS_FINE_LOCATION
    )
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.