一些常用的工具类(不定期更新)

CommonUtils工具类,主要包含子布局的禁用与选择,时间与时间戳之间的互转,获取资源文件

package com.kjplusapp.utils;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;

import com.kjplusapp.app.BaseApplication;
import com.kjplusapp.view.ItemListViewPatient;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import static android.content.ContentValues.TAG;

/**
 * @author xiaoyao
 * @time 2017/12/5 18:18
 * @classname CommonUtils
 * @desc 工具类
 * 1. 判断是否为手机号
 * 2. dip--> px
 * 3. px --> dip
 * 4. px --> sp
 * 5. sp --> px
 * 6. 获取Resource对象
 * 7.获取Drawable资源
 * 8.获取字符串资源
 * 9.获取color资源
 * 10.获取dimens资源
 * 11.获取字符串数组资源
 * 12.禁用子布局中的所有控件
 * 13.启用子布局中的所有控件
 * 14.字符串转时间戳
 * 15.时间戳转字符串
 */
public class CommonUtils {
    
    /***
     * 判断是否为手机号码
     *
     */
    
    public static boolean isMobileNum(String mobiles) {
        return mobiles.matches("^(13|15|18)\\d{9}$");
    }
    
    /**
     * 设置背景颜色
     */
    public static void setBgColor(View v, int bgColorValue) {
        if (v instanceof TextView) {
            ((TextView) v).setBackgroundColor(bgColorValue);
        } else if (v instanceof EditText) {
            ((EditText) v).setBackgroundColor(bgColorValue);
        } else if (v instanceof Button) {
            ((Button) v).setBackgroundColor(bgColorValue);
        } else {
            int vChildCount = ((ViewGroup) v).getChildCount();
            for (int i = 0; i < vChildCount; i++) {
                View v1 = ((ViewGroup) v).getChildAt(i);
                setBgColor(v1, bgColorValue);
            }
        }
    }
    
    /**
     * dip转化成px
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    
    /**
     * px转化成dip
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
    
    /**
     * px转化成sp
     */
    public static int px2sp(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }
    
    /**
     * sp转化成px
     */
    public static int sp2px(Context context, float spValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (spValue * scale + 0.5f);
    }
    
    /**
     * 获取Resource对象
     */
    public static Resources getResources() {
        return BaseApplication.getContext().getResources();
    }
    
    /**
     * 获取Drawable资源
     */
    public static Drawable getDrawable(int resId) {
        return getResources().getDrawable(resId);
    }
    
    /**
     * 获取字符串资源
     */
    public static String getString(int resId) {
        return getResources().getString(resId);
    }
    
    /**
     * 获取color资源
     */
    public static int getColor(int resId) {
        return getResources().getColor(resId);
    }
    
    /**
     * 获取dimens资源
     */
    public static float getDimens(int resId) {
        return getResources().getDimension(resId);
    }
    
    /**
     * 获取字符串数组资源
     */
    public static String[] getStringArray(int resId) {
        return getResources().getStringArray(resId);
    }
    
    /***
     *禁用子布局中的所有控件
     *
     */
    
    public static void disableSubControls(ViewGroup disableViewGroup) {
        for (int i = 0; i < disableViewGroup.getChildCount(); i++) {
            View disableView = disableViewGroup.getChildAt(i);
            if (disableView instanceof ViewGroup) {
                if (disableView instanceof Spinner) {
                    Spinner spinner = (Spinner) disableView;
                    spinner.setClickable(false);
                    spinner.setEnabled(false);
                    Log.i(TAG, "A Spinner is unabled");
                } else if (disableView instanceof ListView) {
                    ((ListView) disableView).setClickable(false);
                    ((ListView) disableView).setEnabled(false);
                    Log.i(TAG, "A ListView is unabled");
                } else if (disableView instanceof ItemListViewPatient) {
                    ((ItemListViewPatient) disableView).setClickable(false);
                    ((ItemListViewPatient) disableView).setEnabled(false);
                } else {
                    disableSubControls((ViewGroup) disableView);
                }
            } else if (disableView instanceof EditText) {
                ((EditText) disableView).setEnabled(false);
                ((EditText) disableView).setClickable(false);
                Log.i(TAG, "A EditText is unabled");
            } else if (disableView instanceof Button) {
                ((Button) disableView).setEnabled(false);
                Log.i(TAG, "A Button is unabled");
            } else if (disableView instanceof TextView) {
                ((TextView) disableView).setEnabled(false);
                ((TextView) disableView).setClickable(false);
                Log.i(TAG, "A TextView is unabled");
            }
        }
    }
    
