这里是我的类,它处理所有的MarshMallow权限,我更喜欢单独的it类,因为我将在我的所有应用程序中调用它的方法。
一开始,我习惯于以这种方式检查许可:
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;
}
}
}
下面是我处理所有权限的类:
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);
}
}
}
使用单击按钮从照相机或图像库上载图像时,我检查权限
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();
}
如果未授予权限,则请求权限,如果被授予,则调用需要此权限的方法来运行。
@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;
}
}
发布于 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()
:
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) {返回真;}其他{返回假;}
return result == PackageManager.PERMISSION_GRANTED;
下一步是看到这样一个事实:您的“计算”结果总是相同的。唯一的区别是传递给Manifest.permission
给checkSelfPermission
的是什么。您可以通过使用import static
进一步简化如下:
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;
}
而你的方法所提供的信息利益突然消失了。封装这一点只剩下一个真正的好处,那就是您提供了一个瘦抽象层。
至少在给定的使用代码中,这还不足以证明该类的存在。如果您在多个地方使用它,它可能是有用的,但现在这门课对我来说似乎是无用的包袱。
https://codereview.stackexchange.com/questions/143769
复制相似问题