一:
package com.vitamio.dome;
/**
* 权限申请接口 再 Activity 中实现该接口
* 在 要申请权限的Activity 中实现此接口
*/
public interface PermissionInterface {
/**
* 可设置请求权限请求码
* 设置权限请求requestCode,只要不跟onRequestPermissionsResult方法中的其他请求码冲突即可。
* 可以自己创建一个 请求码的管理类,将项目中所有的请求码写在这个类中,做统一管理
*/
int getPermissionsRequestCode();
/**
* 设置需要请求的权限
*/
String[] getPermissions();
/**
* 请求权限成功回调
*/
void requestPermissionsSuccess();
/**
* 请求权限失败回调
*/
void requestPermissionsFail();
}
二:权限工具类,提取公共方法
package com.vitamio.dome;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import java.util.ArrayList;
/**
* 动态权限工具类
*/
public class PermissionUtil {
/**
* Main的权限请求返回码
*/
public static int mainPermissionCode = 1000;
/**
* 判断是否有某个权限
* @param context
* @param permission
* @return
*/
public static boolean hasPermission(Context context, String permission){
//Build.VERSION.SDK_INT :获取当前手机的 android 版本
//6.0以上才进行检测
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
return false;
}
}
return true;
}
/**
* 弹出对话框请求权限
* @param activity
* @param permissions
* @param requestCode
*/
public static void requestPermissions(Activity activity, String[] permissions, int requestCode){
//Build.VERSION.SDK_INT :获取当前手机的 android 版本
//6.0以上才进行请求
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
activity.requestPermissions(permissions, requestCode);
}
}
/**
* 返回缺失的权限
* @param context
* @param permissions
* @return 返回缺少的权限,null 意味着没有缺少权限
*/
public static String[] getDeniedPermissions(Context context, String[] permissions){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ArrayList<String> deniedPermissionList = new ArrayList<>();
for(String permission : permissions){
if(context.checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){
deniedPermissionList.add(permission);
}
}
int size = deniedPermissionList.size();
if(size > 0){
return deniedPermissionList.toArray(new String[deniedPermissionList.size()]);
}
}
return null;
}
}
三:权限被拒绝后打开权限设置工具类
package com.vitamio.dome;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
/**
* 打开权限设置界面
*/
public class PermissionPageUtils {
private final String TAG = "PermissionPageManager";
private Context mContext;
//自己的项目包名
private String packageName="com.vitamio.dome";
public PermissionPageUtils(Context context) {
this.mContext = context;
}
/**
* 进入权限设置界面
*/
public void OpenPermissionPage() {
String name = Build.MANUFACTURER;
Log.e(TAG, "jumpPermissionPage --- name : " + name);
switch (name) {
case "HUAWEI":
goHuaWeiMainager();
break;
case "vivo":
goVivoMainager();
break;
case "OPPO":
goOppoMainager();
break;
case "Coolpad":
goCoolpadMainager();
break;
case "Meizu":
goMeizuMainager();
break;
case "Xiaomi":
goXiaoMiMainager();
break;
case "samsung":
goSangXinMainager();
break;
case "Sony":
goSonyMainager();
break;
case "LG":
goLGMainager();
break;
default:
goIntentSetting();
break;
}
}
private void goLGMainager(){
try {
Intent intent = new Intent(packageName);
ComponentName comp = new ComponentName("com.android.settings", "com.android.settings.Settings$AccessLockSummaryActivity");
intent.setComponent(comp);
mContext.startActivity(intent);
} catch (Exception e) {
Toast.makeText(mContext, "跳转失败", Toast.LENGTH_LONG).show();
e.printStackTrace();
goIntentSetting();
}
}
private void goSonyMainager(){
try {
Intent intent = new Intent(packageName);
ComponentName comp = new ComponentName("com.sonymobile.cta", "com.sonymobile.cta.SomcCTAMainActivity");
intent.setComponent(comp);
mContext.startActivity(intent);
} catch (Exception e) {
Toast.makeText(mContext, "跳转失败", Toast.LENGTH_LONG).show();
e.printStackTrace();
goIntentSetting();
}
}
private void goHuaWeiMainager() {
try {
Intent intent = new Intent(packageName);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
ComponentName comp = new ComponentName("com.huawei.systemmanager", "com.huawei.permissionmanager.ui.MainActivity");
intent.setComponent(comp);
mContext.startActivity(intent);
} catch (Exception e) {
Toast.makeText(mContext, "跳转失败", Toast.LENGTH_LONG).show();
e.printStackTrace();
goIntentSetting();
}
}
private static String getMiuiVersion() {
String propName = "ro.miui.ui.version.name";
String line;
BufferedReader input = null;
try {
Process p = Runtime.getRuntime().exec("getprop " + propName);
input = new BufferedReader(
new InputStreamReader(p.getInputStream()), 1024);
line = input.readLine();
input.close();
} catch (IOException ex) {
ex.printStackTrace();
return null;
} finally {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return line;
}
private void goXiaoMiMainager() {
String rom = getMiuiVersion();
Log.e(TAG,"goMiaoMiMainager --- rom : "+rom);
Intent intent=new Intent();
if ("V6".equals(rom) || "V7".equals(rom)) {
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", packageName);
} else if ("V8".equals(rom) || "V9".equals(rom)) {
intent.setAction("miui.intent.action.APP_PERM_EDITOR");
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
intent.putExtra("extra_pkgname", packageName);
} else {
goIntentSetting();
}
mContext.startActivity(intent);
}
private void goMeizuMainager() {
try {
Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("packageName", packageName);
mContext.startActivity(intent);
} catch (ActivityNotFoundException localActivityNotFoundException) {
localActivityNotFoundException.printStackTrace();
goIntentSetting();
}
}
private void goSangXinMainager() {
//三星4.3可以直接跳转
goIntentSetting();
}
private void goIntentSetting() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", mContext.getPackageName(), null);
intent.setData(uri);
try {
mContext.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
private void goOppoMainager() {
doStartApplicationWithPackageName("com.coloros.safecenter");
}
/**
* doStartApplicationWithPackageName("com.yulong.android.security:remote")
* 和Intent open = getPackageManager().getLaunchIntentForPackage("com.yulong.android.security:remote");
* startActivity(open);
* 本质上没有什么区别,通过Intent open...打开比调用doStartApplicationWithPackageName方法更快,也是android本身提供的方法
*/
private void goCoolpadMainager() {
doStartApplicationWithPackageName("com.yulong.android.security:remote");
/* Intent openQQ = getPackageManager().getLaunchIntentForPackage("com.yulong.android.security:remote");
startActivity(openQQ);*/
}
private void goVivoMainager() {
doStartApplicationWithPackageName("com.bairenkeji.icaller");
/* Intent openQQ = getPackageManager().getLaunchIntentForPackage("com.vivo.securedaemonservice");
startActivity(openQQ);*/
}
private void doStartApplicationWithPackageName(String packagename) {
// 通过包名获取此APP详细信息,包括Activities、services、versioncode、name等等
PackageInfo packageinfo = null;
try {
packageinfo = mContext.getPackageManager().getPackageInfo(packagename, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (packageinfo == null) {
return;
}
// 创建一个类别为CATEGORY_LAUNCHER的该包名的Intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageinfo.packageName);
// 通过getPackageManager()的queryIntentActivities方法遍历
List<ResolveInfo> resolveinfoList = mContext.getPackageManager()
.queryIntentActivities(resolveIntent, 0);
Log.e("PermissionPageManager", "resolveinfoList" + resolveinfoList.size());
for (int i = 0; i < resolveinfoList.size(); i++) {
Log.e("PermissionPageManager", resolveinfoList.get(i).activityInfo.packageName + resolveinfoList.get(i).activityInfo.name);
}
ResolveInfo resolveinfo = resolveinfoList.iterator().next();
if (resolveinfo != null) {
// packageName参数2 = 参数 packname
String packageName = resolveinfo.activityInfo.packageName;
// 这个就是我们要找的该APP的LAUNCHER的Activity[组织形式:packageName参数2.mainActivityname]
String className = resolveinfo.activityInfo.name;
// LAUNCHER Intent
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// 设置ComponentName参数1:packageName参数2:MainActivity路径
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
try {
mContext.startActivity(intent);
} catch (Exception e) {
goIntentSetting();
e.printStackTrace();
}
}
}
}
四:动态权限帮助类,在Activity中调用该类进行动态权限申请
package com.vitamio.dome;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
/**
* 动态权限帮助类,在Activity中调用该类进行动态权限申请
*/
public class PermissionHelper {
private Activity mActivity;
private PermissionInterface mPermissionInterface;
public PermissionHelper(@NonNull Activity activity, @NonNull PermissionInterface permissionInterface) {
mActivity = activity;
mPermissionInterface = permissionInterface;
}
/**
* 开始请求权限。
* 方法内部已经对Android M 或以上版本进行了判断,外部使用不再需要重复判断。
* 如果设备还不是M或以上版本,则也会回调到requestPermissionsSuccess方法。
*/
public void requestPermissions(){
String[] deniedPermissions = PermissionUtil.getDeniedPermissions(mActivity, mPermissionInterface.getPermissions());
if(deniedPermissions != null && deniedPermissions.length > 0){
//弹出申请全新框
PermissionUtil.requestPermissions(mActivity, deniedPermissions, mPermissionInterface.getPermissionsRequestCode());
}else{
mPermissionInterface.requestPermissionsSuccess();
}
}
/**
* 在Activity中的onRequestPermissionsResult中调用
* @param requestCode
* @param permissions
* @param grantResults
* @return true 代表对该requestCode感兴趣,并已经处理掉了。false 对该requestCode不感兴趣,不处理。
*/
public boolean requestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if(requestCode == mPermissionInterface.getPermissionsRequestCode()){
boolean isAllGranted = true;//是否全部权限已授权
for(int result : grantResults){
if(result == PackageManager.PERMISSION_DENIED){
isAllGranted = false;
break;
}
}
if(isAllGranted){
//已全部授权
mPermissionInterface.requestPermissionsSuccess();
}else{
//权限有缺失
mPermissionInterface.requestPermissionsFail();
}
return true;
}
return false;
}
}
五:调用,开始动态申请权限
package com.vitamio.dome;
import android.Manifest;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import io.vov.vitamio.MediaPlayer;
import io.vov.vitamio.Vitamio;
import io.vov.vitamio.utils.Log;
import io.vov.vitamio.widget.MediaController;
import io.vov.vitamio.widget.VideoView;
//实现 PermissionInterface 权限请求接口
public class MainActivity extends AppCompatActivity implements PermissionInterface {
//动态获取权限工具类
private PermissionHelper permissionHelper = null;
//打开权限设置工具类
private PermissionPageUtils permissionPageUtils = null;
//直播 rtmp 流视频
private VideoView vitamio_videoview;
private String path;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Vitamio.isInitialized(getApplicationContext());
permissionHelper = new PermissionHelper(this, this);
permissionPageUtils = new PermissionPageUtils(this.getApplicationContext());
setContentView(R.layout.activity_main);
permissionHelper.requestPermissions();
}
//onRequestPermissionsResult
//权限申请回调
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
permissionHelper.requestPermissionsResult(requestCode, permissions, grantResults);
}
/**
* 设置播放视频
*/
private void settingVoide() {
vitamio_videoview = findViewById(R.id.vitamio_videoview);
path = "rtmp://202.69.69.180:443/webcast/bshdlive-pc";
//放入地址
vitamio_videoview.setVideoPath(path);
//设置控制栏
vitamio_videoview.setMediaController(new MediaController(this));
//获取焦点
vitamio_videoview.requestFocus();
//准备播放监听
vitamio_videoview.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.setPlaybackSpeed(1.0f);//设置播放速度
}
});
}
//设置申请权限请求返回码
@Override
public int getPermissionsRequestCode() {
return PermissionUtil.mainPermissionCode;
}
//设置要申请的权限
@Override
public String[] getPermissions() {
return new String[]{
//读取设备外部存储空间权限
Manifest.permission.READ_EXTERNAL_STORAGE
};
}
//获取权限成功执行的方法
@Override
public void requestPermissionsSuccess() {
settingVoide();
}
//获取权限失败执行的方法
@Override
public void requestPermissionsFail() {
//android.permission.READ_EXTERNAL_STORAGE
String[] permissionAry = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};
//获取被拒绝的权限
String[] juPermission = PermissionUtil.getDeniedPermissions(this, permissionAry);
//打开权限设置
permissionPageUtils.OpenPermissionPage();
}
}