一. PermissionUtil 申请权限工具类
没有处理的问题:
1.将请求码和Callback放到Map中,不会被覆盖
2.没有处理用户点击权限不再询问时,做出相应的提示
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class PermissionUtil {
private Activity mActivity;
private int mReqCode;//请求码
private CallBack mCallBack;
public static interface CallBack {
void grandAll();//所有必要权限已经申请了,可以跳到主界面
void denied();//存在没有获取的权限,则直接退出程序
}
public PermissionUtil(Activity activity) {
mActivity = activity;
}
/**
* 申请权限的方法
*
* @param needPermissions
* @param reqCode
* @param callBack
*/
@RequiresApi(api = Build.VERSION_CODES.M)
public void request(List<String> needPermissions, int reqCode, CallBack callBack) {
if (mActivity == null) {
throw new IllegalArgumentException("activity is null");
}
//如果机器sdk小于23不需要动态获取权限
if (Build.VERSION.SDK_INT < 23) {
callBack.grandAll();//默认全部权限已经授予
return;
}
mReqCode = reqCode;
mCallBack = callBack;
//存放仍需要获取的权限
List<String> reqPermissions = new ArrayList<>();
for (String permission : needPermissions) {
Log.e("TAG", needPermissions + "0");
if (mActivity.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
//如果权限还没被获取,则添加进来
reqPermissions.add(permission);
Log.d("TAG", reqPermissions + "1");
}
}
//如果存放仍需要获取的权限为空,则意味着所有权限都被授予了
if (reqPermissions.isEmpty()) {
callBack.grandAll();
Log.d("TAG", reqPermissions + "2");
return;
}
//如果不为空,要将这个需要请求的权限,提示授予
mActivity.requestPermissions(reqPermissions.toArray(new String[]{}), reqCode);
}
/**
* 处理权限后返回的回调
* 1.当用户执行完获取权限的操作后的回调
* 提示它还有哪些权限没有被获取
*/
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == mReqCode) {
boolean grantAll = true;
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
grantAll = false;
Toast.makeText(mActivity, permissions[i] + "未授权", Toast.LENGTH_SHORT).show();
break;
}
}
if (grantAll) {//如果全部都授权了
mCallBack.grandAll();
} else {
mCallBack.denied();
}
}
}
}
二、闪屏页的权限判断,授予了所有必要权限才会跳转到主界面
SplashActivity.java
import android.Manifest;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
/**
* 动态申请权限的界面
* 1.放在第一个启动的界面(在AndroidManifest.xml中配置)
*/
public class SplashActivity extends AppCompatActivity {
//定义所有需要申请的权限
public static List<String> sNeedReqPermissions = new ArrayList<>();
private PermissionUtil mPermissionUtil;
static {
//静态代码块中添加权限
sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE);
sNeedReqPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
sNeedReqPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
sNeedReqPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
sNeedReqPermissions.add(Manifest.permission.ACCESS_WIFI_STATE);
sNeedReqPermissions.add(Manifest.permission.READ_PHONE_STATE);
sNeedReqPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE);
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPermissionUtil = new PermissionUtil(this);
mPermissionUtil.request(sNeedReqPermissions, 100, new PermissionUtil.CallBack() {
@Override
public void grandAll() {
toMainActivity();
finish();
}
@Override
public void denied() {
finish();//直接finish
}
});
}
//跳转到第二个节目
private void toMainActivity() {
startActivity(new Intent(this, BaiduMapActivity.class));
}
/**
* 用来返回给申请工具类来做具体回调
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
mPermissionUtil.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}