    /***
     *启用子布局中的所有控件
     *
     */
    public static void enableSubControls(ViewGroup enableViewGroups) {
        for (int i = 0; i < enableViewGroups.getChildCount(); i++) {
            View enableView = enableViewGroups.getChildAt(i);
            if (enableView instanceof ViewGroup) {
                if (enableView instanceof Spinner) {
                    Spinner spinner = (Spinner) enableView;
                    spinner.setClickable(true);
                    spinner.setEnabled(true);
                    //Log.i(TAG, "A Spinner is abled");
                } else if (enableView instanceof ListView) {
                    ((ListView) enableView).setClickable(true);
                    ((ListView) enableView).setEnabled(true);
                    //Log.i(TAG, "A ListView is abled");
                } else if (enableView instanceof ItemListViewPatient) {
                    ((ItemListViewPatient) enableView).setClickable(true);
                    ((ItemListViewPatient) enableView).setEnabled(true);
                } else {
                    enableSubControls((ViewGroup) enableView);
                }
            } else if (enableView instanceof EditText) {
                ((EditText) enableView).setEnabled(true);
                ((EditText) enableView).setClickable(true);
                //Log.i(TAG, "A EditText is abled");
            } else if (enableView instanceof Button) {
                ((Button) enableView).setEnabled(true);
                //Log.i(TAG, "A Button is abled");
            } else if (enableView instanceof TextView) {
                ((TextView) enableView).setEnabled(true);
                ((TextView) enableView).setClickable(true);
                // Log.i(TAG, "A TextView is abled");
            }
        }
    }
    
    //字符串转时间戳
    public static String getTime(String timeString){
        String timeStamp = null;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
        Date d;
        try{
            d = sdf.parse(timeString);
            long l = d.getTime();
            timeStamp = String.valueOf(l);
        } catch(ParseException e){
            e.printStackTrace();
        }
        return timeStamp;
    }
    
    //时间戳转字符串
    public static String getStrTime(String timeStamp){
        String timeString = null;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm");
        long  l = Long.valueOf(timeStamp);
        timeString = sdf.format(new Date(l));//单位秒
        return timeString;
    }
}
FileUtils 获取文件的路径,检测SD是否可用
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;

import java.io.File;

/**
 * @author xiaoyao
 * @time 2017/12/5 18:22
 * @classname FilePathUtil
 * @desc 获取文件路径工具类
 * 1.检测当前设备SD是否可用
 * 2.获得SD卡根目录路径
 * 3.获得存储 录音文件的文件夹
 * 4.获得存储 下载而来的录音文件的文件夹
 * 5.获取此Uri的数据列的值
 * 6.Uri authority is ExternalStorageProvider外部存储提供商
 * 7.Uri authority is DownloadsProvider下载提供者
 * 8.Uri authority is MediaProvider媒体存储
 */
public class FilePathUtil {
    
    
    // 存放录音文件夹的名称
    static String AUDIO_RECORD = "/AudioRecord";
    // 存放下载而来的录音文件夹名称
    static String DOWNLOAD_AUDIO_RECORD = "/AudioRecord/downLoad";
    
