/**
|
*
|
*/
|
package com.hdl.hdllinphonesdk.activity;
|
|
import android.Manifest;
|
import android.app.Activity;
|
import android.content.Intent;
|
import android.content.pm.PackageManager;
|
import android.net.Uri;
|
import android.os.Build;
|
import android.os.Bundle;
|
import android.provider.Settings;
|
import android.view.KeyEvent;
|
|
import com.jaeger.library.StatusBarUtil;
|
|
import java.lang.reflect.Method;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* 继承了Activity,实现Android6.0的运行时权限检测
|
* 需要进行运行时权限检测的Activity可以继承这个类
|
* @文件名称:PermissionsChecker.java
|
* @类型名称:PermissionsChecker
|
* @since 2.5.0
|
*/
|
public class LPCheckPermissionsActivity extends Activity {
|
//是否需要检测后台定位权限,设置为true时,如果用户没有给予后台定位权限会弹窗提示
|
private boolean needCheckBackLocation = false;
|
//如果设置了target > 28,需要增加这个权限,否则不会弹出"始终允许"这个选择框
|
private static String BACKGROUND_LOCATION_PERMISSION = "android.permission.ACCESS_BACKGROUND_LOCATION";
|
/**
|
* 需要进行检测的权限数组
|
*/
|
protected String[] needPermissions = {
|
Manifest.permission.WAKE_LOCK,
|
Manifest.permission.RECORD_AUDIO,
|
Manifest.permission.MODIFY_AUDIO_SETTINGS,
|
Manifest.permission.CAMERA
|
};
|
|
public static final int PERMISSON_REQUESTCODE = 0;
|
|
@Override
|
protected void onCreate(Bundle savedInstanceState) {
|
super.onCreate(savedInstanceState);
|
if(Build.VERSION.SDK_INT > 28
|
&& getApplicationContext().getApplicationInfo().targetSdkVersion > 28) {
|
needPermissions = new String[] {
|
Manifest.permission.WAKE_LOCK,
|
Manifest.permission.RECORD_AUDIO,
|
Manifest.permission.MODIFY_AUDIO_SETTINGS,
|
Manifest.permission.CAMERA
|
};
|
}
|
setStatusBarTranslucent();
|
}
|
|
/**
|
* 判断是否需要检测,防止不停的弹框
|
*/
|
public boolean isNeedCheck = true;
|
public boolean havaPermissions = false;
|
|
@Override
|
protected void onResume() {
|
super.onResume();
|
if (Build.VERSION.SDK_INT >= 23
|
&& getApplicationInfo().targetSdkVersion >= 23) {
|
if (isNeedCheck) {
|
checkPermissions(needPermissions);
|
}
|
}else {
|
|
havaPermissions = true;
|
}
|
}
|
|
/**
|
*
|
* @param permissions
|
* @since 2.5.0
|
*
|
*/
|
private void checkPermissions(String... permissions) {
|
try {
|
if (Build.VERSION.SDK_INT >= 23
|
&& getApplicationInfo().targetSdkVersion >= 23) {
|
List<String> needRequestPermissonList = findDeniedPermissions(permissions);
|
if (null != needRequestPermissonList
|
&& needRequestPermissonList.size() > 0) {
|
String[] array = needRequestPermissonList.toArray(new String[needRequestPermissonList.size()]);
|
Method method = getClass().getMethod("requestPermissions", new Class[]{String[].class,
|
int.class});
|
|
method.invoke(this, array, PERMISSON_REQUESTCODE);
|
}else {
|
havaPermissions = true;
|
}
|
}
|
} catch (Throwable e) {
|
}
|
}
|
|
/**
|
* 获取权限集中需要申请权限的列表
|
*
|
* @param permissions
|
* @return
|
* @since 2.5.0
|
*
|
*/
|
private List<String> findDeniedPermissions(String[] permissions) {
|
List<String> needRequestPermissonList = new ArrayList<String>();
|
if (Build.VERSION.SDK_INT >= 23
|
&& getApplicationInfo().targetSdkVersion >= 23){
|
try {
|
for (String perm : permissions) {
|
Method checkSelfMethod = getClass().getMethod("checkSelfPermission", String.class);
|
Method shouldShowRequestPermissionRationaleMethod = getClass().getMethod("shouldShowRequestPermissionRationale",
|
String.class);
|
if ((Integer)checkSelfMethod.invoke(this, perm) != PackageManager.PERMISSION_GRANTED
|
|| (Boolean)shouldShowRequestPermissionRationaleMethod.invoke(this, perm)) {
|
if(!needCheckBackLocation
|
&& BACKGROUND_LOCATION_PERMISSION.equals(perm)) {
|
continue;
|
}
|
needRequestPermissonList.add(perm);
|
}
|
}
|
} catch (Throwable e) {
|
|
}
|
}
|
return needRequestPermissonList;
|
}
|
|
/**
|
* 检测是否所有的权限都已经授权
|
* @param grantResults
|
* @return
|
* @since 2.5.0
|
*
|
*/
|
public boolean verifyPermissions(int[] grantResults) {
|
for (int result : grantResults) {
|
if (result != PackageManager.PERMISSION_GRANTED) {
|
return false;
|
}
|
}
|
return true;
|
}
|
|
/**
|
* 启动应用的设置
|
*
|
* @since 2.5.0
|
*
|
*/
|
private void startAppSettings() {
|
Intent intent = new Intent(
|
Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
intent.setData(Uri.parse("package:" + getPackageName()));
|
startActivity(intent);
|
}
|
|
@Override
|
public boolean onKeyDown(int keyCode, KeyEvent event) {
|
if(keyCode == KeyEvent.KEYCODE_BACK){
|
this.finish();
|
return true;
|
}
|
return super.onKeyDown(keyCode, event);
|
}
|
|
|
public interface RequestPermissionsListener {
|
/**
|
* 授权成功
|
*/
|
void onSuccess();
|
}
|
|
private RequestPermissionsListener mRequestPermissionsListener;
|
|
public void setRequestPermissionsListener(RequestPermissionsListener mRequestPermissionsListener) {
|
mRequestPermissionsListener = mRequestPermissionsListener;
|
}
|
|
// 将StatusBar设置为透明
|
public void setStatusBarTranslucent() {
|
StatusBarUtil.setTranslucentForImageViewInFragment(this,
|
0, null);
|
StatusBarUtil.setLightMode(this);
|
}
|
}
|