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 메소드를 호출하려고합니다. 어떻게해야합니까? 내가 여기서 뭔가 잘못하고 있습니까, 누군가 여기에 아이디어가 있으면 도와주세요.
답변
광범위한 문제를 다루기 위해 수정 된 답변
조각과 활동에 대한 방법을 혼란스럽게 생각합니다. 지난 달에 비슷한 문제가 발생했습니다. 마지막으로 다음 사항이 있는지 확인하십시오.
- AppCompatActivity에서 ActivityCompat.requestpermissions 메소드를 사용하십시오.
- v4 지원 단편에서는 requestpermissions 를 사용해야합니다.
- 캐치는 조각에서 AppcompatActivity.requestpermissions를 호출하면 콜백이 조각화되지 않고 활동하게됩니다.
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/ 에서 답변을 얻었습니다.
답변
requestPermissions
Fragments 의 메소드 에는 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);
}
}
그리고 그것은 작동하고 있습니다 …