运用的是第三方库:可添加依赖:implementation ‘com.yanzhenjie:permission:2.0.0-rc11’
(AndPremission)
通过数组:
public static final String[] PermissionGroup = new String[]{
Permission.READ_PHONE_STATE,//手机配置
Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE, // 存储,读取文件
// Permission.READ_CONTACTS, Permission.GET_ACCOUNTS, // 存联系人
Permission.ACCESS_FINE_LOCATION, Permission.ACCESS_COARSE_LOCATION, // 位置
// Permission.CAMERA, // 相机
// Permission.RECORD_AUDIO // 麦克风
};
@Override
protected void onResume() {
super.onResume();
if (hadLifeCycle) {
return;
}
reqPers.clear();
for (String per : PermissionGroup) {
reqPers.add(per);
}
if (VERSION.SDK_INT < VERSION_CODES.M) {
jumpPermissions(); // 跳过权限
} else {
boolean boFristGetPermission = SharedPreferUtils.read_bool("SolashActivity", "fristGetPermission");
if (!boFristGetPermission) {
if (ruleDlg == null) {
ruleDlg = new RuleButAlertDialog(this).builder().setCancelable(false).
setTitle(getString(R.string.request_for_access)).
setMsg(getString(R.string.order_better_service) + getString(R.string.app_name) + getString(R.string.order_better_service_permissions) + "\r\n" + PermissionUtil.transformText(this, reqPers)).
setPositiveButton(getString(R.string.authorize_now), v1 -> {
getPermission();
ruleDlg = null;
});
ruleDlg.show();
}
} else {
getPermission();
}
}
}
public void getPermission() {
AndPermission.with(this)
.runtime()
.permission(PermissionGroup)
.onGranted(permissions -> {
jumpPermissions();
})
.onDenied(permissions -> {
if (PermissionUtil.refusedPers.size() > 0) {
PermissionUtil.refusedPers.clear();
}
if (PermissionUtil.caterPers.size() > 0) {
PermissionUtil.caterPers.clear();
}
for (String per : permissions) {
if (AndPermission.hasAlwaysDeniedPermission(this, per)) {
LogUtil.i("AddMultiDevActivity", "狠狠拒绝 : " + per);
PermissionUtil.refusedPers.add(per);
} else {
LogUtil.i("AddMultiDevActivity", "欲拒还迎 : " + per);
PermissionUtil.caterPers.add(per);
}
}
if (PermissionUtil.caterPers.size() > 0) {
new RuleAlertDialog(this).builder().setCancelable(false).
setTitle(null).
setMsg(getString(R.string.order_better_service) + getString(R.string.app_name) + getString(R.string.order_better_service_permissions) + "\r\n" + PermissionUtil.transformText(this, PermissionUtil.caterPers)).
setPositiveButton(getString(R.string.authorize_now), v1 -> {
getPermission();
}).setNegativeButton(getString(R.string.next_time_say), v2 -> {
finish();
}).show();
} else if (PermissionUtil.refusedPers.size() > 0) {
new RuleAlertDialog(this).builder().setCancelable(false).
setTitle(null).
setMsg(getString(R.string.permission_refused_tip1) + getString(R.string.app_name) + getString(R.string.permission_refused_tip2) + "\r\n" + PermissionUtil.transformText(this, PermissionUtil.refusedPers)).
setPositiveButton(getString(R.string.go_to_settings), v1 -> {
PermissionUtil.toPermissionSetting(this);
hadLifeCycle = false;
}).setNegativeButton(getString(R.string.next_time_say), v2 -> {
finish();
}).show();
}
})
.start();
}
/**
* Created by jz on 2018/6/12.
*/
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import com.manniu.camera.R;
import java.util.ArrayList;
import java.util.List;
public class PermissionUtil {
private String TAG = PermissionUtil.class.getSimpleName();
public static final String READ_CALENDAR = “android.permission.READ_CALENDAR”;
public static final String WRITE_CALENDAR = “android.permission.WRITE_CALENDAR”;
public static final String CAMERA = "android.permission.CAMERA";
public static final String READ_CONTACTS = "android.permission.READ_CONTACTS";
public static final String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
public static final String GET_ACCOUNTS = "android.permission.GET_ACCOUNTS";
public static final String ACCESS_FINE_LOCATION = "android.permission.ACCESS_FINE_LOCATION";
public static final String ACCESS_COARSE_LOCATION = "android.permission.ACCESS_COARSE_LOCATION";
public static final String RECORD_AUDIO = "android.permission.RECORD_AUDIO";
public static final String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
public static final String CALL_PHONE = "android.permission.CALL_PHONE";
public static final String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
public static final String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
public static final String ADD_VOICEMAIL = "com.android.voicemail.permission.ADD_VOICEMAIL";
public static final String USE_SIP = "android.permission.USE_SIP";
public static final String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";
public static final String BODY_SENSORS = "android.permission.BODY_SENSORS";
public static final String SEND_SMS = "android.permission.SEND_SMS";
public static final String RECEIVE_SMS = "android.permission.RECEIVE_SMS";
public static final String READ_SMS = "android.permission.READ_SMS";
public static final String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH";
public static final String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
public static final String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
public static final String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
public static List<String> refusedPers = new ArrayList<>();
public static List<String> caterPers = new ArrayList<>();
public static String transformText(Context context, List<String> permissions) {
StringBuilder perText = new StringBuilder();
int index = 1;
for (String permission : permissions) {
switch (permission) {
case READ_CALENDAR:
case WRITE_CALENDAR: {
String message = context.getString(R.string.permission_WRITE_CALENDAR);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message);
index ++;
}
break;
}
case CAMERA: {
String message = context.getString(R.string.permission_CAMERA);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case READ_CONTACTS:
case WRITE_CONTACTS:
case GET_ACCOUNTS: {
String message = context.getString(R.string.permission_READ_CONTACTS);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case ACCESS_FINE_LOCATION:
case ACCESS_COARSE_LOCATION: {
String message = context.getString(R.string.permission_ACCESS_COARSE_LOCATION);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case RECORD_AUDIO: {
String message = context.getString(R.string.permission_RECORD_AUDIO);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case READ_PHONE_STATE:
case CALL_PHONE:
case READ_CALL_LOG:
case WRITE_CALL_LOG:
case USE_SIP:
case PROCESS_OUTGOING_CALLS: {
String message = context.getString(R.string.permission_READ_PHONE_STATE);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case BODY_SENSORS: {
String message = context.getString(R.string.permission_BODY_SENSORS);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case SEND_SMS:
case RECEIVE_SMS:
case READ_SMS:
case RECEIVE_WAP_PUSH:
case RECEIVE_MMS: {
String message = context.getString(R.string.permission_SEND_SMS);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
case READ_EXTERNAL_STORAGE:
case WRITE_EXTERNAL_STORAGE: {
String message = context.getString(R.string.permission_WRITE_EXTERNAL_STORAGE);
if (!perText.toString().contains(message)) {
perText.append("\r\n" +index + ". " + message );
index ++;
}
break;
}
}
}
return perText.toString();
}
/**
* 跳转到权限设置界面
*/
public static void toPermissionSetting(Context context) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 9) {
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
} else if (Build.VERSION.SDK_INT <= 8) {
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails");
intent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
}
context.startActivity(intent);
}
}
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* Created by hjz on 2017/12/1.
*/
public class RuleAlertDialog {
private Context context;
private Dialog dialog;
private LinearLayout lLayout_bg;
private TextView txt_title;
private TextView txt_msg;
private Button btn_neg;
private Button btn_pos;
private View img_line;
private Display display;
private boolean showTitle = false;
private boolean showMsg = false;
private boolean showPosBtn = false;
private boolean showNegBtn = false;
public RuleAlertDialog(Context context) {
this.context = context;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
}
public RuleAlertDialog builder() {
// 获取Dialog布局
View view = LayoutInflater.from(context).inflate(R.layout.dialog_rule, null);
// 获取自定义Dialog布局中的控件
lLayout_bg = (LinearLayout) view.findViewById(R.id.lLayout_bg);
txt_title = (TextView) view.findViewById(R.id.txt_title);
txt_title.setVisibility(View.GONE);
txt_msg = (TextView) view.findViewById(R.id.txt_msg);
txt_msg.setVisibility(View.GONE);
btn_neg = (Button) view.findViewById(R.id.btn_neg);
btn_neg.setVisibility(View.GONE);
btn_pos = (Button) view.findViewById(R.id.btn_pos);
btn_pos.setVisibility(View.GONE);
img_line = (View) view.findViewById(R.id.img_line);
img_line.setVisibility(View.GONE);
// 定义Dialog布局和参数
dialog = new Dialog(context, R.style.RuleAlertDialogStyle);
dialog.setContentView(view);
// 调整dialog背景大小
/* lLayout_bg.setLayoutParams(new FrameLayout.LayoutParams((int) (display.getWidth() * 0.8)
, LayoutParams.WRAP_CONTENT));*/
Window dialogWindow = dialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.width = (int) (display.getWidth() * 0.8);
return this;
}
public RuleAlertDialog setTitle(String title) {
if (title == null || "".equals(title)) {
showTitle = false;
txt_title.setText("");
} else {
showTitle = true;
txt_title.setText(title);
}
return this;
}
public RuleAlertDialog setMsg(String msg) {
if (msg == null || "".equals(msg)) {
showMsg = false;
txt_msg.setText("");
} else {
showMsg = true;
txt_msg.setText(msg);
}
return this;
}
public RuleAlertDialog setCancelable(boolean cancel) {
dialog.setCancelable(cancel);
return this;
}
public RuleAlertDialog setPositiveButton(CharSequence text, final OnClickListener listener) {
showPosBtn = true;
if ("".equals(text)) {
btn_pos.setText(context.getString(R.string.label_ok));
} else {
btn_pos.setText(text);
}
btn_pos.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(v);
}
dialog.dismiss();
}
});
return this;
}
public RuleAlertDialog setNegativeButton(CharSequence text, final OnClickListener listener) {
showNegBtn = true;
if (text == null) {
btn_neg.setVisibility(View.GONE);
return this;
} else if ("".equals(text)) {
btn_neg.setText(context.getString(R.string.label_cancel));
} else {
btn_neg.setText(text);
}
btn_neg.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
if (listener != null) {
listener.onClick(v);
}
}
});
return this;
}
public RuleAlertDialog setNegativeBtnColor(int res) {
btn_neg.setTextColor(res);
return this;
}
public void setOnDismissListener(DialogInterface.OnDismissListener dismissListener) {
dialog.setOnDismissListener(dismissListener);
}
public void setDis() {//防止窗口泄露
if (dialog.isShowing()) {
dialog.dismiss();
}
}
public void setOnKeyListener(DialogInterface.OnKeyListener onKeyListener) {
dialog.setOnKeyListener(onKeyListener);
}
public void setCanceledOnTouchOutside(boolean b) {
dialog.setCanceledOnTouchOutside(b);
}
private void setLayout() {
if (!showTitle && !showMsg) {
txt_title.setText(context.getString(R.string.tip_title));
txt_title.setVisibility(View.VISIBLE);
}
if (showTitle) {
txt_title.setVisibility(View.VISIBLE);
}
if (showMsg) {
txt_msg.setVisibility(View.VISIBLE);
}
if (!showPosBtn && !showNegBtn) {
btn_pos.setText(context.getString(R.string.label_ok));
btn_pos.setVisibility(View.VISIBLE);
btn_pos.setBackgroundResource(R.drawable.ruledialog_single_selector);
btn_pos.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
if (showPosBtn && showNegBtn) {
btn_pos.setVisibility(View.VISIBLE);
btn_pos.setBackgroundResource(R.drawable.ruledialog_right_selector);
btn_neg.setVisibility(View.VISIBLE);
btn_neg.setBackgroundResource(R.drawable.ruledialog_left_selector);
img_line.setVisibility(View.VISIBLE);
}
if (showPosBtn && !showNegBtn) {
btn_pos.setVisibility(View.VISIBLE);
btn_pos.setBackgroundResource(R.drawable.ruledialog_single_selector);
}
if (!showPosBtn && showNegBtn) {
btn_neg.setVisibility(View.VISIBLE);
btn_neg.setBackgroundResource(R.drawable.ruledialog_single_selector);
}
}
public void show() {
setLayout();
dialog.show();
}
}