-5

Android ランタイム権限を開発しています。私はすべての部分をやった。しかし、1つのことに不満があります。

特定の許可がすでに拒否されており、二度と確認しないかどうかを知りたいです。

以下の API を呼び出すと、確かに結果を取得できます。

 ActivityCompat.requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS);

ここで結果を得ることができます

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {

    if (requestCode == REQUEST_CAMERA) {
         // here we can get the result
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

しかし、私の必要性は requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS); を要求せずにです。APIは、状態が二度と尋ねないことを確認したいのですが、チェックするかどうか

知ってる人いたらネタバレお願いします。

4

2 に答える 2

2

しかし、私の必要性は requestPermissions(this, PERMISSIONS_CONTACT, REQUEST_CONTACTS); を要求せずにです。APIは、状態が二度と尋ねないことを確認したいのですが、チェックするかどうか

それは難しいでしょう。

を呼び出すことができshouldShowRequestPermissionRationale()ますActivityCompat。これは次のtrue場合に返されます:

  • 以前にユーザーにこの許可を要求しました
  • ユーザーはその許可を拒否しました
  • ユーザーが「今後確認しない」チェックボックスをオンにしていない

を呼び出すことができcheckSelfPermission()ますContextCompat。これは次のtrue場合に返されます:

  • 以前にユーザーにこの許可を要求しました
  • ユーザーがその権限を付与した

また、その情報をSharedPreferences.

もしも:

  • SharedPreferences以前にこの許可を ( 経由で)要求したことがわかっている。
  • checkSelfPermission()戻りますfalse(したがって、ユーザーは許可を与えていません)。
  • shouldShowRequestPermissionRationale()戻りますfalse(したがって、ユーザーに根拠を提供することは想定されていません)

その場合、許可は「二度と聞かない」状態になります。

于 2015-12-18T14:06:18.163 に答える
0

私は同じ問題を抱えていて、それを理解しました。作業をより簡単にするために、ランタイム許可を処理するための util クラスを作成しました。

public class PermissionUtil {
    /*
    * Check if version is marshmallow and above.
    * Used in deciding to ask runtime permission
    * */
    public static boolean shouldAskPermission() {
        return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M);
    }
private static boolean shouldAskPermission(Context context, String permission){
        if (shouldAskPermission()) {
            int permissionResult = ActivityCompat.checkSelfPermission(context, permission);
            if (permissionResult != PackageManager.PERMISSION_GRANTED) {
                return true;
            }
        }
        return false;
    }
public static void checkPermission(Context context, String permission, PermissionAskListener listener){
/*
        * If permission is not granted
        * */
        if (shouldAskPermission(context, permission)){
/*
            * If permission denied previously
            * */
            if (context.shouldShowRequestPermissionRationale(permission)) {
                listener.onPermissionPreviouslyDenied();
            } else {
                /*
                * Permission denied or first time requested
                * */
if (PreferencesUtil.isFirstTimeAskingPermission(context, permission)) {
                    PreferencesUtil.firstTimeAskingPermission(context, permission, false);
                    listener.onPermissionAsk();
                } else {
                    /*
                    * Handle the feature without permission or ask user to manually allow permission
                    * */
                    listener.onPermissionDisabled();
                }
            }
        } else {
            listener.onPermissionGranted();
        }
    }
/*
    * Callback on various cases on checking permission
    *
    * 1.  Below M, runtime permission not needed. In that case onPermissionGranted() would be called.
    *     If permission is already granted, onPermissionGranted() would be called.
    *
    * 2.  Above M, if the permission is being asked first time onPermissionAsk() would be called.
    *
    * 3.  Above M, if the permission is previously asked but not granted, onPermissionPreviouslyDenied()
    *     would be called.
    *
    * 4.  Above M, if the permission is disabled by device policy or the user checked "Never ask again"
    *     check box on previous request permission, onPermissionDisabled() would be called.
    * */
    public interface PermissionAskListener {
/*
        * Callback to ask permission
        * */
        void onPermissionAsk();
/*
        * Callback on permission denied
        * */
        void onPermissionPreviouslyDenied();
/*
        * Callback on permission "Never show again" checked and denied
        * */
        void onPermissionDisabled();
/*
        * Callback on permission granted
        * */
        void onPermissionGranted();
    }
}

また、PreferenceUtilメソッドは次のとおりです。

public static void firstTimeAskingPermission(Context context, String permission, boolean isFirstTime){
SharedPreferences sharedPreference = context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE;
 sharedPreference.edit().putBoolean(permission, isFirstTime).apply();
 }
public static boolean isFirstTimeAskingPermission(Context context, String permission){
return context.getSharedPreferences(PREFS_FILE_NAME, MODE_PRIVATE).getBoolean(permission, true);
}

ここで必要なのは、* checkPermission* メソッドを適切な引数とともに使用することだけです。

ここに例があります、

PermissionUtil.checkPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    new PermissionUtil.PermissionAskListener() {
                        @Override
                        public void onPermissionAsk() {
                            ActivityCompat.requestPermissions(
                                    thisActivity,
              new String[]{Manifest.permission.READ_CONTACTS},
                            REQUEST_EXTERNAL_STORAGE
                            );
                        }
@Override
                        public void onPermissionPreviouslyDenied() {
                       //show a dialog explaining permission and then request permission
                        }
@Override
                        public void onPermissionDisabled() {
Toast.makeText(context, "Permission Disabled.", Toast.LENGTH_SHORT).show();
                        }
@Override
                        public void onPermissionGranted() {
                            readContacts();
                        }
                    });

特定の許可がすでに拒否されており、二度と確認しないかどうかを知りたいです。

ユーザーがNever ask againをチェックした場合、 onPermissionDisabledでコールバックを取得します。

ハッピーコーディング:)

于 2016-11-16T18:06:14.643 に答える