现在基于信息安全问题,特别是版本是23以上权限越严格。
特别是拍照,读,写权限
一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者启动页直接询问,不允许的就用不了1、下面给出封装好的类,至于什么时候调看项目需要
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,@StringRes int positivebutton,@StringRes int negativebutton,final String... perms) { checkCallingObjectSuitability(object); boolean shouldShowRationale = false; for (String perm : perms) { shouldShowRationale = shouldShowRationale || shouldShowRequestPermissionRationale(object,perm); } if (shouldShowRationale) { //d框询问 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,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,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,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):(方法调用的时机随你)
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.WRITE_EXTERNAL_STORAGE); }}
3、拒绝和允许做的 *** 作(activity或fragment):
@OverrIDepublic voID onPermissionsGranted(List<String> List) { //允许 getPhotos();}@OverrIDepublic voID onPermissionsDenIEd(List<String> List) { //拒绝 mTvEmptyVIEw.setText(R.string.permissions_denIEd_tips); //mIvTakePhoto.setVisibility(VIEw.GONE);}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:Android 在程序运行时申请权限的实例讲解Android 中的危险权限详细整理详解Android运行时权限及APP适配方法 总结以上是内存溢出为你收集整理的android开发权限询问的示例代码全部内容,希望文章能够帮你解决android开发权限询问的示例代码所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)