## Usage with Java Here's a minimum example, in which you register a `MainActivity` which requires `Manifest.permission.CAMERA`. ### 0. Prepare AndroidManifest Add the following line to `AndroidManifest.xml`: `` ### 1. Attach annotations PermissionsDispatcher introduces only a few annotations, keeping its general API concise: > NOTE: Annotated methods must not be `private`. |Annotation|Required|Description| |---|---|---| |`@RuntimePermissions`|**✓**|Register an `Activity` or `Fragment` to handle permissions| |`@NeedsPermission`|**✓**|Annotate a method which performs the action that requires one or more permissions| |`@OnShowRationale`||Annotate a method which explains why the permissions are needed. It passes in a `PermissionRequest` object which can be used to continue or abort the current permission request upon user input. If you don't specify any argument for the method compiler will generate `process${NeedsPermissionMethodName}ProcessRequest` and `cancel${NeedsPermissionMethodName}ProcessRequest`. You can use those methods in place of `PermissionRequest`(ex: with `DialogFragment`)| |`@OnPermissionDenied`||Annotate a method which is invoked if the user doesn't grant the permissions| |`@OnNeverAskAgain`||Annotate a method which is invoked if the user chose to have the device "never ask again" about a permission| ```java @RuntimePermissions public class MainActivity extends AppCompatActivity { @NeedsPermission(Manifest.permission.CAMERA) void showCamera() { getSupportFragmentManager().beginTransaction() .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance()) .addToBackStack("camera") .commitAllowingStateLoss(); } @OnShowRationale(Manifest.permission.CAMERA) void showRationaleForCamera(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage(R.string.permission_camera_rationale) .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed()) .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel()) .show(); } @OnPermissionDenied(Manifest.permission.CAMERA) void showDeniedForCamera() { Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.CAMERA) void showNeverAskForCamera() { Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show(); } } ``` ### 2. Delegate to generated class Upon compilation, PermissionsDispatcher generates a class for `MainActivityPermissionsDispatcher`([Activity Name] + PermissionsDispatcher), which you can use to safely access these permission-protected methods. The only step you have to do is delegating the work to this helper class: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button_camera).setOnClickListener(v -> { // NOTE: delegate the permission handling to generated method MainActivityPermissionsDispatcher.showCameraWithPermissionCheck(this); }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // NOTE: delegate the permission handling to generated method MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); } ``` Check out the [sample](https://github.com/hotchemi/PermissionsDispatcher/tree/master/sample) for more details.