    /**
     * 检测当前设备SD是否可用
     *
     * @return 返回"true"表示可用,否则不可用
     */
    public static boolean haveSdCard() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }
    
    /**
     * 获得SD卡根目录路径
     *
     * @return String类型  SD卡根目录路径
     */
    public static String getSdCardAbsolutePath() {
        return Environment.getExternalStorageDirectory().getAbsolutePath();
    }
    
    /**
     * 获得存储 录音文件的文件夹
     *
     * @return File类型
     * 存储 录音文件的文件夹 .AUDIO_RECORD是一个文件夹
     */
    public static File getAudioRecordDir() {
        //把String再转换为一个file对象
        File audioRecordFile = new File(FilePathUtil.getSdCardAbsolutePath() + AUDIO_RECORD);
        if (!audioRecordFile.exists()) {
            // 此处可能会创建失败,暂不考虑
            audioRecordFile.mkdir();
        }
        return audioRecordFile;
    }
    
    /**
     * 获得存储 下载而来的录音文件的文件夹
     *
     * @return File类型
     * 存储 下载而来的 录音文件的文件夹
     */
    public static File getDownAudioRecordDir() {
        File audioRecordFile = new File(FilePathUtil.getSdCardAbsolutePath() + DOWNLOAD_AUDIO_RECORD);
        if (!audioRecordFile.exists()) {
            // 此处可能会创建失败,暂不考虑
            audioRecordFile.mkdir();
        }
        return audioRecordFile;
    }
    
    
    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context      The context.
     * @param uri          The Uri to query.
     * @param //URI的URI查询。
     * @return The value of the _data column, which is typically a file path.
     * *获取此Uri的数据列的值。这是有用的
     * mediastore URI,和基于内容提供商的其他文件。
     * @param上下文语境。
     * @返回的_data列的值,这是一个典型的文件路径。
     */
    public static String getFilePathFromUri(final Context context, final Uri uri) {
        // DocumentProvider
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                
                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            }
            // DownloadsProvider
            else if (isDownloadsDocument(uri)) {
                
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                
                return getDataColumn(context, contentUri, null, null);
            }
            // MediaProvider
            else if (isMediaDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{
                        split[1]
                };
                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        }
        // MediaStore (and general)
        else if ("content".equalsIgnoreCase(uri.getScheme())) {
            return getDataColumn(context, uri, null, null);
        }
        // File
        else if ("file".equalsIgnoreCase(uri.getScheme())) {
            return uri.getPath();
        }
        return null;
    }
    
    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @param //URI的URI查询。
     * @return The value of the _data column, which is typically a file path.3
     * *获取此Uri的数据列的值。这是有用的
     * * mediastore URI,和基于内容提供商的其他文件。
     * @param上下文语境。
     * @param选择(可选)查询中使用的过滤器。
     * @param在selection中(可选)选择参数查询中使用。
     * @返回的_data列的值,这是一个典型的文件路径。
     */
    public static String getDataColumn(Context context, Uri uri, String selection,
                                       String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {
                column
        };
        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }
    
    
    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    public static boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }
    
    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    public static boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }
    
    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    public static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
    
    
}
打印LogUtils
package com.kjplusapp.utils;

import android.util.Log;

/**
 * @author xiaoyao
 * @time 2017/12/5 18:31
 * @classname LogUtil
 * @desc 文件的log工具类
 * 1.是否开启debug模式
 * 2.错误   e
 * 3.信息   i
 * 4.警告   w
 * 5.测试   d
 */
public class LogUtil {
    
    /**
     * 是否开启debug模式
     */
    public static boolean isDebug = true;
    
    public LogUtil() {
    }
    
    /**
     * 错误
     */
    public static void e(Class<?> clazz, String msg) {
        if (isDebug) {
            Log.e(clazz.getSimpleName(), msg);
        }
    }
    
    public static void e(String clazzName, String msg) {
        if (isDebug) {
            Log.e(clazzName, msg);
        }
    }
    
    /**
     * 信息
     */
    public static void i(Class<?> clazz, String msg) {
        if (isDebug) {
            Log.i(clazz.getSimpleName(), msg);
        }
    }
    
    public static void i(String clazzName, String msg) {
        if (isDebug) {
            Log.i(clazzName, msg);
        }
    }
    
    /**
     * 警告
     */
    public static void w(Class<?> clazz, String msg) {
        if (isDebug) {
            Log.w(clazz.getSimpleName(), msg);
        }
    }
    
    public static void w(String clazzName, String msg) {
        if (isDebug) {
            Log.w(clazzName, msg);
        }
    }
    
    /**
     * 测试
     */
    public static void d(Class<?> clazz, String msg) {
        if (isDebug) {
            Log.d(clazz.getSimpleName(), msg);
        }
    }
    
