首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于处理MarshMallowPermission的ِAndroid类

用于处理MarshMallowPermission的ِAndroid类
EN

Code Review用户
提问于 2016-10-10 09:12:14
回答 1查看 3K关注 0票数 2

这里是我的类,它处理所有的MarshMallow权限,我更喜欢单独的it类,因为我将在我的所有应用程序中调用它的方法。

一开始,我习惯于以这种方式检查许可:

代码语言:javascript
运行
复制
private void CheckPermissionGranted() {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CHECK_PERMISSION_CODE);
            return;
        }
    }
}

下面是我处理所有权限的类:

代码语言:javascript
运行
复制
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.widget.Toast;

/**
 * Created by mina on 10/9/2016.
 */

public class MarshMallowPermission {

    public static final int RECORD_PERMISSION_REQUEST_CODE = 1;
    public static final int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 2;
    public static final int READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 3;
    public static final int CAMERA_PERMISSION_REQUEST_CODE = 4;
    Activity activity;

    public MarshMallowPermission(Activity activity) {
        this.activity = activity;
    }

    public boolean checkPermissionForRecord(){
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.RECORD_AUDIO);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }

    public boolean checkPermissionForWriteExternalStorage(){
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }
    public boolean checkPermissionForReadExternalStorage(){
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }

    public boolean checkPermissionForCamera(){
        int result = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
        if (result == PackageManager.PERMISSION_GRANTED){
            return true;
        } else {
            return false;
        }
    }

    public void requestPermissionForRecord(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.RECORD_AUDIO)){
            Toast.makeText(activity, "Microphone permission needed for recording. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.RECORD_AUDIO},RECORD_PERMISSION_REQUEST_CODE);
        }
    }

    public void requestPermissionForWriteExternalStorage(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)){
            Toast.makeText(activity, "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
        }
    }
    public void requestPermissionForReadExternalStorage(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.READ_EXTERNAL_STORAGE)){
            Toast.makeText(activity, "External Storage permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE);
        }
    }

    public void requestPermissionForCamera(){
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)){
            Toast.makeText(activity, "Camera permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},CAMERA_PERMISSION_REQUEST_CODE);
        }
    }
}

使用单击按钮从照相机或图像库上载图像时,我检查权限

代码语言:javascript
运行
复制
private void selectImage() {
    final CharSequence[] items = {str_camera, str_image_lib,
            str_cancel};

    AlertDialog.Builder builder = new AlertDialog.Builder(UploadActivity.this);
    builder.setTitle("Add Files!");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals(str_camera)) {
                if (!marshMallowPermission.checkPermissionForCamera()) {
                    marshMallowPermission.requestPermissionForCamera();
                    return;
                }
                dispatchTakePictureIntent();
            } else if (items[item].equals(str_image_lib)) {
                if (!marshMallowPermission.checkPermissionForReadExternalStorage()) {
                    marshMallowPermission.requestPermissionForReadExternalStorage();
                    return;
                }
                enableBrowseFile();
            } else if (items[item].equals(str_cancel)) {
                dialog.dismiss();
            }
        }
    });
    builder.show();
}

如果未授予权限,则请求权限,如果被授予,则调用需要此权限的方法来运行。

代码语言:javascript
运行
复制
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        case MarshMallowPermission.READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                enableBrowseFile();
            } else {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    marshMallowPermission.requestPermissionForReadExternalStorage();
                }
            }

            break;
        case MarshMallowPermission.CAMERA_PERMISSION_REQUEST_CODE:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                dispatchTakePictureIntent();
            } else {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    marshMallowPermission.requestPermissionForCamera();
                }
            }

            break;
    }
}
EN

回答 1

Code Review用户

发布于 2016-12-16 15:50:35

有几件事:

公共静态最终int WRITE_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 1;公共静态最终int RECORD_PERMISSION_REQUEST_CODE = 2;公共静态最终int READ_EXTERNAL_STORAGE_PERMISSION_REQUEST_CODE = 3;公共静态最终int CAMERA_PERMISSION_REQUEST_CODE = 4;

这是编译时常量表达式的集合.你把这些和“魔术”的int值联系起来。相反,enum将提供类型安全的请求代码。为了实现与Android的互操作性,您可以公开一个方法requestCode()

代码语言:javascript
运行
复制
public enum RequestCode {
    Record(1), WriteExternalStorage(2), ReadExternalStorage(3), Camera(4);

    private final int code;
    private RequestCode(int code){
        this.code = code;
    }
    public int requestCode() {
        return code;
    }
}

这使您的代码更容易阅读,海事组织。此外,它还提供了适当的封装,而不是依赖于常量类成员。

您的checkPermissionFor*()方法都遵循一定的模式。你可以彻底崩溃这些方法。第一步是确保以下代码示例是等价的:

如果(结果== PackageManager.PERMISSION_GRANTED) {返回真;}其他{返回假;}

代码语言:javascript
运行
复制
return result == PackageManager.PERMISSION_GRANTED;

下一步是看到这样一个事实:您的“计算”结果总是相同的。唯一的区别是传递给Manifest.permissioncheckSelfPermission的是什么。您可以通过使用import static进一步简化如下:

代码语言:javascript
运行
复制
import static android.support.v3.content.ContextCompat.checkSelfPermission;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.Manifest.permission;

// ...
public boolean checkPermissionForRecord() {
    return checkSelfPermission(activity, permission.RECORD_AUDIO) == PERMISSION_GRANTED;
}

而你的方法所提供的信息利益突然消失了。封装这一点只剩下一个真正的好处,那就是您提供了一个瘦抽象层。

至少在给定的使用代码中,这还不足以证明该类的存在。如果您在多个地方使用它,它可能是有用的,但现在这门课对我来说似乎是无用的包袱。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/143769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档