프래그먼트와 액티비티 모두에 정의 된 경우 onRequestPermissionsResult가 프래그먼트에서 호출되지 않습니다 case ConstantVariables.READ_EXTERNAL_STORAGE:

recyclerview 어댑터를 사용하여 recyclerview를 가지고이 recyclerview에서 데이터를 설정하는 조각이 있습니다.

이제 어댑터의 목록 항목에 버튼이있어 Android의 새 권한 모델에 대해 Android의 READ_EXTERNAL_STORAGE 권한을 확인해야합니다.

이 어댑터의 조각에서 권한이 부여되었는지 여부를 확인하고 권한이 아직 부여되지 않은 경우 권한을 요청하기 위해 새 기능을 만들었습니다.

어댑터의 매개 변수로 MyFragment.this를 전달하고 어댑터에서 버튼 클릭으로 조각의 메소드를 호출합니다.

아래 코드를 사용하여 조각으로 requestPermission을 호출했습니다.

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

onRequestPermissionsResult아래 코드를 사용하여 조각 의 메서드를 재정의했습니다 .

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

그러나이 Activity의 onRequestPermissionsResult 메소드가 호출되는 대신 호출되지 않습니다.

조각의 부모 활동에서도 동일한 onRequestPermissionsResult 메소드를 정의했으며 호출되고 있습니다.

활동의 onRequestPermissionsResult 메소드를 제거 할 수 없지만 프래그먼트에서 권한을 요청할 때 프래그먼트의 onRequestPermissionsResult 메소드를 호출하려고합니다. 어떻게해야합니까? 내가 여기서 뭔가 잘못하고 있습니까, 누군가 여기에 아이디어가 있으면 도와주세요.



답변

광범위한 문제를 다루기 위해 수정 된 답변

조각과 활동에 대한 방법을 혼란스럽게 생각합니다. 지난 달에 비슷한 문제가 발생했습니다. 마지막으로 다음 사항이 있는지 확인하십시오.

  1. AppCompatActivity에서 ActivityCompat.requestpermissions 메소드를 사용하십시오.
  2. v4 지원 단편에서는 requestpermissions 를 사용해야합니다.
  3. 캐치는 조각에서 AppcompatActivity.requestpermissions를 호출하면 콜백이 조각화되지 않고 활동하게됩니다.
  4. super.onRequestPermissionsResult액티비티의에서 전화해야합니다 onRequestPermissionsResult.

도움이되는지 확인하십시오.


답변

조각과 조각에서 위치 권한을 요청했는데 이것을 변경해야했습니다.

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

이에:

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

그런 다음 조각에서 onRequestPermissionsResult가 호출되었습니다.


답변

이것은 사람들이 마쉬멜로를 코딩 할 때 흔히 저지르는 실수입니다.

AppCompatActivity에있을 때는 ActivityCompat.requestPermissions를 사용해야합니다. android.support.v4.app.Fragment에있는 경우 간단히 requestPermissions를 사용해야합니다 (이는 android.support.v4.app.Fragment의 인스턴스 메소드입니다). 조각에서 ActivityCompat.requestPermissions를 호출하면 onRequestPermissionsResult 콜백이 호출됩니다. 조각이 아닌 활동.

requestPermissions(permissions, PERMISSIONS_CODE);

프래그먼트에서이 코드를 호출하는 경우 고유 한 requestPermissions 메소드가 있습니다.

기본 개념은, 당신이 활동에 있다면, 전화

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

조각에 있다면 전화하십시오.

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

참고 로이 링크 https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/ 에서 답변을 얻었습니다.


답변

requestPermissionsFragments 의 메소드 에는 API 레벨 23 이상이 필요합니다.
앱이 더 낮은 버전을 대상으로하는 경우 사용할 수 있습니다

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

먼저 support-v13 종속성을 추가해야합니다.

implementation "com.android.support:support-v13:$supportLibVersion"

답변

이것을 바꾸십시오 :

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

이에 :

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

답변

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

허가 변경


답변

이 받아 들인 대답은 나를 위해 작동하지 않으므로 아래에서 설명하는 내 솔루션을 찾았습니다.

1. 먼저 조각으로 메서드를 만들었습니다.

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

그런 다음 기본 활동에서 호출했습니다.

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

그리고 그것은 작동하고 있습니다 …