    public static void d(String clazzName, String msg) {
        if (isDebug) {
            Log.d(clazzName, msg);
        }
    }
}
NetWorkUil 网络状态工具  1、是否为WIFI  2、网络是否可用 3、网络是否为2G
package com.kjplusapp.utils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;

/**
 * @author xiaoyao
 * @time 2017/12/5 18:33
 * @classname NetWorkUtil
 * @desc 网络状态工具类
 * 1.是否为wifi
 * 2.网络是否可用
 * 3.网络是否为2G
 */
public class NetWorkUtil {
    
    public static boolean isWifi(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni != null && ni.getType() == ConnectivityManager.TYPE_WIFI) {
            return true;
        }
        return false;
    }
    
    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
            return true;
        }
        return false;
    }
    
    public static boolean isNetwork2G(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni != null && ni.getType() == ConnectivityManager.TYPE_MOBILE) {// 手否是手机网络
            //移动联通电信2g
            if (ni.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS
                    || ni.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE
                    || ni.getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA) {
                return true;
            } else {
                return false;
            }
        }
        return false;
    }
    
    
}
android 6.0 的动态权限管理类
public class PermissionUtils {
    
    private static final String TAG = PermissionUtils.class.getSimpleName();
    public static final int CODE_RECORD_AUDIO = 0;
    public static final int CODE_READ_PHONE_STATE = 1;
    public static final int CODE_ACCESS_FINE_LOCATION = 2;
    public static final int CODE_ACCESS_COARSE_LOCATION = 3;
    public static final int CODE_WRITE_EXTERNAL_STORAGE = 4;
    public static final int CODE_MULTI_PERMISSION = 100;
    
    public static final String PERMISSION_RECORD_AUDIO = Manifest.permission.RECORD_AUDIO;
    public static final String PERMISSION_READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
    public static final String PERMISSION_ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    public static final String PERMISSION_ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    public static final String PERMISSION_WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
    
    private static final String[] requestPermissions = {
            PERMISSION_RECORD_AUDIO,
            PERMISSION_READ_PHONE_STATE,
            PERMISSION_ACCESS_FINE_LOCATION,
            PERMISSION_ACCESS_COARSE_LOCATION,
            PERMISSION_WRITE_EXTERNAL_STORAGE
    };
    
    public interface PermissionGrant {
        void onPermissionGranted(int requestCode);
    }
    
    /**
     * Requests permission.
     *
     * @param context
     * @param requestCode request code, e.g. if you need request CAMERA permission,parameters is PermissionUtils.CODE_CAMERA
     */
    public static void requestPermission(final Context context, final int requestCode, PermissionGrant permissionGrant) {
        if (context == null) {
            return;
        }
        
        Log.i(TAG, "requestPermission requestCode:" + requestCode);
        if (requestCode < 0 || requestCode >= requestPermissions.length) {
            Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);
            return;
        }
        
        final String requestPermission = requestPermissions[requestCode];
        
        //如果是6.0以下的手机,ActivityCompat.checkSelfPermission()会始终等于PERMISSION_GRANTED,
        // 但是,如果用户关闭了你申请的权限,ActivityCompat.checkSelfPermission(),会导致程序崩溃(java.lang.RuntimeException: Unknown exception code: 1 msg null),
        // 你可以使用try{}catch(){},处理异常,也可以判断系统版本,低于23就不申请权限,直接做你想做的。permissionGrant.onPermissionGranted(requestCode);
//        if (Build.VERSION.SDK_INT < 23) {
//            permissionGrant.onPermissionGranted(requestCode);
//            return;
//        }
        
        int checkSelfPermission;
        try {
            checkSelfPermission = ActivityCompat.checkSelfPermission(context, requestPermission);
        } catch (RuntimeException e) {
            Toast.makeText(context, "请打开这些权限", Toast.LENGTH_SHORT)
                    .show();
            Log.e(TAG, "RuntimeException:" + e.getMessage());
            return;
        }
        
        if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");
            BaseActivity activity = (BaseActivity) context;
            
