运行时权限,针对启动页做一些权限处理(比如微信,花椒等app也这么干)。

本文介绍了如何在Android应用中处理运行时权限,特别是在启动页的应用,如微信和花椒。使用了第三方库AndPermission,依赖为'com.yanzhenjie:permission:2.0.0-rc11'。关键权限包括:读取手机状态、读写外部存储、获取地理位置等。在onResume()方法中检查并请求权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运用的是第三方库:可添加依赖: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();
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值