Android6.0SDK23动态权限的请求和直接使用-使用版

来源:互联网 发布:淘宝买家vip等级 编辑:程序博客网 时间:2024/06/01 17:19

自从Android6.0以后SDK23版本,现在的Android的很多权限是需要动态请求的,例如常用的相机,读写存储,定位,录音等等,不仅仅要在AndroidManifest.xml里面做权限的请求,而且在代码里,也需要做一些处理,为了方便自己使用,把基本的模板总结出来,若没有“奇特”需求的情况下,基本是“拿来主义”直接使用。
文末会附上Demo下载。

贴图几张:

基本的操作,其他情况自己可以测试,可以自己在手机的应用管理处再把权限给取消,这样可以反复测试各种情况:
基本页面显示

点击统一请求的显示,第一个请求

第二个请求

请求都授权后的提示

拨打电话的请求
拨打电话允许后的显示


贴完图,上部分代码块:

BaseActivity自定义基类:

/** * Created by zhenQi on 2016/12/27. * 自定义BaseActivity基类 */public class BaseActivity extends AppCompatActivity {    //实例化监听对象    private static PermissionListener mListener;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //添加Activity管理类的方法-添加类        ActivityCollector.addActivity(this);    }    @Override    protected void onDestroy() {        super.onDestroy();        //添加Activity管理类的方法-移除类        ActivityCollector.removeActivity(this);    }    //权限请求的方法(直接粘贴复制即可使用)    public static void requestRuntimePermission(String[] permissions, PermissionListener listener) {        Activity topActivity = ActivityCollector.getTopActivity();        if (topActivity == null) {            return;        }        mListener = listener;        List<String> permissionList = new ArrayList<>();        for (String permission : permissions) {            if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) {                permissionList.add(permission);            }        }        if (!permissionList.isEmpty()) {            ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), 1);        } else {            mListener.onGranted();        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case 1:                if (grantResults.length > 0) {                    List<String> deniedPermissions = new ArrayList<>();                    for (int i = 0; i < grantResults.length; i++) {                        int grantResult = grantResults[i];                        String permission = permissions[i];                        if (grantResult != PackageManager.PERMISSION_GRANTED) {                            deniedPermissions.add(permission);                        }                    }                    if (deniedPermissions.isEmpty()) {                        mListener.onGranted();                    } else {                        mListener.onDenied(deniedPermissions);                    }                }                break;            default:                break;        }    }}

主要操作的类MainActivity:

/** * 权限的请求操作封装在BaseActivity基类中,当前类继承BaseActivity基类 * 首先声明(废话):动态权限是Android 6.0版本以后(SDK:23),谷歌更新的对于一些危险/隐秘权限的动态提醒和动态授权的“规定” * 可以用判断方法:Build.VERSION.SDK_INT >= 23,来判断当前版本是不是大于SDK 23。——废话结束。 * 使用权限方法,直接调用requestRuntimePermission(要请求的权限数组,PermissionListener监听方法)的方法, * 注:首先所有的动态请求,都是要在AndroidManifest.xml,中去添加的,例如: * <uses-permission android:name="android.permission.CALL_PHONE" />//打电话权限 * <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />//精准定位权限 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//写数据权限 * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />//读数据权限 * <uses-permission android:name="android.permission.CAMERA" />//相机权限 * <uses-permission android:name="android.permission.RECORD_AUDIO" />//录音权限 * 等等... */public class MainActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    /**     * (这里引用布局的onClick点击方法)     *     * @param view 点击-统一请求很多权限:     */    public void buttonClick(View view) {        requestRuntimePermission(new String[]{                Manifest.permission.CALL_PHONE,//打电话权限                Manifest.permission.ACCESS_FINE_LOCATION,//精准定位权限                Manifest.permission.CAMERA,//相机权限                Manifest.permission.WRITE_EXTERNAL_STORAGE,//写数据权限                Manifest.permission.READ_EXTERNAL_STORAGE,//读数据权限                Manifest.permission.RECORD_AUDIO//录音权限        }, new PermissionListener() {            //授权后的回调方法            @Override            public void onGranted() {                Toast.makeText(MainActivity.this, "所有权限都同意了", Toast.LENGTH_SHORT).show();            }            //权限被拒绝的回调方法            @Override            public void onDenied(List<String> deniedPermission) {                for (String permission : deniedPermission) {                    Toast.makeText(MainActivity.this, "被拒绝权限:" + permission, Toast.LENGTH_SHORT).show();                }            }        });    }    //单独请求相机权限    public void pai(View view) {        requestRuntimePermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,                Manifest.permission.READ_EXTERNAL_STORAGE}, new PermissionListener() {            @Override            public void onGranted() {                Toast.makeText(MainActivity.this, "允许了拍照", Toast.LENGTH_SHORT).show();            }            @Override            public void onDenied(List<String> deniedPermission) {                for (String permission : deniedPermission) {                    Toast.makeText(MainActivity.this, "被拒绝权限:" + permission, Toast.LENGTH_SHORT).show();                }            }        });    }    //单独请求-存储权限    public void cun(View view) {        requestRuntimePermission(new String[]{Manifest.permission.CAMERA}, new PermissionListener() {            @Override            public void onGranted() {                Toast.makeText(MainActivity.this, "允许了读写", Toast.LENGTH_SHORT).show();            }            @Override            public void onDenied(List<String> deniedPermission) {                for (String permission : deniedPermission) {                    Toast.makeText(MainActivity.this, "被拒绝权限:" + permission, Toast.LENGTH_SHORT).show();                }            }        });    }    //单独请求-打电话的权限    public void callClick(View view) {        Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "123456789"));        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {            // TODO: Consider calling            //    ActivityCompat#requestPermissions            // here to request the missing permissions, and then overriding            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,            //                                          int[] grantResults)            // to handle the case where the user grants the permission. See the documentation            // for ActivityCompat#requestPermissions for more details.            return;        }        startActivity(intent);    }    //跳转到下一页    public void tiao(View view) {        Intent intent = new Intent(this, Main2Activity.class);        startActivity(intent);    }    //抽出-做一些操作的方法    private void doSomething() {        // do something        Toast.makeText(this, "所有权限都同意了", Toast.LENGTH_SHORT).show();    }}

其他代码:

其他说明:

Demo中自定义了Util工具类,
PermissionListener(监听回调)接口,
自定义ActivityCollector(Activity)管理类

/** * Created by zhenQi on 2016/12/27. * 自定义的一个工具类 */public class Util {    public void test() {        BaseActivity.requestRuntimePermission(new String[]{}, new PermissionListener() {            @Override            public void onGranted() {            }            @Override            public void onDenied(List<String> deniedPermission) {            }        });    }}
/** * Created by zhenQi on 2016/12/27. * Activity的管理类,方面统一管理Activity */public class ActivityCollector {    private static List<Activity> activityList = new ArrayList<>();    public static void addActivity(Activity activity) {        activityList.add(activity);    }    public static void removeActivity(Activity activity) {        activityList.remove(activity);    }    public static Activity getTopActivity() {        if (activityList.isEmpty()) {            return null;        } else {            return activityList.get(activityList.size() - 1);        }    }}
/** * Created by zhenQi on 2016/12/27. * 定义回调接口,授权的方法,和拒绝的方法 */public interface PermissionListener {    void onGranted();    void onDenied(List<String> deniedPermission);}
public class Main2Activity extends AppCompatActivity implements View.OnClickListener {    private Button finish;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main2);        initView();    }    //点击-请求录音的权限(这里引用布局的onClick(lu)点击方法)    public void luyin(View view) {        requestRuntimePermission(new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionListener() {            @Override            public void onGranted() {                //授权的操作                Toast.makeText(Main2Activity.this, "录音权限-已经授权", Toast.LENGTH_SHORT).show();            }            @Override            public void onDenied(List<String> deniedPermission) {                for (String permission : deniedPermission) {                    //未授权的操作                    Toast.makeText(Main2Activity.this, "录音权限-未经授权", Toast.LENGTH_SHORT).show();                }            }        });    }    private void initView() {        finish = (Button) findViewById(R.id.finish);        //这里使用监听点击事件的方法,激活点击事件        finish.setOnClickListener(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            //返回上一页-杀死当前Activity            case R.id.finish:                finish();                break;        }    }}

点击此处,下载Demo;


权限区分列表:

正常权限 (Normal Permissions) 在API 23中,下面权限被定义为正常权限 关于Markdown 简介Markdown,Markdown的优缺点 ACCESS_LOCATION_EXTRA_COMMANDS ACCESS_NETWORK_STATE ACCESS_NOTIFICATION_POLICY ACCESS_WIFI_STATE BLUETOOTH BLUETOOTH_ADMIN BROADCAST_STICKY CHANGE_NETWORK_STATE CHANGE_WIFI_MULTICAST_STATE CHANGE_WIFI_STATE DISABLE_KEYGUARD EXPAND_STATUS_BAR GET_PACKAGE_SIZE INSTALL_SHORTCUT INTERNET KILL_BACKGROUND_PROCESSES MODIFY_AUDIO_SETTINGS NFC READ_SYNC_SETTINGS READ_SYNC_STATS RECEIVE_BOOT_COMPLETED REORDER_TASKS REQUEST_IGNORE_BATTERY_OPTIMIZATIONS REQUEST_INSTALL_PACKAGES SET_ALARM SET_TIME_ZONE SET_WALLPAPER SET_WALLPAPER_HINTS TRANSMIT_IR UNINSTALL_SHORTCUT USE_FINGERPRINT VIBRATE WAKE_LOCK WRITE_SYNC_SETTINGS
敏感权限 (Dangerous permissions) Permission Group Permissions CALENDAR READ_CALENDAR, WRITE_CALENDAR CAMERA CAMERA CONTACTS READ_CONTACTS ,WRITE_CONTACTS, GET_ACCOUNTS LOCATION ACCESS_FINE_LOCATION , ACCESS_COARSE_LOCATION MICROPHONE RECORD_AUDIO PHONE READ_PHONE_STATE, CALL_PHONE READ_CALL_LOG , WRITE_CALL_LOG , ADD_VOICEMAIL , USE_SIP, PROCESS_OUTGOING_CALLS SENSORS BODY_SENSORS SMS SEND_SMS RECEIVE_SMS , READ_SMS RECEIVE_WAP_PUSH , RECEIVE_MMS STORAGE READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE

点击此处,下载Demo;

1 0
原创粉丝点击