在现在的安卓开发中,所有的APP都需要实现一个功能,那就是权限的获取。在Android的6.0版本以上一些涉及到隐私的权限在安装时不会主动给予,而是需要我们在代码中去手动获取所需要的权限。之前自己也在网上搜索过一些文章,要么是帮助不大,要么是达到的目的不完整,从而导致一脑门汗呐,所以我自己在摸索了一阵之后,参考部分文章,结合自己的一些思路,完成了一个大致还算完整的demo,供大家参考。有问题还望大家指正出来,感激不尽。。
先给大家看下效果图吧
其实呢,实现过程很简单,只有一个权限获取的管理类去操作就好
管理类如下:
package cctx.love.android.permissionutils;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
/**
* 权限管理控制页面
* @author CC
*/
public class CCpermission extends Activity {
//权限默认请求个数
public static final int PERMISSION_SIZE = 0;
//权限默认请求个数
public static final int PERMISSION_REQUEST_CODE = 321;
//上下文
private Activity activity;
//权限集合
private String[] permissions;
//静态参数
public static CCpermission mInstance;
/**
* 有参构造方法
* @param activity
* @param permissions
*/
public CCpermission(Activity activity, String[] permissions){
Log.i(activity + "", "CCpermission");
this.activity = activity;
this.permissions = permissions;
}
/**
* 实例化当前对象
* @return
*/
public static CCpermission getmInstance(Activity activity, String[] permissions){
//提升效率。防止重复创建
if(mInstance == null){
//加锁
synchronized (CCpermission.class){
//实例化对象
if(mInstance == null)
mInstance = new CCpermission(activity, permissions);
}
}
return mInstance;
}
/**
* checkpermission
* true==尚未获取
* false==已获取
* @param activity
* @param permissions
*/
public static boolean check_permission(Activity activity, String[] permissions){
if(permissions.length == PERMISSION_SIZE)
return false;
// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for(int i = 0; i < permissions.length; i++){
// 检查该权限是否已经获取
int j = ContextCompat.checkSelfPermission(activity, permissions[i]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (j != PackageManager.PERMISSION_GRANTED) {
start_permission(activity, permissions);
}else{
start_permission(activity, permissions);
}
}
}
return false;
}
/**
* requestpermission
* @param activity
* @param permissions
*/
public static void start_permission(Activity activity, String[] permissions){
if(permissions.length == PERMISSION_SIZE)
return;
//请求权限
ActivityCompat.requestPermissions(activity, permissions, PERMISSION_REQUEST_CODE);
}
}
注:这个里面了有两个主要方法,一个是判断当前权限是否已经获取,一个是获取当前权限。
在activity中调用也很简单,通过getmInstance方法去获取当前对象,再去调用下面的方法就好
activity.class如下
package cctx.love.android.permission;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import cctx.love.android.permissionutils.CCpermission;
public class MainActivity extends AppCompatActivity {
// 要申请的权限
private String[] permissions = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.ACCESS_COARSE_LOCATION
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CCpermission.getmInstance(MainActivity.this, permissions).check_permission(MainActivity.this, permissions);
}
});
}
/**
* 权限回调
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//PERMISSION_REQUEST_CODE
if (requestCode == CCpermission.PERMISSION_REQUEST_CODE) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
} else if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
// 判断用户是否点击了不再提醒。(检测该权限是否还可以申请)
boolean b = shouldShowRequestPermissionRationale(permissions[i]);
if (!b) {
// 提示用户去应用设置界面手动开启权限
Toast.makeText(this, "权限拒绝,并已勾选不再提示,请手动开启", Toast.LENGTH_SHORT).show();
} else {
// 提示用户去应用设置界面手动开启权限
Toast.makeText(this, "权限拒绝,请手动开启", Toast.LENGTH_SHORT).show();
}
}
}
}
}
}
}
注:onRequestPermissionsResult:权限回调方法。听过这个去进行后续操作。
总之,安卓6.0的权限对于安卓来说是一个比较大的提升,从用户层考虑,他通过这种隐私权限主动获取来降低用户数据的丢失,确保用户手机系统的安全性。也算是一个好的提升
具体代码工作还是看demo,通过运行demo和查看打印日志的方式对权限获取的步骤和操作方法会更加清晰。
最后附上demo:源码在这里
q:486789970
email:mr.cai_cai@foxmail.com