            if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
                Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");
                shouldShowRationale(activity, requestCode, requestPermission);
                
            } else {
                Log.d(TAG, "requestCameraPermission else");
                ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);
            }
            
        } else {
            Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");
            permissionGrant.onPermissionGranted(requestCode);
        }
    }
    
    private static void requestMultiResult(Context context, String[] permissions, int[] grantResults, PermissionGrant permissionGrant) {
        
        if (context == null) {
            return;
        }
        
        Map<String, Integer> perms = new HashMap<>();
        
        ArrayList<String> notGranted = new ArrayList<>();
        for (int i = 0; i < permissions.length; i++) {
            perms.put(permissions[i], grantResults[i]);
            if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                notGranted.add(permissions[i]);
            }
        }
        
        if (notGranted.size() == 0) {
            //所有权限都已获取
            //Toast.makeText(activity, "all permission success" + notGranted, Toast.LENGTH_SHORT).show();
            permissionGrant.onPermissionGranted(CODE_MULTI_PERMISSION);
        } else {
            openSettingActivity(context, "需要给予这些权限!");
        }
        
    }
    
    
    /**
     * 一次申请多个权限
     */
    public static void requestMultiPermissions(final Context context, PermissionGrant grant) {
        
        final List<String> permissionsList = getNoGrantedPermission(context, false);
        final List<String> shouldRationalePermissionsList = getNoGrantedPermission(context, true);
        
        //TODO checkSelfPermission
        if (permissionsList == null || shouldRationalePermissionsList == null) {
            return;
        }
        BaseActivity activity = (BaseActivity) context;
        if (permissionsList.size() > 0) {
            ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),
                    CODE_MULTI_PERMISSION);
            
        } else if (shouldRationalePermissionsList.size() > 0) {
            showMessageOKCancel(context, "请打开权限,点击确认选择权限",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            BaseActivity activity = (BaseActivity) context;
                            ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
                                    CODE_MULTI_PERMISSION);
                        }
                    });
        } else {
            grant.onPermissionGranted(CODE_MULTI_PERMISSION);
        }
        
    }
    
    
    private static void shouldShowRationale(final Activity context, final int requestCode, final String requestPermission) {
        //TODO
        BaseActivity activity = (BaseActivity) context;
        String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
        showMessageOKCancel(activity, "Rationale: " + permissionsHint[requestCode], new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                BaseActivity activity = (BaseActivity) context;
                ActivityCompat.requestPermissions(activity,
                        new String[]{requestPermission},
                        requestCode);
            }
        });
    }
    
    private static void showMessageOKCancel(final Context context, String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(context)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
        
    }
    
    /**
     * @param context
     * @param requestCode  Need consistent with requestPermission
     * @param permissions
     * @param grantResults
     */
    public static void requestPermissionsResult(final Context context, final int requestCode, String[] permissions,
                                                int[] grantResults, PermissionGrant permissionGrant) {
        
        if (context == null) {
            return;
        }
        Log.d(TAG, "requestPermissionsResult requestCode:" + requestCode);
        
        if (requestCode == CODE_MULTI_PERMISSION) {
            requestMultiResult(context, permissions, grantResults, permissionGrant);
            return;
        }
        
        if (requestCode < 0 || requestCode >= requestPermissions.length) {
//            Toast.makeText(context, "illegal requestCode:" + requestCode, Toast.LENGTH_SHORT).show();
            return;
        }
        
        
        if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //TODO success, do something, can use callback
            permissionGrant.onPermissionGranted(requestCode);
            
        } else {
            //TODO hint user this permission function
            Log.i(TAG, "onRequestPermissionsResult PERMISSION NOT GRANTED");
            //TODO
            String[] permissionsHint = context.getResources().getStringArray(R.array.permissions);
            openSettingActivity(context, "Result" + permissionsHint[requestCode]);
        }
        
    }
    
    private static void openSettingActivity(final Context context, String message) {
        
        showMessageOKCancel(context, message, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent = new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                Log.d(TAG, "getPackageName(): " + context.getPackageName());
                Uri uri = Uri.fromParts("package", context.getPackageName(), null);
                intent.setData(uri);
                context.startActivity(intent);
            }
        });
    }
    
    
    /**
     * @param context
     * @param isShouldRationale true: return no granted and shouldShowRequestPermissionRationale permissions, false:return no granted and !shouldShowRequestPermissionRationale
     * @return
     */
    public static ArrayList<String> getNoGrantedPermission(Context context, boolean isShouldRationale) {
        
        ArrayList<String> permissions = new ArrayList<>();
        
        for (int i = 0; i < requestPermissions.length; i++) {
            String requestPermission = requestPermissions[i];
            
            
            //TODO checkSelfPermission
            int checkSelfPermission = -1;
            try {
                checkSelfPermission = ActivityCompat.checkSelfPermission(context, requestPermission);
            } catch (RuntimeException e) {
                Toast.makeText(context, "请打开权限,点击确认选择权限", Toast.LENGTH_SHORT)
                        .show();
                Log.e(TAG, "RuntimeException:" + e.getMessage());
                return null;
            }
            
            if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
                Log.i(TAG, "getNoGrantedPermission ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED:" + requestPermission);
                BaseActivity activity = (BaseActivity) context;
                if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
                    Log.d(TAG, "shouldShowRequestPermissionRationale if");
                    if (isShouldRationale) {
                        permissions.add(requestPermission);
                    }
                    
                } else {
                    
                    if (!isShouldRationale) {
                        permissions.add(requestPermission);
                    }
                    Log.d(TAG, "shouldShowRequestPermissionRationale else");
                }
                
            }
        }
        
        return permissions;
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AnimationUtils 动画工具类 AppUtils APP相关信息工具类 AssetDatabaseOpenHelper 目录资源获取 Base64 加密 BitmapUtil 获取Bitmap和对Bitmap的操作 ChannelUtil 获取市场号 Colors 颜色工具类 包括常用的色值 DES DES加密解密类 DataCleanManager 本应用数据清除管理器 DatabaseExportUtils 应用数据库导出工具类 DateUtil 日期操作工具类 DbHelper 数据库帮助类 DensityUtil 屏幕信息获取数值的转换 DeviceStatusUtils 手机状态工具类 主要包括网络、蓝牙、屏幕亮度、飞行模式、音量等 DigestUtils DigestUtils FileUtils 文件操作 HanziToPinyin 拼音汉字处理 IOUtils IOUtils MD5 MD5 MiscUtils 设备信息的获取 NetWorkUtils 网络状态 PhoneUtil 手机组件调用工具类 PreferencesUtils sp工具类 RandomUtils 随机数工具类 RecorderControl 录音工具类 SerializeUtils Serialize ShellUtils shell指令 ShortCutUtils 创建删除快捷图标 SingletonUtils 单例工具 SizeUtils SizeUtils SqliteUtils SqliteUtils StreamUtils 流转换成字符串 StringUtils String SystemUtils 线程池工具类 TimeUtils TimeUtils ToastUtils ToastUtils TransitionTime 用来计算显示的时间是多久之前 ViewAnimationUtils 视图动画工具箱,提供简单的控制视图的动画的工具方法 ViewUtils view控制 WiFiUtil WiFiUtil WindowUtils 窗口工具箱 ZipUtil 实现的Zip工具 BadgeUtil 设置Badge LogUtil LogUti工具类 ArrayUtils 数组工具类,提供一些有关数组的便捷方法 ByteUtils 字节工具类,提供一些有关字节的便捷方法 CheckAdapter 选择适配器 CheckingUtils 提供常用数据验证的工具类,不符合的话就抛异常 Countdown 倒计时器 DialogUtils 对话框工具箱 DoubleClickExitDetector 双击退出识别器 ImageProcessor 图片处理器 InputMethodUtils 软键盘工具类 LoopTimer 循环定时器 NestedGridView 嵌套使用的GridView NestedListView 嵌套使用的ListView OSUtils Android系统工具箱 OtherUtils 主要是给字符串添加html ReflectUtils 反射工具类,提供一些Java基本的反射功能 RegexUtils 正则表达式工具类,提供一些常用的正则表达式 SDCardUtils SD卡工具箱 Symbols 常用符号 WebViewManager WebView管理器,提供常用设置 原地址:https://github.com/l123456789jy/Lazy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小妖sc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值