MCPcopy
hub / github.com/getActivity/XXPermissions

github.com/getActivity/XXPermissions @28.3 sqlite

repository ↗ · DeepWiki ↗ · release 28.3 ↗
1,008 symbols 2,709 edges 111 files 483 documented · 48%
README

中文文档

Permission request framework

Integration steps

  • If your project Gradle configuration is in 7.0 below, needs to be in build.gradle file added
allprojects {
    repositories {
        // JitPack remote repository:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
  • If your Gradle configuration is 7.0 or above, needs to be in settings.gradle file added
dependencyResolutionManagement {
    repositories {
        // JitPack remote repository:https://jitpack.io
        maven { url 'https://jitpack.io' }
    }
}
  • After configuring the remote warehouse, under the project app module build.gradle Add remote dependencies to the file
android {
    // Support JDK 1.8
    compileOptions {
        targetCompatibility JavaVersion.VERSION_1_8
        sourceCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // Device compatibility framework:https://github.com/getActivity/DeviceCompat
    implementation 'com.github.getActivity:DeviceCompat:2.6'
    // Permission request framework:https://github.com/getActivity/XXPermissions
    implementation 'com.github.getActivity:XXPermissions:28.3'
}

Support library compatible

  • Option 1: Use remote dependencies of the old version framework
dependencies {
    // Device compatibility framework:https://github.com/getActivity/DeviceCompat
    implementation 'com.github.getActivity:DeviceCompat:2.3'
    // Permission request framework:https://github.com/getActivity/XXPermissions
    implementation 'com.github.getActivity:XXPermissions:26.8'
}
  • Option 2: If your project is still in the Support phase and it's not convenient to migrate to AndroidX yet, but you want to use the latest version of the framework, you can use the JetifierStandalone tool provided by Google to convert the aar packages from the released Release versions into Support-compatible aar packages using reverse mode.

  • You can choose either of the above two options, but it's still not recommended. These are only stopgap measures, not long-term solutions. Subsequent versions of the framework will no longer support Support projects. The best approach is to migrate your project to AndroidX.

scoped storage

  • If the project has been adapted to the Android 10 scoped storage feature, please go toAndroidManifest.xmljoin in
<manifest>

    <application>


        <meta-data
            android:name="ScopedStorage"
            android:value="true" />

    </application>

</manifest>
  • If the current project does not adapt to this feature, then this step can be ignored

  • It should be noted that this option is used by the framework to determine whether the current project is adapted to scoped storage. It should be noted that if your project has been adapted to the scoped storage feature, you can useREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGETo apply for permission, if your project has not yet adapted to the partition feature, even if you applyREAD_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGEThe permissions will also cause the files on the external storage to be unable to be read normally. If your project is not suitable for scoped storage, please useMANAGE_EXTERNAL_STORAGETo apply for permission, so that the files on the external storage can be read normally. If you want to know more about the features of Android 10 partition storage, you canClick here to view and learn.

Frame obfuscation rules

The framework has automatically added the framework's obfuscation rules for you internally. When you add the framework's dependent remote libraries, the framework's obfuscation rules will also be carried into your project. You don't need to add them manually yourself. Specific obfuscation rule content Click here to view

One code to get permission request has never been easier

  • Java code example
XXPermissions.with(this)
    // Request multiple permission
    .permission(PermissionLists.getRecordAudioPermission())
    .permission(PermissionLists.getCameraPermission())
    // Setting does not trigger error detection mechanism (local setting)
    //.unchecked()
    .request(new OnPermissionCallback() {

        @Override
        public void onPermissionResult(@NonNull List<IPermission> grantedList, @NonNull List<IPermission> deniedList) {
            boolean allGranted = deniedList.isEmpty();
            if (!allGranted) {
                // Determine whether the permissions that failed requests have been checked by the user to no longer ask
                boolean doNotAskAgain = XXPermissions.isDoNotAskAgainPermissions(activity, deniedList);
                // The logic for failing to handle permission requests here
                // ......
                return;
            }
            // The logic for handling permission requests here is successful
            // ......
        }
    });
  • Kotlin code example
XXPermissions.with(this)
    // Request multiple permission
    .permission(PermissionLists.getRecordAudioPermission())
    .permission(PermissionLists.getCameraPermission())
    // Setting does not trigger error detection mechanism (local setting)
    //.unchecked()
    .request { grantedList, deniedList ->
        val allGranted = deniedList.isEmpty()
        if (!allGranted) {
            // Determine whether the permissions that failed requests have been checked by the user to no longer ask
            val doNotAskAgain = XXPermissions.isDoNotAskAgainPermissions(activity, deniedList)
            // The logic for failing to handle permission requests here
            // ......
            return@request
        }
        // The logic for handling permission requests here is successful
        // ......
    }

Introduction to other APIs of the framework

// Check if a single permission is granted
XXPermissions.isGrantedPermission(@NonNull Context context, @NonNull IPermission permission);
XXPermissions.isGrantedPermissions(@NonNull Context context, @NonNull IPermission[] permissions);
XXPermissions.isGrantedPermissions(@NonNull Context context, @NonNull List<IPermission> permissions);

// Get the granted permissions from a permission list
XXPermissions.getGrantedPermissions(@NonNull Context context, @NonNull IPermission[] permissions);
XXPermissions.getGrantedPermissions(@NonNull Context context, @NonNull List<IPermission> permissions);

// Get the denied permissions from a permission list
XXPermissions.getDeniedPermissions(@NonNull Context context, @NonNull IPermission[] permissions);
XXPermissions.getDeniedPermissions(@NonNull Context context, @NonNull List<IPermission> permissions);

// Determine whether the two permissions are equal
XXPermissions.equalsPermission(@NonNull IPermission permission, @NonNull IPermission permission2);
XXPermissions.equalsPermission(@NonNull IPermission permission, @NonNull String permissionName);
XXPermissions.equalsPermission(@NonNull String permissionName1, @NonNull String permissionName2);

// Determine whether a certain permission is included in the permission list
XXPermissions.containsPermission(@NonNull List<IPermission> permissions, @NonNull IPermission permission);
XXPermissions.containsPermission(@NonNull List<IPermission> permissions, @NonNull String permissionName);

// Check if a permission is a health permission
XXPermissions.isHealthPermission(@NonNull IPermission permission);

// Check if a permission has been denied with the "Never ask again" option selected 
// (Must be called within the permission request callback to be effective)
XXPermissions.isDoNotAskAgainPermission(@NonNull Activity activity, @NonNull IPermission permission);
XXPermissions.isDoNotAskAgainPermissions(@NonNull Activity activity, @NonNull IPermission[] permissions);
XXPermissions.isDoNotAskAgainPermissions(@NonNull Activity activity, @NonNull List<IPermission> permissions);

// Navigate to the permission settings page (Context version)
XXPermissions.startPermissionActivity(@NonNull Context context);
XXPermissions.startPermissionActivity(@NonNull Context context, @NonNull IPermission... permissions);
XXPermissions.startPermissionActivity(@NonNull Context context, @NonNull List<IPermission> permissions);

// Navigate to the permission settings page (Activity version)
XXPermissions.startPermissionActivity(@NonNull Activity activity);
XXPermissions.startPermissionActivity(@NonNull Activity activity, @NonNull IPermission... permissions);
XXPermissions.startPermissionActivity(@NonNull Activity activity, @NonNull List<IPermission> permissions);
XXPermissions.startPermissionActivity(@NonNull Activity activity, @NonNull List<IPermission> permissions, @IntRange(from = 1, to = 65535) int requestCode);
XXPermissions.startPermissionActivity(@NonNull Activity activity, @NonNull IPermission permission, @Nullable OnPermissionCallback callback);
XXPermissions.startPermissionActivity(@NonNull Activity activity, @NonNull List<IPermission> permissions, @Nullable OnPermissionCallback callback);

// Navigate to the permission settings page (Android Fragment version)
XXPermissions.startPermissionActivity(@NonNull Fragment fragment);
XXPermissions.startPermissionActivity(@NonNull Fragment fragment, @NonNull IPermission... permissions);
XXPermissions.startPermissionActivity(@NonNull Fragment fragment, @NonNull List<IPermission> permissions);
XXPermissions.startPermissionActivity(@NonNull Fragment fragment, @NonNull List<IPermission> permissions, @IntRange(from = 1, to = 65535) int requestCode);
XXPermissions.startPermissionActivity(@NonNull Fragment fragment, @NonNull IPermission permission, @Nullable OnPermissionCallback callback);
XXPermissions.startPermissionActivity(@NonNull Fragment fragment, @NonNull List<IPermission> permissions, @Nullable OnPermissionCallback callback);

// Navigate to the permission settings page (AndroidX Fragment version)
XXPermissions.startPermissionActivity(@NonNull androidx.fragment.app.Fragment xFragment);
XXPermissions.startPermissionActivity(@NonNull androidx.fragment.app.Fragment xFragment, @NonNull IPermission... permissions);
XXPermissions.startPermissionActivity(@NonNull androidx.fragment.app.Fragment xFragment, @NonNull List<IPermission> permissions);
XXPermissions.startPermissionActivity(@NonNull androidx.fragment.app.Fragment xFragment, @NonNull List<IPermission> permissions, @IntRange(from = 1, to = 65535) int requestCode);
XXPermissions.startPermissionActivity(@NonNull androidx.fragment.app.Fragment xFragment, @NonNull IPermission permission, @Nullable OnPermissionCallback callback);
XXPermissions.startPermissionActivity(@NonNull androidx.fragment.app.Fragment xFragment, @NonNull List<IPermission> permissions, @Nullable OnPermissionCallback callback);

// Set the permission description provider (Global setting)
XXPermissions.setPermissionDescriptionClass(@Nullable Class<? extends OnPermissionDescription> clazz);

// Set the permission request interceptor (Global setting)
XXPermissions.setPermissionInterceptorClass(@Nullable Class<? extends OnPermissionInterceptor> clazz);

// Set whether to enable error detection mode (Global setting)
XXPermissions.setCheckMode(boolean checkMode);

Comparison between similar permission request frameworks

Adaptation details XXPermissions AndPermission PermissionX AndroidUtilCode-PermissionUtils PermissionsDispatcher RxPermissions EasyPermissions Dexter
Corresponding version 28.3 2.0.3 1.8.1 1.31.0 4.9.2 0.12 3.

Extension points exported contracts — how you extend this code

IStartActivityDelegate (Interface)
author : Android 轮子哥 github : https://github.com/getActivity/XXPermissions time : 2025/05/20 desc : startAc [9 implementers]
library/src/main/java/com/hjq/permissions/start/IStartActivityDelegate.java
OnPermissionDescription (Interface)
author : Android 轮子哥 github : https://github.com/getActivity/XXPermissions time : 2025/05/30 desc : 权限说明接口 [4 implementers]
library/src/main/java/com/hjq/permissions/OnPermissionDescription.java
OnPermissionInterceptor (Interface)
author : Android 轮子哥 github : https://github.com/getActivity/XXPermissions time : 2020/12/26 desc : 权限请求拦截器 [2 implementers]
library/src/main/java/com/hjq/permissions/OnPermissionInterceptor.java
OnPermissionFragmentCallback (Interface)
author : Android 轮子哥 github : https://github.com/getActivity/XXPermissions time : 2025/05/30 desc : 权限 Frag [2 implementers]
library/src/main/java/com/hjq/permissions/core/OnPermissionFragmentCallback.java
OnPermissionCallback (Interface)
author : Android 轮子哥 github : https://github.com/getActivity/XXPermissions time : 2018/06/15 desc : 权限请求结果回 [1 implementers]
library/src/main/java/com/hjq/permissions/OnPermissionCallback.java

Core symbols most depended-on inside this repo

getCachePermission
called by 150
library/src/main/java/com/hjq/permissions/permission/PermissionLists.java
putCachePermission
called by 150
library/src/main/java/com/hjq/permissions/permission/PermissionLists.java
permission
called by 51
library/src/main/java/com/hjq/permissions/XXPermissions.java
isGrantedPermission
called by 40
library/src/main/java/com/hjq/permissions/permission/base/IPermission.java
equalsPermission
called by 32
library/src/main/java/com/hjq/permissions/tools/PermissionUtils.java
containsPermission
called by 32
library/src/main/java/com/hjq/permissions/tools/PermissionUtils.java
with
called by 29
library/src/main/java/com/hjq/permissions/XXPermissions.java
interceptor
called by 29
library/src/main/java/com/hjq/permissions/XXPermissions.java

Shape

Method 896
Class 100
Interface 10
Enum 2

Languages

Java100%

Modules by API surface

library/src/main/java/com/hjq/permissions/permission/PermissionLists.java157 symbols
library/src/main/java/com/hjq/permissions/XXPermissions.java27 symbols
library/src/main/java/com/hjq/permissions/permission/base/BasePermission.java24 symbols
library/src/main/java/com/hjq/permissions/tools/PermissionVersion.java21 symbols
library/src/main/java/com/hjq/permissions/core/PermissionChannelImpl.java19 symbols
library/src/main/java/com/hjq/permissions/permission/dangerous/GetInstalledAppsPermission.java18 symbols
library/src/main/java/com/hjq/permissions/permission/dangerous/BodySensorsBackgroundPermission.java17 symbols
library/src/main/java/com/hjq/permissions/permission/dangerous/AccessBackgroundLocationPermission.java17 symbols
library/src/main/java/com/hjq/permissions/permission/base/IPermission.java17 symbols
app/src/main/java/com/hjq/permissions/demo/MainActivity.java17 symbols
library/src/main/java/com/hjq/permissions/tools/PermissionUtils.java16 symbols
app/src/main/java/com/hjq/permissions/demo/WindowLifecycleManager.java16 symbols

For agents

$ claude mcp add XXPermissions \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact