处理android中单个类的权限

Ali*_*Nem 5 java android

为了处理android M +中的权限,我想编写一个单独的类,即PermissionHandler类,来处理所有与权限相关的工作,这样我就可以轻松地在任何项目中使用相同的类,而无需通过仅调用它来更改调用活动.构造函数:

           new PermissionHandler(CallingActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE, new PermissionHandler.PermissionGranted() {
                @Override
                public void onPermissionGranted() {
                    doWhatever();
                }
            });
Run Code Online (Sandbox Code Playgroud)

我的PermissionHandler是:

public class PermissionHandler implements ActivityCompat.OnRequestPermissionsResultCallback{
.
.
.
public PermissionHandler(AppCompatActivity callingActivity, String permission, PermissionGranted permissionGranted) {
        this.permission = permission;
        this.permissionGranted = permissionGranted;
        this.callingActivity= callingActivity;
        askForPermission();

}

private void askForPermission() {

            if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {
                    showAlertDialog();
                } else {
                    ActivityCompat.requestPermissions(callingActivity,permissionsArray, PERMISSION_REQUEST);
                }
            } else {
                permissionGranted.onPermissionGranted();
            }
}

    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST: {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                permissionGranted.onPermissionGranted();
            } else {
                onPermissionIsNotGranted();
            }
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,onRequestPermissionsResult在调用时应该调用的ActivityCompat.requestPermissions(callingActivity,permissionsArray, PERMISSION_REQUEST)是从不调用的.我发现这是因为android调用callingActivity.onRequestPermissionsResult在callingActivity中不存在并传递给PermissionHandler.我还考虑过使用Reflection和Proxies在运行时解决这个问题,但没有成功.

Nar*_*iya -1

 if (checkPermission(PERMISSION_WRITE_EXTERNAL_STORAGE)) {

            addToneToStorage();

        } else {

            requestForPermission(PERMISSION_WRITE_EXTERNAL_STORAGE);

        }
Run Code Online (Sandbox Code Playgroud)

基础活动

public static final int PERMISSION_RECORD_AUDIO = 1;
public static final int PERMISSION_READ_EXTERNAL_STORAGE = 2;
public static final int PERMISSION_WRITE_EXTERNAL_STORAGE = 3;

public boolean checkPermission(int permission) {

    if (ActivityCompat.checkSelfPermission(this, getPermission(permission)) != PackageManager.PERMISSION_GRANTED) {
        Debug.e("PERMISSION_CHECK_PERMISSION_FALSE", "-" + permission);
        return false;
    } else {
        Debug.e("PERMISSION_CHECK_PERMISSION_TRUE", "-" + permission);
        return true;
    }

}

public void requestForPermission(final int permission) {

    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            getPermission(permission))) {

        Debug.e("PERMISSION_NEEDED", "-" + permission);

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        // Setting Dialog Message
        alertDialog.setMessage(getString(R.string.text_permission_rationale));

        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                ActivityCompat.requestPermissions(BaseActivity.this, new String[]{getPermission(permission)}, permission);

            }
        });

        alertDialog.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                // Write your code here to invoke NO event
                dialog.dismiss();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    } else {

        Debug.e("PERMISSION_ALLOW", "-" + permission);

        ActivityCompat.requestPermissions(this, new String[]{getPermission(permission)}, permission);

    }
    // END_INCLUDE(camera_permission_request)
}

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


    if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        // Camera permission has been granted, preview can be displayed

        Debug.e("PERMISSION_ALLOWED", "-" + requestCode);

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        // Setting Dialog Message
        alertDialog.setMessage(getString(R.string.text_permission_granted));

        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();

            }
        });
        // Showing Alert Message
        alertDialog.show();

    } else {

        Debug.e("PERMISSION_DENIED", "-" + requestCode);

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);

        // Setting Dialog Message
        alertDialog.setMessage(getString(R.string.text_permission_not_granted));

        // Setting Positive "Yes" Button
        alertDialog.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {

                dialog.dismiss();

            }
        });
        // Showing Alert Message
        alertDialog.show();
    }

}

public String getPermission(int permis) {

    String permission = null;

    switch (permis) {
        case PERMISSION_RECORD_AUDIO:
            permission = Manifest.permission.RECORD_AUDIO;
            Debug.e("PERMISSION", "-" + permission);
            return permission;
        case PERMISSION_READ_EXTERNAL_STORAGE:
            permission = Manifest.permission.READ_EXTERNAL_STORAGE;
            Debug.e("PERMISSION", "-" + permission);
            return permission;
        case PERMISSION_WRITE_EXTERNAL_STORAGE:
            permission = Manifest.permission.WRITE_EXTERNAL_STORAGE;
            Debug.e("PERMISSION", "-" + permission);
            return permission;
    }
    return permission;
}
Run Code Online (Sandbox Code Playgroud)

}