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);
최근에 동일한 상황에 직면했습니다. 지원 프래그먼트 내부의 권한을 확인하고 거기에서 콜백을 받아야 할 때였습니다.
내가 사용할 수있었습니다 ContextCompat
에 checkSelfPermission
와 @NasaGeek라는 특징으로 다음 android.support.v4.app.Fragment
의 requestPermissions
권한을 요청하는 다음의 호출에 돌아 왔을 onRequestPermissionsResult
V4의 조각을.
도움이 되었기를 바랍니다.
감사.
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
'developer tip' 카테고리의 다른 글
Docker 복사 및 소유자 변경 (0) | 2020.12.29 |
---|---|
프로그래밍 방식으로 툴바에 대한 app : layout_scrollFlags를 설정하는 방법 (0) | 2020.12.29 |
새로 고침시 redux 상태 트리를 유지하려면 어떻게해야합니까? (0) | 2020.12.29 |
Mac의 x86 어셈블리 (0) | 2020.12.29 |
iOS는 일정 기간 동안 활동이 없으면 작업을 수행합니다 (사용자 상호 작용 없음). (0) | 2020.12.28 |