操蛋的Vivo 权限自动返回授权 这你们都懂的不懂的戳下面
现在来说说如何破?网上好多垃圾资源 我这里提供一条 适配 vivo 6.0的方案 直接上代码
/**
* Created by Fashionaly on 2018/7/13.
*/
public class PermissionUtil {
private Context mContext;
private PermissionUtil() {
}
public static PermissionUtil getInstance() {
return PermissionUtilHolder.sInstance;
}
public PermissionUtil with(Context context) {
mContext = context.getApplicationContext();
return PermissionUtilHolder.sInstance;
}
private static class PermissionUtilHolder {
private static final PermissionUtil sInstance = new PermissionUtil();
}
public boolean TestPermission() {
try {
if (!isCameraCanUse()) {
return false;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!isHasCameraPermission()) {
return false;
}
}
if (!isHasRecordPermission(mContext)) {
return false;
}
} catch (Exception ex) {
return false;
}
return true;
}
public static boolean isCameraCanUse() {
boolean canUse = true;
Camera mCamera = null;
try {
mCamera = Camera.open();
// setParameters 是针对魅族MX5 做的。MX5 通过Camera.open() 拿到的Camera
// 对象不为null
Camera.Parameters mParameters = mCamera.getParameters();
mCamera.setParameters(mParameters);
} catch (Exception e) {
canUse = false;
}
if (mCamera != null) {
mCamera.release();
}
return canUse;
}
public static boolean isHasCameraPermission() {
Field fieldPassword = null;
try {
Camera camera = Camera.open();
fieldPassword = camera.getClass().getDeclaredField("mHasPermission");
fieldPassword.setAccessible(true);
Boolean result = (Boolean) fieldPassword.get(camera);
return result;
} catch (Exception e) {
e.printStackTrace();
return true;
}
}
/**
* 判断是是否有录音权限
*/
public static boolean isHasRecordPermission(final Context context) {
// 音频获取源
int audioSource = MediaRecorder.AudioSource.MIC;
// 设置音频采样率,44100是目前的标准,但是某些设备仍然支持22050,16000,11025
int sampleRateInHz = 44100;
// 设置音频的录制的声道CHANNEL_IN_STEREO为双声道,CHANNEL_CONFIGURATION_MONO为单声道
int channelConfig = AudioFormat.CHANNEL_IN_STEREO;
// 音频数据格式:PCM 16位每个样本。保证设备支持。PCM 8位每个样本。不一定能得到设备支持。
int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
// 缓冲区字节大小
int bufferSizeInBytes = 0;
bufferSizeInBytes = 0;
bufferSizeInBytes = AudioRecord.getMinBufferSize(sampleRateInHz,
channelConfig, audioFormat);
AudioRecord audioRecord = new AudioRecord(audioSource, sampleRateInHz,
channelConfig, audioFormat, bufferSizeInBytes);
//开始录制音频
try {
// 防止某些手机崩溃,例如联想
audioRecord.startRecording();
} catch (IllegalStateException e) {
e.printStackTrace();
}
/**
* 根据开始录音判断是否有录音权限
*/
if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
return false;
}
audioRecord.stop();
audioRecord.release();
audioRecord = null;
return true;
}
}
List<String> mPermissionList = new ArrayList<>();
String[] permissions = new String[]{Manifest.permission.RECORD_AUDIO,
Manifest.permission.CAMERA,
Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
};
private boolean getPermissionJudgeCanPass() {
mPermissionList.clear();
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(CloudVideoActivity.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(permissions[i]);
}
}
if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了
// Toast.makeText(CloudVideoActivity.this, "权限授权完毕", Toast.LENGTH_LONG).show();
return true;
} else {//请求权限方法
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(CloudVideoActivity.this, permissions, MY_PERMISSIONS_REQUEST_CALL_CAMERA);
return false;
}
}
最后调用
if (getPermissionJudgeCanPass()) {
try {
if (PermissionUtil.getInstance().with(this).TestPermission()) {
Intent intent = VideoRecordActivity.startRecordActivity(videoPath, CloudVideoActivity.this);
startActivityForResult(intent, BACK);
} else {
Toast.makeText(this, "为了程序正常运行请授权应用相关权限(存储、相机、麦克风)", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(this, "初始化拍摄失败", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "为了程序正常运行请授权应用相关权限(存储、相机、麦克风)", Toast.LENGTH_SHORT).show();
String[] permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(CloudVideoActivity.this, permissions, MY_PERMISSIONS_REQUEST_CALL_CAMERA);
}