developer tip

v4.Fragment에서 런타임 권한을 요청하고 콜백이 Fragment로 이동합니까?

copycodes 2020. 12. 29. 07:20
반응형

v4.Fragment에서 런타임 권한을 요청하고 콜백이 Fragment로 이동합니까?


충돌을 일으키는 이상한 문제가 있습니다. 나는 Fragments그것을 고치기 위해 네이티브로 전환해야 했지만 버그가 있습니다.

내 원래 문제 : v4 Fragments.내 프래그먼트 중 하나에서 권한을 요청하려면 내비게이션 드로어 설정 ActivityCompat.requestPermissions(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION, 1);이 있습니다. 프롬프트는 정상적으로 표시되지만 권한을 수락하거나 거부하면 아무 일도 일어나지 않습니다. 콜백 onRequestPermissionsResult()은 호출되지 않습니다. 대신 내 조각이 연결된 활동에서 호출됩니다. 나에게는 쓸모가 없지만 Fragment에서 작업하려면 콜백이 필요합니다.

이 점을 염두에두고를 사용해야 FragmentCompat한다고 들었지만에서만 작동 native Fragments (v13+)하므로 v4 지원 라이브러리 Fragments 대신 네이티브 Fragments에서 작동하도록 탐색 서랍을 변경했습니다. 그러나 AppCompatActivity를 사용하고 있기 때문에 addToBackStack()이전 조각으로 돌아가는 것과 같은 특정 작업이 작동하지 않습니다 .

간단히 말해서, 누구든지 내가을 (를) 사용 v4.Fragment하고 여전히 권한을 요청 Fragment하고 콜백을받을 수있는 방법을 알고 Fragment있습니까? 나는 이것이 해결되지 않은 Android의 버그라고 생각하지만 100 %는 아닙니다.

내 코드를 확인해야하는 경우 알려주세요. 런타임 권한에 필요한 표준 방법 일뿐입니다. 내 이해로는 작동하지 않지만 v4 Fragments로 작업하고 싶습니다.


이 동작은 Fragment의 v4 Fragment 지원 클래스 requestPermissions에 있는 것으로 보입니다 . Activity / FragmentCompat 구현은 API 레벨 11에서 23 사이의 확장 된 기능과 함께 네이티브 클래스를 사용하려는 사람들을 위해 존재합니다.


이것을 부모 활동에 추가하면 저에게 효과적입니다.

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

출처 : https://code.google.com/p/android/issues/detail?id=189121#c5


permissionResult를 얻으려면 다음을 사용 fragment v4하십시오.

Fragment.requestPermission(String[], int);

대신에

AppCompat.requestPermission(Activity, String[], int)

답변을 확인하십시오 !


이 코드 부분을 사용할 수 있습니다.

requestPermissions(new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSION_REQUEST_CODE);

최근에 동일한 상황에 직면했습니다. 지원 프래그먼트 내부의 권한을 확인하고 거기에서 콜백을 받아야 할 때였습니다.

내가 사용할 수있었습니다 ContextCompatcheckSelfPermission와 @NasaGeek라는 특징으로 다음 android.support.v4.app.FragmentrequestPermissions권한을 요청하는 다음의 호출에 돌아 왔을 onRequestPermissionsResultV4의 조각을.

도움이 되었기를 바랍니다.

감사.


v4.Fragment가 잘 작동합니다. v4.Fragment의 중첩 된 조각에 문제가 있습니다. 권한이 요청되지만 콜백 onRequestPermissionsResult ()는 중첩 된 조각에서 호출되지 않습니다!

발행 된 문제


현재 가장 안정적인 솔루션은 손으로하는 것입니다. 나는 부모 조각에서 자식 조각을 알리는 것만으로 해결했습니다.

if (fragment.getParentFragment() != null) {
                            Fragment parentFragment = fragment.getParentFragment();
                            try {
                                ChildFragmentPermissionRegistry registry = (ChildFragmentPermissionRegistry) parentFragment;
                                registry.registerPermissionListener((ChildFragmentPermissionCallback) fragment);
                                parentFragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE);
                            } catch (ClassCastException e) {
                                Log.e(PermissionVerifier.class.getSimpleName(), e.getMessage());
                            }
                        } else {
                            fragment.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_REQUEST_CODE);
                        }

부모 조각이 ChildFragmentPermissionRegistry 인터페이스를 구현하고 자식 조각을 등록하는 경우,

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (callback != null) {
        callback.onRequestPermissionsResult(requestCode, permissions, grantResults);
        callback = null;
    }
}

자식 조각은 ChildFragmentPermissionCallback을 구현합니다.

인터페이스는 다음과 같습니다.

public interface ChildFragmentPermissionCallback {
    void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);
}

public interface ChildFragmentPermissionRegistry {
    void registerPermissionListener(ChildFragmentPermissionCallback callback);
}

I don't know if it's recently fixed by google, but I can reach the expected result without doing any tricks.

The most important thing is to call super.onRequestPermissionsResult(requestCode, permissions, grantResults); in the activity, so it will pass the result to fragment if it's requested from fragment.

So, what I do is:

1) in fragment, ask permission using v4 fragment.requestPermissions(permissions, requestCode)

2) in activity's onRequestPermissionsResult, must call super.onRequestPermissionsResult(requestCode, permissions, grantResults);

3) in fragment's onRequestPermissionsResult, write the code I want to handle the result.


In my case I have requested the permission from the fragment and also need to get the response in fragment.

But my phone running on android 8.1

so I was need to add one more condition for check this

so eventually there is my solution

private void doOnWazeButtonClick()
{
    int permissionStatus = PackageManager.PERMISSION_DENIED;

    if (getContext() != null)
    {
        permissionStatus = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION);
    }

    if (permissionStatus == PackageManager.PERMISSION_GRANTED)
    {
        showContentWaze();
    }
    else
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        {
            Objects.requireNonNull(getActivity()).requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION_ACCESS_FINE_LOCATION);
        }
        else
        {
            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_PERMISSION_ACCESS_FINE_LOCATION);
        }
    }
}

Just use requestPermission("your permission/s in string array",your request code) simply no need to use Fragment.requestPermissons(String[],int );

This method in your fragment calls requestPermissions of android.support.v4.app.Fragment class i.e

public final void requestPermissions(@NonNull String[] permissions, int requestCode) {
        if (mHost == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to Activity");
        }
        mHost.onRequestPermissionsFromFragment(this, permissions, requestCode);
    }

ReferenceURL : https://stackoverflow.com/questions/32890702/request-runtime-permissions-from-v4-fragment-and-have-callback-go-to-fragment

반응형