Fragment#requestPermissions()에 빠지다

12447 단어 Android
Android M은 응용 프로그램에서 일부 권한을 요청할 수 있는 새로운 권한 모델이 되었습니다.이 조사에 미혹된 부분이 있어서 공유합니다.
권한을 요청할 때 다음과 같은 느낌이 든다.
공식.에 호출Activity#requestPermissions()이 적혀 있고 Activity#onRequestPermissionsResult()에 요청 결과를 받습니다.
if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
    // app-defined int constant

    return;
}

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! do the
                // calendar task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'switch' lines to check for other
        // permissions this app might request
    }
}

푹 빠진 곳


1. Fragment에도 RequestPermissions()가 있음


@hotchemi 덕분에 프래그먼트도 이뤄졌다requestPermissions().공식.만 봐도 Activity만 아픈 것 같아...
안드로이드 M Preview 버전의 소스 코드를 보면 확실히 설치되어 있음requestPermissions()onRequestPermissionsResult() 을 알 수 있습니다.
따라서 Fragment에서 권한 요구를 안심하고 실현할 수 있습니다!!!!!!!
package android.app;

public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListener {

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

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
            @NonNull int[] grantResults) {
        /* callback - do nothing */
    }

2. Fragment에 requestPermissions가 없습니다()


표제 사기.
Fragment에 requestPermissions()가 있기 때문에 App Permission 샘플을 만신창이로 실시했지만 코드 완성requestPermissions()은 후보에 포함되지 않았다!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

"응......응--응......"많은 시간을 낭비했지만 이유는 간단했다.
잘못
import android.support.v4.app.Fragment;

public class PermissionFragment extends Fragment {

    private void requestReadContactsPermission() {
        requestPermissions(
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    }
정계
import android.app.Fragment;

public class PermissionFragment extends Fragment {

    private void requestReadContactsPermission() {
        requestPermissions(
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);
    }

총결산


현상은 오징어 중 하나로 처리해야 한다.
  • android.app.Fragment의 한 쪽을 import
  • 로 만들다
  • supportv4 업데이트 대기
  • Activity 측면에서 실현
  • 헛수고에 빠지다.

    추기


    supportv4 소스 코드를 봤어요.
        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);
        }
    
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                @NonNull int[] grantResults) {
            /* callback - do nothing */
        }
    
        public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {
            if (mHost != null) {
                return mHost.onShouldShowRequestPermissionRationale(permission);
            }
            return false;
        }
    
    이렇게 설치가 다 됐어요.그래서 안심하고 v4를 사용할 수 있습니다.

    좋은 웹페이지 즐겨찾기