IT박스

프래그먼트와 활동 모두에 정의 된 경우 onRequestPermissionsResult가 프래그먼트에서 호출되지 않습니다

itboxs 2020. 7. 13. 21:42
반응형

프래그먼트와 활동 모두에 정의 된 경우 onRequestPermissionsResult가 프래그먼트에서 호출되지 않습니다


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가 호출되었습니다.


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"

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

And it is working ...


Verify that both PERMISSION_REQUEST_CODE inonRequestPermissionsResult and inside yourFragment contains the same value.


For the tragetSDK 28,The SDK check (>23) and requestpermissions from fragment would work. The ActivityCompat.requestPermissions is failing (if you set request code below 65536, the permission dialog would appear and if the user allows the permission, the permissions are provided, but no callback will happen. But if you set above 65536, ActivityCompat.requestPermissions will fail immediately. i don't know the reasoning behind this logic. may be a bug or intentional).

Working code:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }

This issue was actually being caused by NestedFragments. Basically most fragments we have extend a HostedFragment which in turn extends a CompatFragment. Having these nested fragments caused issues which eventually were solved by another developer on the project.

He was doing some low level stuff like bit switching to get this working so I'm not too sure of the actual final solution

참고URL : https://stackoverflow.com/questions/35989288/onrequestpermissionsresult-not-being-called-in-fragment-if-defined-in-both-fragm

반응형