本文参考文献:《疯狂Android讲义 : 第2版 》
本文参考文章: 《Android 6.0 - 动态权限管理的解决方案》

检测权限工具类

检测权限工具类,我们可以将其在多个应用中复用:

package com.toby.personal.testlistview;import android.content.Context;import android.content.pm.PackageManager;import android.support.v4.content.ContextCompat;import android.util.Log;/** * Created by toby on 2017/4/29. */class PermissionsChecker {    private final Context mContext;    PermissionsChecker(Context context) {        mContext = context.getApplicationContext();    }    // 判断权限集合    boolean lacksPermissions(String... permissions) {        for (String permission : permissions) {            if (lacksPermission(permission)) {                Log.d("","jkdfksahdfkhsadkjghdfskg: " + permission);                return true;            }        }        return false;    }    // 判断是否缺少权限    private boolean lacksPermission(String permission) {        return ContextCompat.checkSelfPermission(mContext, permission) ==                PackageManager.PERMISSION_DENIED;    }}

授权页

授权页, 首先使用系统默认的授权页, 当用户拒绝时, 指导用户手动设置, 当用户再次操作失败后, 返回继续提示。用户手动退出授权页时, 给使用页发送授权失败的通知。我们可以保存这个授权页并将其在多个应用中复用。

package com.toby.personal.testlistview;import android.app.Activity;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.PackageManager;import android.net.Uri;import android.os.Bundle;import android.provider.Settings;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;/** * Created by toby on 2017/4/29. */public class PermissionsActivity extends AppCompatActivity {    public static final int PERMISSIONS_GRANTED = 0; // 权限授权    public static final int PERMISSIONS_DENIED = 1; // 权限拒绝    private static final int PERMISSION_REQUEST_CODE = 0; // 系统权限管理页面的参数    private static final String EXTRA_PERMISSIONS =            "com.toby.personal.permission.extra_permission"; // 权限参数    private static final String PACKAGE_URL_SCHEME = "package:"; // 方案    private PermissionsChecker mChecker; // 权限检测器    private boolean isRequireCheck; // 是否需要系统权限检测, 防止和系统提示框重叠    // 启动当前权限页面的公开接口    public static void startActivityForResult(Activity activity, int requestCode, String... permissions) {        Intent intent = new Intent(activity, PermissionsActivity.class);        intent.putExtra(EXTRA_PERMISSIONS, permissions);        ActivityCompat.startActivityForResult(activity, intent, requestCode, null);    }    @Override protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (getIntent() == null || !getIntent().hasExtra(EXTRA_PERMISSIONS)) {            throw new RuntimeException("PermissionsActivity需要使用静态startActivityForResult方法启动!");        }        setContentView(R.layout.activity_permissions);        mChecker = new PermissionsChecker(this);        isRequireCheck = true;    }    @Override protected void onResume() {        super.onResume();        if (isRequireCheck) {            String[] permissions = getPermissions();            if (mChecker.lacksPermissions(permissions)) {                requestPermissions(permissions); // 请求权限            } else {                allPermissionsGranted(); // 全部权限都已获取            }        } else {            isRequireCheck = true;        }    }    // 返回传递的权限参数    private String[] getPermissions() {        return getIntent().getStringArrayExtra(EXTRA_PERMISSIONS);    }    // 请求权限兼容低版本    private void requestPermissions(String... permissions) {        ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_CODE);    }    // 全部权限均已获取    private void allPermissionsGranted() {        setResult(PERMISSIONS_GRANTED);        finish();    }    /**     * 用户权限处理,     * 如果全部获取, 则直接过.     * 如果权限缺失, 则提示Dialog.     *     * @param requestCode  请求码     * @param permissions  权限     * @param grantResults 结果     */    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        if (requestCode == PERMISSION_REQUEST_CODE && hasAllPermissionsGranted(grantResults)) {            isRequireCheck = true;            allPermissionsGranted();        } else {            isRequireCheck = false;            showMissingPermissionDialog();        }    }    // 含有全部的权限    private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {        for (int grantResult : grantResults) {            if (grantResult == PackageManager.PERMISSION_DENIED) {                return false;            }        }        return true;    }    // 显示缺失权限提示    private void showMissingPermissionDialog() {        AlertDialog.Builder builder = new AlertDialog.Builder(PermissionsActivity.this);        builder.setTitle(R.string.help);        builder.setMessage(R.string.string_help_text);        // 拒绝, 退出应用        builder.setNegativeButton(R.string.quit, new DialogInterface.OnClickListener() {            @Override public void onClick(DialogInterface dialog, int which) {                setResult(PERMISSIONS_DENIED);                finish();            }        });        builder.setPositiveButton(R.string.settings, new DialogInterface.OnClickListener() {            @Override public void onClick(DialogInterface dialog, int which) {                startAppSettings();            }        });        builder.setCancelable(false);        builder.show();    }    // 启动应用的设置    private void startAppSettings() {        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));        startActivity(intent);    }}

本程序中用到的字符串内容:

    权限(permission)    应用需要必要的运行权限    设置    帮助    当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。\n\n最后点击两次后退按钮,即可返回。    退出

需要在 AndroidManifest.xml 中加入权限的申请内容:

            

主布局文件的内容如下:

<?xml version="1.0" encoding="utf-8"?>    

主程序文件的内容如下:

package com.toby.personal.testlistview;import android.Manifest;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.telephony.TelephonyManager;import android.util.Log;import android.view.View;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    final private static String TAG = "Toby_Test";    final private static int REQUEST_CODE = 29; // 请求码    ArrayList statusValues = new ArrayList<>();    static final String[] PERMISSIONS = new String[]{            Manifest.permission.READ_PHONE_STATE,            Manifest.permission.ACCESS_COARSE_LOCATION,            Manifest.permission.ACCESS_FINE_LOCATION    };    private PermissionsChecker permissionsChecker;    @Override    protected void onCreate(Bundle savedInstanceState) {        Log.d(TAG, "=========== onCreate ===========");        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        permissionsChecker = new PermissionsChecker(this);    }    @Override    protected void onResume() {        super.onResume();        if (permissionsChecker.lacksPermissions(PERMISSIONS)) {            startPermissionsActivity();        }    }    private void startPermissionsActivity() {        PermissionsActivity.startActivityForResult(this, REQUEST_CODE, PERMISSIONS);    }    public void start(View view) {        if (statusValues.isEmpty()) {            final TelephonyManager telephonyManager =                    (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);            statusValues.add(telephonyManager.getDeviceId());            statusValues.add(telephonyManager.getDeviceSoftwareVersion() != null ?                    telephonyManager.getDeviceSoftwareVersion() : "null");            statusValues.add(telephonyManager.getNetworkOperator());            statusValues.add(telephonyManager.getNetworkOperatorName());            statusValues.add(String.valueOf(telephonyManager.getPhoneType()));            statusValues.add(telephonyManager.getCellLocation() != null ?                    telephonyManager.getCellLocation().toString() : "NO");            statusValues.add(telephonyManager.getSimCountryIso());            statusValues.add(telephonyManager.getSimSerialNumber());            statusValues.add(String.valueOf(telephonyManager.getSimState()));        }        Toast.makeText(this, statusValues.toString(), Toast.LENGTH_LONG).show();    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        // 拒绝时, 关闭页面, 缺少主要权限, 无法运行        if (requestCode == REQUEST_CODE && resultCode == PermissionsActivity.PERMISSIONS_DENIED) {            finish();        }    }}

程序的运行效果,各位可以自行尝试,如果有什么问题,可以留言一起讨论。

更多相关文章

  1. Android(安卓)7.0 调用相机 FileProvider
  2. linux android 真机测试
  3. Android第七个功能:XmlPullParser添加内容保存为XML文件
  4. Android模块编译过程中的错误no rules to make target
  5. android实现选择图片并压缩上传的功能
  6. 使用BroadcastReceiver实现开机启动Service或Activity
  7. Android开发之permission
  8. 【记录】搭建Android开发环境
  9. android 权限动态申请 RxPermissions使用

随机推荐

  1. Android 中文API(86)——ResourceCursorAda
  2. android用户界面-组件Widget-地图视图Map
  3. Android开发——Android搜索框架(二)
  4. Android下Excel的操作
  5. android 创建桌面快捷方式 、插件
  6. 编译android的linux内核
  7. android图表ichartjs
  8. Android Vibrator使用
  9. Android调用天气预报的WebService简单例
  10. Android(安卓)-- handler消息传送机制