前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android开发权限询问的示例代码

android开发权限询问的示例代码

作者头像
砸漏
发布2020-10-30 00:52:52
8890
发布2020-10-30 00:52:52
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

现在基于信息安全问题,特别是版本是23以上权限越严格。

特别是拍照,读,写权限

一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者启动页直接询问,不允许的就用不了1、下面给出封装好的类,至于什么时候调看项目需要

代码语言:javascript
复制
public class EasyPermissions {
private static final String TAG = "EasyPermissions";
public interface PermissionCallbacks extends
ActivityCompat.OnRequestPermissionsResultCallback {
void onPermissionsGranted(List<String  perms);
void onPermissionsDenied(List<String  perms);
}
/**
* Check if the calling context has a set of permissions.
*
* @param context the calling context.
* @param perms  one ore more permissions, such as {@code android.Manifest.permission.CAMERA}.
* @return true if all permissions are already granted, false if at least one permission
* is not yet granted.
*/
public static boolean hasPermissions(Context context, String... perms) {
for (String perm : perms) {
boolean hasPerm = (ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_GRANTED);
if (!hasPerm) {
return false;
}
}
return true;
}
/**
* Request a set of permissions, showing rationale if the system requests it.
*
* @param object   Activity or Fragment requesting permissions. Should implement
*          {@link ActivityCompat.OnRequestPermissionsResultCallback}
*          or
*          {@link android.support.v13.app.FragmentCompat.OnRequestPermissionsResultCallback}
* @param rationale  a message explaining why the application needs this set of permissions, will
*          be displayed if the user rejects the request the first time.
* @param requestCode request code to track this request, must be < 256.
* @param perms    a set of permissions to be requested.
*/
public static void requestPermissions(final Object object, String rationale,
final int requestCode, final String... perms) {
requestPermissions(object, rationale,
android.R.string.ok,
android.R.string.cancel,
requestCode, perms);
}
/**
* Request a set of permissions, showing rationale if the system requests it.
*
* @param object     Activity or Fragment requesting permissions. Should implement
*            {@link ActivityCompat.OnRequestPermissionsResultCallback}
*            or
*            {@link android.support.v13.app.FragmentCompat.OnRequestPermissionsResultCallback}
* @param rationale   a message explaining why the application needs this set of permissions, will
*            be displayed if the user rejects the request the first time.
* @param positiveButton custom text for positive button
* @param negativeButton custom text for negative button
* @param requestCode  request code to track this request, must be < 256.
* @param perms     a set of permissions to be requested.
*/
public static void requestPermissions(final Object object, String rationale,
@StringRes int positiveButton,
@StringRes int negativeButton,
final int requestCode, final String... perms) {
checkCallingObjectSuitability(object);
boolean shouldShowRationale = false;
for (String perm : perms) {
shouldShowRationale = shouldShowRationale || shouldShowRequestPermissionRationale(object, perm);
}
if (shouldShowRationale) {
//弹框询问
AlertDialog dialog = new AlertDialog.Builder(getActivity(object))
.setMessage(rationale)
.setPositiveButton(positiveButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
executePermissionsRequest(object, perms, requestCode);
}
})
.setNegativeButton(negativeButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do nothing, user does not want to request
PermissionCallbacks callbacks = (PermissionCallbacks) object;
if(callbacks != null) {
callbacks.onPermissionsDenied(new ArrayList<String ());
}
}
}).create();
dialog.show();
} else {
executePermissionsRequest(object, perms, requestCode);
}
}
/**
* Handle the result of a permission request, should be called from the calling Activity's
* {@link ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int, String[], int[])}
* method.
* <p/ 
* If any permissions were granted or denied, the Activity will receive the appropriate
* callbacks through {@link PermissionCallbacks} and methods annotated with
* {@link AfterPermissionGranted} will be run if appropriate.
*
* @param requestCode requestCode argument to permission result callback.
* @param permissions permissions argument to permission result callback.
* @param grantResults grantResults argument to permission result callback.
* @param object    the calling Activity or Fragment.
* @throws IllegalArgumentException if the calling Activity does not implement
*                 {@link PermissionCallbacks}.
*/
public static void onRequestPermissionsResult(int requestCode, String[] permissions,
int[] grantResults, Object object) {
checkCallingObjectSuitability(object);
PermissionCallbacks callbacks = (PermissionCallbacks) object;
// Make a collection of granted and denied permissions from the request.
ArrayList<String  granted = new ArrayList< ();
ArrayList<String  denied = new ArrayList< ();
for (int i = 0; i < permissions.length; i++) {
String perm = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
granted.add(perm);
} else {
denied.add(perm);
}
}
// Report granted permissions, if any.
if (!granted.isEmpty()) {
// Notify callbacks
callbacks.onPermissionsGranted(granted);
}
// Report denied permissions, if any.
if (!denied.isEmpty()) {
callbacks.onPermissionsDenied(denied);
}
// If 100% successful, call annotated methods
if (!granted.isEmpty() && denied.isEmpty()) {
runAnnotatedMethods(object, requestCode);
}
}
private static boolean shouldShowRequestPermissionRationale(Object object, String perm) {
if (object instanceof Activity) {
return ActivityCompat.shouldShowRequestPermissionRationale((Activity) object, perm);
} else if (object instanceof Fragment) {
return ((Fragment) object).shouldShowRequestPermissionRationale(perm);
} else {
return false;
}
}
private static void executePermissionsRequest(Object object, String[] perms, int requestCode) {
checkCallingObjectSuitability(object);
if (object instanceof Activity) {
ActivityCompat.requestPermissions((Activity) object, perms, requestCode);
} else if (object instanceof Fragment) {
((Fragment) object).requestPermissions(perms, requestCode);
}
}
private static Activity getActivity(Object object) {
if (object instanceof Activity) {
return ((Activity) object);
} else if (object instanceof Fragment) {
return ((Fragment) object).getActivity();
} else {
return null;
}
}
private static void runAnnotatedMethods(Object object, int requestCode) {
Class clazz = object.getClass();
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(AfterPermissionGranted.class)) {
// Check for annotated methods with matching request code.
AfterPermissionGranted ann = method.getAnnotation(AfterPermissionGranted.class);
if (ann.value() == requestCode) {
// Method must be void so that we can invoke it
if (method.getParameterTypes().length   0) {
throw new RuntimeException("Cannot execute non-void method " + method.getName());
}
try {
// Make method accessible if private
if (!method.isAccessible()) {
method.setAccessible(true);
}
method.invoke(object);
} catch (IllegalAccessException e) {
ILogger.e(TAG, "runDefaultMethod:IllegalAccessException", e);
} catch (InvocationTargetException e) {
ILogger.e(TAG, "runDefaultMethod:InvocationTargetException", e);
}
}
}
}
}
private static void checkCallingObjectSuitability(Object object) {
// Make sure Object is an Activity or Fragment
if (!((object instanceof Fragment) || (object instanceof Activity))) {
throw new IllegalArgumentException("Caller must be an Activity or a Fragment.");
}
// Make sure Object implements callbacks
if (!(object instanceof PermissionCallbacks)) {
throw new IllegalArgumentException("Caller must implement PermissionCallbacks.");
}
}}

注:这个类不是我写的,分享给大家

2、调用示例(activity或fragment):(方法调用的时机随你)

代码语言:javascript
复制
private void requestGalleryPermission() {
//权限参数可以添加很多,不固定参数的
if (EasyPermissions.hasPermissions(this, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
getPhotos();//如果具有权限做的操作
} else {
// Ask for one permission
EasyPermissions.requestPermissions(this, getString(R.string.permissions_tips_gallery),
GalleryFinal.PERMISSIONS_CODE_GALLERY, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
}

3、拒绝和允许做的操作(activity或fragment):

代码语言:javascript
复制
@Override
public void onPermissionsGranted(List<String  list) {
//允许
getPhotos();
}
@Override
public void onPermissionsDenied(List<String  list) {
//拒绝
mTvEmptyView.setText(R.string.permissions_denied_tips);
//mIvTakePhoto.setVisibility(View.GONE);
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com