onRequestPermissionsFragment와 작업 모두에 정의된 경우 fragment에서 호출되지 않는 결과
저는 재활용품 뷰 어댑터를 사용하여 재활용품 뷰와 이 재활용품 뷰의 데이터 설정을 하는 단편을 가지고 있습니다.
현재 어댑터의 목록 항목에서 안드로이드의 새 권한 모델에 대한 안드로이드의 READ_EXTERNAL_STORAGE 권한을 확인해야 하는 버튼을 클릭하고 있습니다.
나는 이 어댑터의 fragment에 권한이 부여되었는지 여부를 확인하고 아직 부여되지 않았다면 권한을 요청하는 새로운 기능을 만들었습니다.
마이 프래그먼트를 통과했습니다.이것을 어댑터의 매개 변수로 사용하고 버튼에서 fragment의 메서드를 호출하면 어댑터를 클릭합니다.
아래 코드를 사용하여 requestPermission을 fragment로 호출했습니다.
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다음 코드를 사용하여 fragment화된 메서드:
@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 {}
그러나 이 활동의 onRequestPermissionsResult 메서드 대신 호출되지 않습니다.
fragment의 부모 활동에서도 RequestPermissionsResult 메서드에 대해 동일하게 정의했으며 호출됩니다.
활동의 onRequestPermissionsResult 메서드를 제거할 수 없지만 fragment에서 권한을 요청할 때 fragment의 onRequestPermissionsResult 메서드를 호출하려고 합니다.어떻게 해야 하나요?제가 여기서 뭘 잘못하고 있는 건가요, 혹시 아시는 분 있으면 도와주세요.
더 광범위한 문제를 다룰 수 있도록 답변 편집
당신은 조각과 활동의 방법을 혼동하고 있는 것 같습니다.지난 달 제 프로젝트에서도 비슷한 문제가 있었습니다.최종적으로 다음 사항이 있는지 확인하십시오.
- AppCompativity에서 ActivityCompat.request 권한 메서드를 사용합니다.
- v4 지원 조각에서는 요청 권한을 사용해야 합니다.
- fragment에서 Appcompativity.request 권한을 호출하면 콜백이 fragment가 아닌 활동으로 전환됩니다.
- 꼭전세요로 하세요.
super.onRequestPermissionsResult동의결부터로과에서.onRequestPermissionsResult.
도움이 되는지 보세요.
fragment에서 위치 권한을 요청했는데 fragment에서 이를 변경해야 했습니다.
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);
그런 다음 fragment에서 onRequestPermissionsResult가 호출되었습니다.
이것은 사람들이 마시멜로를 코딩할 때 흔히 저지르는 실수입니다.
AppCompativity에 ActivityCompativity에 있는 경우 ActivityCompatibility.requestPermissions를 .
android.support.v4.app.Fragment간하게사합니다야해용단▁simply를 사용해야 합니다.requestPermissions (this is an instance method of android.support.v4.app.Fragment)ActivityCompat 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/ 에서 답을 얻었습니다.
변경 내용:
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_CONTACTS),
PERMISSIONS_REQUEST_READ_CONTACTS
)
여기까지:
requestPermissions(
arrayOf(Manifest.permission.READ_CONTACTS),
PERMISSIONS_REQUEST_READ_CONTACTS
)
단편적으로, 당신은 requestPermissions에 ActivityCompat을 사용해서는 안 되며 requestPermissions를 사용하고 메서드에서 두 개의 매개 변수를 전달하면 됩니다.
- 사용 권한 문자열
- 요청 코드.
예를 들어:
requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
»requestPermissions이 필요합니다. onFragments에는 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"
은 해야 합니다.Fragment.requestPermission()에 들어가고 싶다면.onPermissionResult당신의 조각의.
우리가 fragment로부터 Permission을 요청할 때 안드로이드는 우리의 requestCode를 변경합니다.
Fragment에서 사용 권한 요청
다음은 FragmetActivity의 코드입니다.
void requestPermissionsFromFragment(@NonNull Fragment fragment, @NonNull String[] permissions,
int requestCode) {
if (requestCode == -1) {
ActivityCompat.requestPermissions(this, permissions, requestCode);
return;
}
checkForValidRequestCode(requestCode);
try {
mRequestedPermissionsFromFragment = true;
int requestIndex = allocateRequestIndex(fragment);
ActivityCompat.requestPermissions(this, permissions,
((requestIndex + 1) << 16) + (requestCode & 0xffff));
} finally {
mRequestedPermissionsFromFragment = false;
}
}
You Can See (요청)인덱스 + 1) << 16) + (requestCode & 0xffff) 및 시기
요청 시 권한 결과
안드로이드는 요청 코드가 fragment에서 전송되면 결과를 fragment로 전달합니다. 그렇지 않으면 fragment로 전달하지 않습니다. 이것은 fragment Activity의 코드입니다.
enter code here@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
mFragments.noteStateNotSaved();
int index = (requestCode >> 16) & 0xffff;
if (index != 0) {
index--;
String who = mPendingFragmentActivityResults.get(index);
mPendingFragmentActivityResults.remove(index);
if (who == null) {
Log.w(TAG, "Activity result delivered for unknown Fragment.");
return;
}
Fragment frag = mFragments.findFragmentByWho(who);
if (frag == null) {
Log.w(TAG, "Activity result no fragment exists for who: " + who);
} else {
frag.onRequestPermissionsResult(requestCode & 0xffff, permissions, grantResults);
}
}
}
요약
따라서 activity.requestPermission() 또는 ActivityCompat.requestPermission()을 호출하면 결과를 활동으로 전달하고 fragment.requestPermission()을 호출하면 결과를 활동 AND fragment로 전달합니다.
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");
}
}
2. 그리고 그것의 기초적인 활동으로부터 그것을 불렀습니다.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if(requestCode ==1){
SignupFragment.MyOnRequestPermissionResult(requestCode, permissions, grantResults);
}
}
그리고 그것은 효과가 있습니다...
아래의 Fragment 메서드를 호출할 수 있습니다.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 &&
grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission is granted. Continue the action or workflow
// in your app.
doActionBecauseNowYouCanBro();
} else {
// Explain to the user that the feature is unavailable because
// the features requires a permission that the user has denied.
// At the same time, respect the user's decision. Don't link to
// system settings in an effort to convince the user to change
// their decision.
showWhyRequestPermissionsAndDontBlockUserItsCalledManners();
}
return;
}
// Other 'case' lines to check for other
// permissions this app might request.
}
Kotlin과 함께 작업하는 경우 활동이 아닌 fragment 메서드를 호출하도록 지정해야 합니다.
fragment.requestPermissions(permissions, PERMISSIONS_CODE);
Android M 권한: 요청 시 권한 결과()가 호출되지 않음
v4에서 런타임 사용 권한을 요청합니다.파편화된 후 콜백을 파편화된 곳으로 보내시겠습니까?
둘 다 확인합니다.PERMISSION_REQUEST_CODE에onRequestPermissionsResult그리고 당신의 내부.Fragment같은 값을 포함합니다.
표적용SDK 28, SDK 검사(>23) 및 fragment의 권한 요청이 작동합니다.ActivityCompat.requestPermissions가 실패하고 있습니다(요청 코드를 65536 미만으로 설정하면 권한 대화 상자가 나타나고 사용자가 권한을 허용하면 권한이 제공되지만 콜백은 발생하지 않습니다.그러나 65536보다 높게 설정하면 ActivityCompat.requestPermissions가 즉시 실패합니다. 이 논리의 배경에 있는 이유를 모르겠습니다.버그 또는 의도적일 수 있음).
작업 코드:
if (Build.VERSION.SDK_INT >= 23) {
requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
}
저도 같은 문제가 있었습니다.활동 레이아웃에서 조각을 초기화할 수 있습니다.그런 식으로:
main_activity.xml
<fragment
android:id="@+id/fragment"
android:name="com.exampe.SomeFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
이 문제는 제가 사용할 때 해결되었습니다.FragmentTransaction대신
23 이하의 API에서 당신은 활동에 인터페이스를 만든 다음 그것을 자식 조각에 구현할 수 있고, 당신이 활동에서 권한 요청 결과를 얻었을 때 그것을 fragment로 구현된 인터페이스에 전달할 수 있습니다.이렇게 간단해요 :)
이 문제는 실제로 NestedFragments에 의해 발생했습니다.기본적으로 대부분의 fragment는 HostedFragment를 확장하고, 이 fragment는 CompatFragment를 확장합니다.이러한 중첩된 조각들이 문제를 일으켰고 결국 프로젝트의 다른 개발자에 의해 해결되었습니다.
그는 이 작업을 수행하기 위해 비트 전환과 같은 낮은 수준의 작업을 수행하고 있었기 때문에 실제 최종 솔루션에 대해 확신할 수 없습니다.
언급URL : https://stackoverflow.com/questions/35989288/onrequestpermissionsresult-not-being-called-in-fragment-if-defined-in-both-fragm
'codememo' 카테고리의 다른 글
| PowerShell을 사용하여 파일 연결 (0) | 2023.08.06 |
|---|---|
| PHP 세션 변수 설정 취소 (0) | 2023.08.06 |
| Android가 프로세스를 죽이는 시뮬레이션 방법 (0) | 2023.08.06 |
| 도커 이미지를 하나의 컨테이너에 결합하는 방법이 있습니까? (0) | 2023.08.06 |
| 스토리보드를 사용하지 않고 어떻게 새로운 Swift 프로젝트를 만들 수 있습니까? (0) | 2023.08.06 |