GT工具包

本文章用于提供查询GT包中的功能:

GT源码下载网址:https://github.com/1079374315/Android/blob/master/GT.java

package com.gsls.king.gooverandroid.Util;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.Html;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.webkit.WebView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.SimpleTarget;
import com.bumptech.glide.request.transition.Transition;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.lzy.okgo.callback.StringCallback;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

/**
 * 工具类说明:
 * GSLS_Tool
 * 须依赖的包:
 * implementation 'com.google.code.gson:gson:2.8.5'         //JSON 数据解析
 * implementation 'com.lzy.net:okgo:3.0.4'                  //OkGo网络框架
 * implementation 'com.github.bumptech.glide:glide:4.8.0'   //加载图片的glide
 * implementation 'org.jsoup:jsoup:1.10.3'                  //Jsoup格式化html数据
 *
 *
 * 更新时间:2019.5.4
 *
 *
 * 小提示:(用于 AndroidStudio )
 *      收起所有的 方法: Ctrl + Shift +  - (减号)
 *      展开所有的 方法: Ctrl + Shift +  + (加号)
 *
 */
@SuppressWarnings("unchecked")
public class GT {


    //设置不可实例化
    private GT(){}
    public static Boolean LOG_TF = true;        //控制外部所有的 Log   显示
    public static Boolean GT_LOG_TF = false;    //控制内部所有的 Log   显示
    public static Boolean TOAST_TF = true;      //控制外部所有的 toast 显示
    public static Boolean GT_TOAST_TF = false;  //控制内部所有的 toast 显示
    public static Context CONTEXT;              //设置 当前动态的 上下文对象


    /********************************************  提示类 *****************************************************/

    //提示消息 Log
    public static void log_v(Object msg){
        if(LOG_TF){
            Log.v("GT_v","------- " + msg);
        }
    }
    public static void log_d(Object msg){
        if(LOG_TF){
            Log.d("GT_d","------- " + msg);
        }
    }
    public static void log_i(Object msg){
        if(LOG_TF){
            Log.i("GT_i","------- " + msg);
        }
    }
    public static void log_w(Object msg){
        if(LOG_TF){
            Log.w("GT_w","------- " + msg);
        }
    }
    public static void log_e(Object msg){
        if(LOG_TF){
            Log.e("GT_e","------- " + msg);
        }
    }
    public static void log_v(Object title, Object msg){
        if(LOG_TF){
            Log.v("GT_v",
                    "------- Run" +
                            "\n\n---------------------" + title + "------------------------\n" +
                            "                   " + msg + "\n" +
                            "---------------------" + title + "-----------------------\n\n" +
                            "------- Close"
            );
        }

    }
    public static void log_d(Object title, Object msg){
        if(LOG_TF){
            Log.d("GT_d",
                    "------- Run" +
                            "\n\n---------------------" + title + "------------------------\n" +
                            "                   " + msg + "\n" +
                            "---------------------" + title + "-----------------------\n\n" +
                            "------- Close"
            );
        }

    }
    public static void log_i(Object title, Object msg){
        if(LOG_TF){
            Log.i("GT_i",
                    "------- Run" +
                            "\n\n---------------------" + title + "------------------------\n" +
                            "                   " + msg + "\n" +
                            "---------------------" + title + "-----------------------\n\n" +
                            "------- Close"
            );
        }

    }
    public static void log_w(Object title, Object msg){
        if(LOG_TF){
            Log.w("GT_w",
                    "------- Run" +
                            "\n\n---------------------" + title + "------------------------\n" +
                            "                   " + msg + "\n" +
                            "---------------------" + title + "-----------------------\n\n" +
                            "------- Close"
            );
        }

    }
    public static void log_e(Object title, Object msg){
        if(LOG_TF){
            Log.e("GT_e",
                    "------- Run" +
                            "\n\n---------------------" + title + "------------------------\n" +
                            "                   " + msg + "\n" +
                            "---------------------" + title + "-----------------------\n\n" +
                            "------- Close"
            );
        }

    }
    public static String getLineInfo(){
        StackTraceElement ste = new Throwable().getStackTrace()[1];
        return "报错的文件  " + ste.getFileName() + "  行号 " + ste.getLineNumber();
    }   //报错提示

    //消息框 Toast
    public static void toast_s(Object msg){
        if(TOAST_TF){
            if(CONTEXT != null)
                Toast.makeText(CONTEXT,msg + "",Toast.LENGTH_SHORT).show();
            else
            if(LOG_TF)//设置为默认输出日志
                log_e("GT_bug","消息框错误日志:你没有为 Context 进行赋值 ,却引用了 Toast 导致该功能无法实现。");
        }
    }
    public static void toast_l(Object msg){
        if(TOAST_TF){
            if(CONTEXT != null)
                Toast.makeText(CONTEXT,msg + "",Toast.LENGTH_SHORT).show();
            else
            if(LOG_TF)//设置为默认输出日志
                log_e("GT_bug","消息框错误日志:你没有为 Context 进行赋值 ,却引用了 Toast 导致该功能无法实现。");
        }
    }
    public static void toast_s(Context context,Object msg){
        if(TOAST_TF)
            Toast.makeText(context,msg + "",Toast.LENGTH_SHORT).show();
    }
    public static void toast_l(Context context,Object msg){
        if(TOAST_TF)
            Toast.makeText(context,msg + "",Toast.LENGTH_LONG).show();
    }

    //AlertDialog.Builder 对话框类
    public static class GT_AlertDialog extends AlertDialog.Builder{

        public String resultButtonDialog = null;
        public String resultListDialog = null;
        public String resultSingleChoiceListDialog = null;
        public String[] resultMultiChoiceDialog = null;

        public GT_AlertDialog(Context context) {
            super(context);
        }
        //设置按钮的对话框
        public AlertDialog.Builder dialogButton(int img, String title, String message, final String[] texts){
            setTitle(title).setIcon(img).setMessage(message);   //设置 标题、图标、消息
            if(texts != null){
                resultButtonDialog = null;
                if(texts.length >= 1)
                    setNegativeButton(texts[0], new DialogInterface.OnClickListener() {
                        // 第一个按钮
                        @Override
                        public void onClick(DialogInterface dialog,int which) {
                            resultButtonDialog = texts[0];
                        }
                    });
                if(texts.length >= 2)
                    setPositiveButton(texts[1], new DialogInterface.OnClickListener() {
                        //第二个按钮
                        @Override
                        public void onClick(DialogInterface dialog,int which) {
                            resultButtonDialog = texts[1];
                        }
                    });
                if(texts.length >= 3)
                    setNeutralButton(texts[2], new DialogInterface.OnClickListener() {  //中间
                        //第三个按钮
                        @Override
                        public void onClick(DialogInterface dialog,int which) {
                            resultButtonDialog = texts[2];
                        }
                    });
            }
            return this;
        }

        //设置列表选项对话框
        public AlertDialog.Builder dialogList(int img, String title,final String[] texts){

            setIcon(img).setTitle(title);
            if(texts != null)
                setItems(texts, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        resultListDialog = texts[which];
                    }
                }); //添加列表项
            return this;
        }

        //设置单选列表选项对话框
        public AlertDialog.Builder dialogSingleChoiceList(int img, String title,String buttonName, final String[] texts){
            setIcon(img).setTitle(title);
            if(texts != null)
                setSingleChoiceItems(texts, 0, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        resultSingleChoiceListDialog = texts[which];
                    }
                });//添加列表项
            if(buttonName != null)
                setPositiveButton(buttonName,null);//设置按钮
            return this;
        }

        //设置多选列表对话框
        public AlertDialog.Builder dialogMultiChoice(int img, String title,String buttonName,final String[] texts){

            final boolean[] checkedItems = new boolean[texts.length];   //初始化选中状态
            resultMultiChoiceDialog = new String[texts.length];         //初始化字符串结果

            for(int i = 0; i < checkedItems.length; i++) checkedItems[i] = false;   //初始化默认选项
            setIcon(img).setTitle(title);//设置 图标、标题

            if(texts != null)
                setMultiChoiceItems(texts, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        checkedItems[which] = isChecked;//改变被操控列表项的状态
                    }
                });//添加列表项

            if(buttonName != null)
                setPositiveButton(buttonName, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        for (int i = 0; i < checkedItems.length; i++){
                            if(checkedItems[i]){
                                resultMultiChoiceDialog[i] = texts[i];
                            }
                        }
                    }
                });

            return this;
        }

        //设置自定义对话框
        public AlertDialog  dialogView(int img, String title,boolean ShieldngExternal,final int darkDegrees,int x,int y,int layout){
            AlertDialog alertDialog = create();// 创建对话框
            // 设置参数
            if(title != null) alertDialog.setTitle(title);//设置标题

            if(img != 0) alertDialog.setIcon(img);  //设置图标

            if(darkDegrees != -1) alertDialog.getWindow().setDimAmount(darkDegrees);//设置昏暗度为0 则表示为透明, 如果是 -1 则是默认

            alertDialog.setCancelable(ShieldngExternal);       //设置点击外面不会消失 true为点击外面可以被取消,false 为点击外面不可被取消
            // 获取布局
            view = View.inflate(getContext(), layout,null);
            alertDialog.setView(view);

            //修改 自定义对话框的显示位置
            android.view.Window dialogWindow = alertDialog.getWindow();/*随意定义个Dialog*/
            WindowManager.LayoutParams lp = dialogWindow.getAttributes();/*实例化Window*/
            /*实例化Window操作者*/
            lp.x = x; // 新位置X坐标
            lp.y = y; // 新位置Y坐标
            dialogWindow.setAttributes(lp);


            return alertDialog;
        }
        private View view;  //定义 View
        public View getView(){
            return view;
        }




    }

    //Notification 通知类
    public static class GT_Notification{

        private static int NOTIFYID = 0x1997; //通知id
        private static String CHANEL_ID = "com.gsls.king";
        private static String CHANEL_DESCRIPTION = "GT_Android 描述";
        private static String CHANEL_NAME = "GT_Android复习";

        public void setNotifyId(int NotifyId){
            NOTIFYID = NotifyId;
        }
        public void setChanelId(String ChanelId){
            CHANEL_ID = ChanelId;
        }
        public void setChanelDescription(String ChanelDescription){
            CHANEL_DESCRIPTION = ChanelDescription;
        }
        public void setChanelName(String ChanelName){
            CHANEL_NAME = ChanelName;
        }

        private Activity activity;
        public GT_Notification(Activity activity){
            this.activity = activity;
        }

        public NotificationManagerCompat sendingNotice(int icon, String title, String text, int time, boolean voiceTF, boolean autoCancel, Class<?> cla){

            /**
             * 由于 Notification.Builder 仅支持 Android 4.1及之后的版本,为了解决兼容性问题, Notification.Builder 仅支持 API 26 与 26 之前的版本
             * Google 在 Android Support v4 中加入了 NotificationCompat.Builder 类
             */
            String channelId = createNotificationChannel(activity.getApplicationContext());//创建Notification Channel
            NotificationCompat.Builder builder = new NotificationCompat.Builder(activity, channelId);//创建Notification并与Channel关联

            builder.setSmallIcon(icon);//设置通知图标
            builder.setAutoCancel(autoCancel);//设置通知打开后自动消失
            builder.setContentTitle(title);//设置标题
            builder.setContentText(text);//设置内容
            if(time == 0) builder.setWhen(System.currentTimeMillis());//设置系统当前时间为发送时间
            else builder.setWhen(time);//设置用户设置的发送时间
            if(voiceTF) builder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);//设置默认的声音与默认的振动

            if(cla != null){    //如果 cla 不为空就设置跳转的页面
                Intent intent = new Intent(activity, cla);
                PendingIntent pi = PendingIntent.getActivity(activity, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
                builder.setContentIntent(pi);//设置通知栏 点击跳转
            }

            //发布通知
            NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(activity.getApplicationContext());
            notificationManagerCompat.notify(NOTIFYID, builder.build());
            return notificationManagerCompat;
        }

        private String createNotificationChannel(Context context) {
            // O (API 26)及以上版本的通知需要NotificationChannels。
            if (context != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

                // 初始化NotificationChannel。
                NotificationChannel notificationChannel = new NotificationChannel(CHANEL_ID,CHANEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
                notificationChannel.setDescription(CHANEL_DESCRIPTION);

                // 向系统添加 NotificationChannel。试图创建现有通知
                // 通道的初始值不执行任何操作,因此可以安全地执行
                // 启动顺序
                NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.createNotificationChannel(notificationChannel);

                return CHANEL_ID;
            } else {
                return null; // 为pre-O(26)设备返回 null
            }
        }

    }

    /********************************************  数据存储类 *****************************************************/

    //数据持久化 SharedPreferences
    public static class GT_SharedPreferences{
        private Context context;
        public boolean commit(){return sp_e.commit();}  //手动提交
        public void clear(){sp_e.clear();sp_e.commit();}//清空
        private SharedPreferences sp; public SharedPreferences getSharedPreferences(){return sp;}           //获取 SharedPreferences
        private SharedPreferences.Editor sp_e;  public SharedPreferences.Editor getEditor(){return sp_e;}   //获取 SharedPreferences.Editor
        private boolean commit = false;             //定义是否自动提交
        public static final int PRIVATE = 0;        //只有本应用可读写
        public static final int PROTECTED = 1;      //其他应用可以只读
        public static final int PUBLIC = 2;         //其他应用可以读写

        //初始化
        public GT_SharedPreferences(Context context,String SPName,int permissions,boolean commit) {
            this.context = context;
            this.commit = commit;
            sp = context.getSharedPreferences(SPName, permissions);//打开 或 创建 SharedPreferences
            sp_e = sp.edit();//让userData处于编辑状态
        }
        //增
        public GT.GT_SharedPreferences save(String key, Object object){
            boolean TF = true;//监测保存状态是否正常
            if(object instanceof String){
                sp_e.putString(key,object.toString());
            }else if(object instanceof Integer){
                sp_e.putInt(key,(Integer) object);
            }else if(object instanceof Long){
                sp_e.putLong(key,(Long)object);
            }else if(object instanceof Float){
                sp_e.putFloat(key,(Float)object);
            }else if(object instanceof Boolean){
                sp_e.putBoolean(key,(Boolean) object);
            }else if(object instanceof Set){
                sp_e.putStringSet(key,(Set)object);
            }else{
                if(GT_LOG_TF) log_v(context,"进行对象保存");
                String json = new Gson().toJson(object);
                String json_class = object.getClass().toString();
                sp_e.putString(key,json);                           //保存对象的 Json 数据
                sp_e.putString(key+"_class",json_class);            //保存对象的 class 数据
            }
            if(commit && TF) sp_e.commit();  //如果设置了自动提交 并且 保存状态正常 即可自定提交
            return this;

        }
        //删
        public SharedPreferences.Editor delete(String key){
            if(query(key) != null){
                sp_e.remove(key);
                if(commit)sp_e.commit();
            }else {
                if(GT_LOG_TF) log_v("删除失败  当前 sp 中无此 key");
            }
            return sp_e;
        }
        //改
        public GT.GT_SharedPreferences updata(String key, Object object){
            if(query(key) != null){
                if(GT_LOG_TF)
                    log_v(context,"进入到 updata 查询的数据不为null");
                save(key,object);
            }
            return this;
        }
        //查
        public Object query(String key){
            Object obj = null;
            try{
                obj = sp.getInt(key,0);
            }catch (ClassCastException e1){
                if(GT_LOG_TF)
                    log_v(context,"Int 数据装换异常");
                try{
                    String str_class = sp.getString(key+"_class",null);     //获取对象 class 数据
                    String str = sp.getString(key,null);                          //获取对象 Json  数据
                    if(str_class == null){      //如果 class 数据为空
                        obj = str;              //普通的 Json 数据
                    }else{
                        Object object_class = getObj(str_class);    //通过对象的 class 反射出 实例对象
                        obj = new Gson().fromJson(str,object_class.getClass());     //通过 Gson 与 实例对象 获取相应的 Object 对象
                    }
                }catch (ClassCastException e2){
                    if(GT_LOG_TF)
                        log_v(context,"String 数据装换异常");
                    try{
                        obj = sp.getLong(key,0);
                    }catch (ClassCastException e3){
                        if(GT_LOG_TF)
                            log_v(context,"Long 数据装换异常");
                        try{
                            obj = sp.getFloat(key,0f);
                        }catch (ClassCastException e4){
                            if(GT_LOG_TF)
                                log_v(context,"Float 数据装换异常");
                            try{
                                obj = sp.getBoolean(key,false);
                            }catch (ClassCastException e5){
                                if(GT_LOG_TF)
                                    log_v(context,"Boolean 数据装换异常");
                                try{
                                    obj = sp.getStringSet(key,null);
                                }catch (ClassCastException e6){
                                    if(GT_LOG_TF)
                                        log_v(context,"StringSet 数据装换异常");
                                    obj = null;
                                }
                            }
                        }
                    }
                }
            }
            return obj;
        }
        //通过 对象的.class 属性反射对象
        private Object getObj(String objectClass){
            Object obj = null;
            String[] strs = objectClass.split(" ");
            String str = strs[1];
            Class<?> clazz = getClass();
            try {
                clazz = Class.forName(str);
            } catch (ClassNotFoundException e1) {
                e1.printStackTrace();
            }
            try {
                obj = clazz.newInstance();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return obj;		//返回实例化好的类

        }
        //获取所有
        public Map<String, ?> queryAll(){
            return sp.getAll();
        }

    }

    //内部存储 IO
    public static class GT_IO{

        /**
         * 使用实例:
         * 第一步:
         *          GT.GT_IO io = new GT.GT_IO(this);//创建 IO 对象
         * 第二步:
         *          io.save(editText.getText().toString(),"King");//保存数据
         * 第三步:
         *          String king = io.query("King"); //获取数据
         */

        private Context context;

        public GT_IO(Context context){
            this.context = context;
        }

        public GT_IO save(String saveData,String dataName){

            FileOutputStream fos = null;//文件输出流
            try {
                fos = context.openFileOutput(dataName,context.MODE_PRIVATE);//获取文件输出流对象
                fos.write(saveData.getBytes());//保存备忘信息
                fos.flush();//清除缓存
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fos != null){
                    try {
                        fos.close();//关闭输出流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return this;
        }

        public String query(String dataName){
            FileInputStream fis = null;//文件输入流对象
            String data = null;
            byte[] buffer = null;
            try {
                fis = context.openFileInput(dataName);//获得文件输入流对象
                buffer = new byte[fis.available()];//实例化字节数组
                fis.read(buffer);//从输入流中读取数据
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fis != null){
                    try {
                        fis.close();//关闭输入流对象
                        data = new String(buffer);//把字节数组中的数据转换为字符串
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return data;
        }

    }

    //外部存储 File
    public static class GT_File{

        /**
         * 使用实例:
         * 第一步:
         *          GT.GT_File file = new GT.GT_File();//创建 File 对象
         * 第二步:
         *          file.save("第一章:","/我的小说/武侠小说/","斗罗大陆.txt");//保存数据
         * 第三步:
         *          String query = file.query("/我的小说/武侠小说/", "斗罗大陆.txt"); //获取数据
         */

        public void save(String saveData,String savePaht, String fileName){

            File fileNull = new File(Environment.getExternalStorageDirectory() + savePaht);//实例化文件对象
            if(!fileNull.exists()){
                fileNull.mkdirs();
            }

            File file = new File(Environment.getExternalStorageDirectory() + savePaht,fileName);//实例化文件对象

            FileOutputStream fos = null;//文件输出流
            try {
                fos = new FileOutputStream(file);//获取文件输出流对象
                fos.write(saveData.getBytes());//保存备忘信息
                fos.flush();//清除缓存
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fos != null){
                    try {
                        fos.close();//关闭输出流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }

        public String query(String queryPaht, String fileName){

            File fileNull = new File(Environment.getExternalStorageDirectory() + queryPaht);//实例化文件对象
            if(!fileNull.exists()){
                fileNull.mkdirs();
            }

            File file = new File(Environment.getExternalStorageDirectory() + queryPaht,fileName);//实例化文件对象


            FileInputStream fis = null;//文件输入流对象
            byte[] buffer = null;
            String data = null;
            try {
                fis = new FileInputStream(file);//获得文件输入流对象
                buffer = new byte[fis.available()];//实例化字节数组
                fis.read(buffer);//从输入流中读取数据
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fis != null){
                    try {
                        fis.close();//关闭输入流对象
                        data = new String(buffer);//把字节数组中的数据转换为字符串
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

            return data;
        }

    }

    //Hibernate SQL
    public static class Hibernate{

        // 增    INSERT INTO ROLE(NAME,AGE,SEX) VALUES(:name,:age,:sex)
        // 删    DELETE 表名 WHERE NAME = '陈启申'
        // 改    UPDATE 表名 SET NAME = ? WHERE ID = ?
        // 查    SELECT * FROM ROLE WHERE id > ?
        //str    String json = new Gson().toJson(object);
        //obj    obj = new Gson().fromJson(str,object_class.getClass());     //通过 Gson 与 实例对象 获取相应的 Object 对象
        //       sp = context.getSharedPreferences(SQLName, AppCompatActivity.MODE_WORLD_WRITEABLE);//打开 sp
        //       sp_e = sp.edit();//让userData处于编辑状态

        private Context context;
        private Object password;
        private SharedPreferences sp;
        private SharedPreferences.Editor sp_e;
        private Map<Object,Object> sqlMap = new HashMap<>();
        private final static String DATABASE = "GT_DATABASE";

        //初始化 Hibernate
        public Hibernate(Context context) {
            this.context = context;
            sp = context.getSharedPreferences(DATABASE, AppCompatActivity.MODE_WORLD_WRITEABLE);//创建最底层的 sql
            sp_e = sp.edit();   //让 GT_DATABASE 处于编辑状态
        }

        //创建数据库
        public void createDatabase(String databaseName,Object password){
            sqlMap.put(databaseName,new HashMap<>());
            String db = new Gson().toJson(sqlMap);
            log_e("创建数据库的 json 数据",db);

//            db = password;

            log_e("加密后的数据库 json 数据",db);
            sp_e.putString(databaseName,db);
            sp_e.commit();
        }

        //修改数据库
        public void alterDatabase(String formerName,String newName,Object password){
            formerName = sp.getString("formerName",null);
            if(formerName != null){

            }else{
                if(GT_LOG_TF) log_e("修改数据库 失败! 原由:暂未找到需要修改的数据库名称");
            }
        }

        //删除数据库
        public void dropDatabase(String databaseName){

        }

        //打开数据库
        public void openDatabase(String databaseName,Object password){

        }

    }





    /********************************************  网络 类 *****************************************************/
    //network 网络类
    public class Network{

        //监听网络状态 true 网络正常  false 网络异常
        public boolean networkMonitoring(Context context) {
            boolean buffer = false;
            boolean isWifiConn = false, isMobile = false;
            //1.获得ConnectivityManager对象
            ConnectivityManager cm = (ConnectivityManager) context.getSystemService((Context.CONNECTIVITY_SERVICE));
            //2.检查API
            if (Build.VERSION.SDK_INT < 23) {
                //3.获取信息(WIFI和移动信息)
                @SuppressLint("MissingPermission") NetworkInfo infowifi = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                isWifiConn = infowifi.isConnected();
                @SuppressLint("MissingPermission") NetworkInfo infomobile = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                isMobile = infomobile.isConnected();
            } else {
                //3.获取所有网络连接信息getAllNetworks
                @SuppressLint("MissingPermission") android.net.Network[] networks = cm.getAllNetworks();
                StringBuffer sb = new StringBuffer();
                //遍历取出网络信息
                for (int i = 0; i < networks.length; i++) {
                    @SuppressLint("MissingPermission") NetworkInfo networkInfo = cm.getNetworkInfo(networks[i]);
                    buffer = networkInfo.isConnected();
                }
            }
            if (buffer || isMobile || isWifiConn) {
                return true;
            } else {
                return false;
            }
        }


    }

    //JSON 接口解析
    public static class JSON {

        private String string;
        private int code = 0;
        private String msg = null;
        private Object data = null;
        public int getCode() {
            return code;
        }
        public String getMsg() {
            return msg;
        }
        public String getData() {
            return data.toString();
        }

        //初始化 json 数据
        public JSON(String string) {
            this.string = string;
            try {
                JSONObject jsonObject = new JSONObject(string);
                code = jsonObject.getInt("code");
                data = jsonObject.get("data");
                msg = jsonObject.getString("msg");
            } catch (JSONException e) {
                if(GT_LOG_TF)
                    log_v("当前 JSON 数据中有些节点并不存在,请谨慎使用!  【" + getLineInfo() + "】");
//                e.printStackTrace();
            }
        }

        /*********************************  根据 Bean 获取数据*************************************/
        //根据 bean 类获取 bean 对象
        public Object getBean(Class<?> aClass){
            Object o = null;
            try{
                o = new Gson().fromJson(string, aClass);
            }catch (JsonSyntaxException exception){
                log_e(getLineInfo(),"你的 JSON 解析类型不匹配,请检查  " + aClass + "  是否与请求的Json数据一致!");
            }
            return o;
        }


        /*********************************  没有 Bean 获取数据*************************************/
        /**
         *
         * 用法:
         * 第一步:将请求的数据放入   GT.JSON json = new GT.JSON(“请求的数据”);
         * 第二步:初始化 JSON 数据  json.initBeanData(json.getData());
         * 第三步:获取 list 集合    JSONArray list = json.getJSONArray("list");     //获取 list 节点
         * 第四步:获取 list 内数据  Object author = json.getJSONObject(list, “节点名”, “集合list的索引”);
         *
         * 注意:
         * 如果请求的数据是 "data":{}  就用 get()方法 获取 data 再就进行初始化后 获取里面的值
         * 如果请求的数据是 "list": [] 就用 getJSONObject() 获取 List<?>
         *
         */
        private JSONObject jsonObject;
        private JSONArray jsonArray;

        public JSON initBeanData(String data){
            try {
                jsonObject = new JSONObject(data);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return this;
        } //初始化 JSON 数据

        public Object get(String key){
            Object o = null;
            if(jsonObject != null){
                try {
                    o = jsonObject.get(key);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }else{
                log_e(getLineInfo(),"没有初始化 JSON 数据,无法进行 无 bean 数据解析");
            }

//            GT.log_e("在转 data 数据之前:" + data);
            o = rplStr(o.toString(),"\\","");//忽略掉转义符
//            GT.log_e("转 data 数据之后:" + data);

            return o;
        }   //获取普通的值 返回数据前会进行 忽略掉转义符

        public String rplStr(String str1,String str2,String str3){
            String strtmp="";
            int i=0,f;
            for(i=0;;i+=str2.length()){
                f=str1.indexOf(str2,i);
                if (f==-1) {
                    strtmp+=str1.substring(i);
                    break;
                }else{
                    strtmp+=str1.substring(i,f);
                    strtmp+=str3;
                    i=f;
                }
            }
            return strtmp;
        }//去掉转义符

        public JSONArray getJSONArray(String string){
            try {
                jsonArray = new JSONArray(string);
            } catch (JSONException e) {
                log_e(getLineInfo(),"没有初始化 JSON 数据,无法进行 无 bean 数据解析");
            }

            return jsonArray;
        }   //获取 对象数组

        public Object getJSONObject(JSONArray list,String key,int index){
            JSONObject jsonObject = null;
            Object o = null;
            try {
                jsonObject = (JSONObject) list.get(index);  //获取当前索引下
                o = jsonObject.get(key);        //key 值 的对象
            } catch (JSONException e) {
                log_e(getLineInfo(),"JSON 数据解析异常,无法通过 没有初始化的 JSON 数据进行解析节点");
            }
            return o;
        }   //获取 JSON 对象

        public static JSONArray addJSONArray(JSONArray jsonArray,JSONArray new_jsonArray){

            for(int i = 0; i < new_jsonArray.length(); i++){
                try {
                    Object o = jsonArray.get(i);
                    jsonArray.put(o);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return  jsonArray;
        }//添加新的 json 数据

        public static JSONArray clear(JSONArray jsonArray){
            for (int i = 0, len = jsonArray.length(); i < len; i++) {
                JSONObject obj = null;
                try {
                    obj = jsonArray.getJSONObject(i);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                obj.remove("key");
            }
            return jsonArray;
        }



    }

    //OkGo 网络请求框架
    public static class OkGo{

        private Map<String,String> map;
        private String url;


        //初始化 map 并进行添加参数
        public OkGo addParameter(String key,String value){
            if(map == null){
                map = new HashMap<>();//初始化 map
            }else{
                if(!map.containsKey(key)){//如果当前 map 中没有此key
                    map.put(key,value);
                }
            }
            return this;
        }

        public OkGo(String url,Map<String,String> map){
            this.url = url;
            this.map = map;
        }

        public OkGo(String url){
            this.url = url;
        }

        public void loadData(StringCallback stringCallback){
            if(map == null){
                GT.log_e(getLineInfo(),"当前 map 为空,会导致 请求数据失败,请检查是否对 map 进行初始化");
            }else {
                com.lzy.okgo.OkGo.<String>post(url) .params(map).execute(stringCallback);
            }
        }
    }

    //okHttp 网络请求框架
    public static class OkHttp{}

    //将 网页数据 格式化成 可视化的 html 数据
    public static class MImageGetter implements Html.ImageGetter {
        /**
         * 使用案列:
         *                      MImageGetter mImageGetter = new MImageGetter(“TextView 组件”, 上下文对象);
         *
         *                      TextView 组件.setText(Html.fromHtml(请求下来的string数据, mImageGetter, null));
         */
        Context c;
        WebView webView;

        public MImageGetter(WebView webView, Context c) {
            this.c = c;
            this.webView = webView;
        }

        public Drawable getDrawable(String source) {
            final UrlDrawable drawable = new UrlDrawable();
            if(c != null)
                Glide.with(c)
                        .asBitmap()
                        .load(source)
                        .into(new SimpleTarget<Bitmap>() {
                            @Override
                            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                                float width = webView.getWidth();
                                if (resource.getWidth() > width) {
                                    float scale = width / resource.getWidth();
                                    int afterWidth = (int) (resource.getWidth() * scale);
                                    int afterHeight = (int) (resource.getHeight() * scale);
                                    drawable.setBounds(0, 0, afterWidth, afterHeight);
                                    drawable.setBitmap(resizeBitmap(resource, afterWidth, afterHeight));
                                } else {
                                    drawable.setBounds(0, 0, resource.getWidth(), resource.getHeight());
                                    drawable.setBitmap(resource);
                                }
                                webView.invalidate();
//                                webView.loadData();
                            }
                        });
            return drawable;
        }

        private class UrlDrawable extends BitmapDrawable {
            private Bitmap bitmap;

            @Override
            public void draw(Canvas canvas) {
                super.draw(canvas);
                if (bitmap != null) {
                    int i = canvas.getWidth() - bitmap.getWidth();
                    canvas.drawBitmap(bitmap, i / 2, 0, getPaint());
                }
            }

            void setBitmap(Bitmap bitmap) {
                this.bitmap = bitmap;
            }
        }

        /**
         * 使用Matrix将Bitmap压缩到指定大小
         *
         * @param bitmap
         * @param w
         * @param h
         * @return
         */
        public static Bitmap resizeBitmap(Bitmap bitmap, int w, int h) {
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();

            float scaleWidth = ((float) w) / width;
            float scaleHeight = ((float) h) / height;

            Matrix matrix = new Matrix();
            matrix.postScale(scaleWidth, scaleHeight);

            return Bitmap.createBitmap(bitmap, 0, 0, width,
                    height, matrix, true);
        }



    }





    /********************************************  小工具 类 *****************************************************/

    //data 日期类
    public static class GT_Date{

        private String time;        //定义返回的 时间整体字符串
        private String[] times;     //定义分割后产生的 年月日 / 时分秒 数组
        private String[] ymd;       //定义分割后产生的 年月日 数组
        private String[] hms;       //定义分割后产生的 时分秒 数组

        //初始化时间 数据
        public GT_Date(){
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
            time = df.format(new Date());   //获取当时间
            times = time.split(" ");    //分割时间 年月日 / 时分秒 数组
            ymd = times[0].split("-");  //分割年月日 数组
            hms = times[1].split(":");  //分割时分秒 数组
        }

        //获取当前星期
        public String getWeekOfDate() {
            String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
            if (w < 0)
                w = 0;
            return weekDays[w];
        }
        //获取当前时间
        public String getTime(){
            return time;
        }
        //获取当前 年月日
        public String getYearMonthDay(){
            return times[0];
        }
        public String getYear(){
            return ymd[0];
        }    //获取年
        public String getMonth(){
            return ymd[1];
        }   //获取月
        public String getDay(){
            return ymd[2];
        }     //获取日
        //获取当前 时分秒
        public String getHourMinuteSecond(){
            return times[1];
        }
        public String getHour(){
            return hms[0];
        }    //获取时
        public String getMinute(){
            return hms[1];
        }  //获取分
        public String getSecond(){
            return hms[2];
        }  //获取秒

        //时间戳转 时间
        public String toTime(String dataTime){
            SimpleDateFormat formatter =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
            long myTime= Long.parseLong(dataTime);
            long lt = new Long(myTime*1000);//返回来的时间戳1476929029是毫秒,这里要乘1000才是正确的北京时间
            Date date = new Date(lt);
            String time=formatter.format(date);
            return time;
        }
        //时间戳转 年月日
        public String toYearMonthDay(String dataTime){
            SimpleDateFormat formatter =new SimpleDateFormat("yy-MM-dd", Locale.getDefault());
            long myTime= Long.parseLong(dataTime);
            long lt = new Long(myTime*1000);//返回来的时间戳1476929029是毫秒,这里要乘1000才是正确的北京时间
            Date date = new Date(lt);
            String time=formatter.format(date);
            return time;
        }
        //时间戳转 北京时间
        public String toBeijingTime(String dataTime){
            SimpleDateFormat formatter =new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
            long myTime= Long.parseLong(dataTime);
            long lt = new Long(myTime*1000);//返回来的时间戳1476929029是毫秒,这里要乘1000才是正确的北京时间
            Date date = new Date(lt);
            String time=formatter.format(date);
            return time;
        }

    }

    //分享功能
    public static class GT_Share{

        private Activity activity;
        public GT_Share(Activity activity){
            this.activity = activity;
        }

        public void senText(String title,String content){
            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.setType("text/plain");
            shareIntent.putExtra(Intent.EXTRA_TEXT, content);
            shareIntent = Intent.createChooser(shareIntent, title);
            activity.startActivity(shareIntent);
        }


    }




    /********************************************  UI 类 *****************************************************/
    //Window 窗体类
    public static class Window{

        private WindowManager wm;
        private Activity activity;
        private View view = null;
        private AppCompatActivity appCompatActivity;

        //初始化
        public Window(AppCompatActivity appCompatActivity){
            this.activity = appCompatActivity;
            this.appCompatActivity = appCompatActivity;
            wm = appCompatActivity.getWindowManager();
        }
        //获取屏幕 宽度
        public int getWindowWidth(){
            int width = wm.getDefaultDisplay().getWidth();
            return width;
        }
        //获取屏幕 高度
        public int getWindowHeight(){
            int height = wm.getDefaultDisplay().getHeight();
            return height;
        }
        //隐藏  ActionBar
        public void hideActionBar (){
            appCompatActivity.getSupportActionBar().hide();
        }
        //关闭虚拟按钮,并设置全屏
        public View closeVirtualButton() {
            /**
             * 如果想全部隐藏虚拟按键,只需要在build.prop中增加qemu.hw.mainkeys=1即可。build.prop在你编译出的文件系统的system目录下。前提需要root权限。
             * 使用案列:new GT.Window(this).closeVirtualButton();
             */
            if (activity != null) view = activity.getWindow().getDecorView();
            if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) {
                view.setSystemUiVisibility(View.GONE);
            } else if (Build.VERSION.SDK_INT >= 19) {
                view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN);
            }

            /**
             * 该方法请在 Activity 中 onCreate 方法里的 super.onCreate(savedInstanceState); 之下 setContentView(R.layout.***); 之前使用
             * 使用案列:new GT.Window(this).setFullScreen();
             */
            activity.requestWindowFeature(android.view.Window.FEATURE_NO_TITLE);
            activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

            return view;
        }



    }

    //设置按钮触摸放大
    public static class ViewTouchMagnify {
        private int viewWidth;		//保存按钮宽度
        private int viewHeight;		//保存按钮高度
        //为按钮设置触摸事件
        @SuppressLint("ClickableViewAccessibility")
        public void touchZoomInView(final View view){
            //设置按钮触摸事件
            view.setOnTouchListener(new View.OnTouchListener() {
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
                    if(arg1.getAction() == MotionEvent.ACTION_DOWN){//如果用户手指触摸屏幕
                        viewWidth = view.getWidth();		//保存按钮的宽度
                        viewHeight = view.getHeight();		//保存按钮的高度
//                        view.setTextSize(18);								//设置按钮放大时字体大小
                        layoutParams.width = viewWidth + 20;				//设置按钮放大时的宽度
                        layoutParams.height = viewHeight + 10;			//设置按钮放大时的高度
                    }
                    else if(arg1.getAction() == MotionEvent.ACTION_UP){//如果用户手指离开屏幕
//                        button.setTextSize(15);							//设置按钮为原来字体大小
                        layoutParams.width = viewWidth;				//设置按钮为原来的宽度
                        layoutParams.height = viewHeight;				//设置按钮为原来的高度
                    }
                    view.setLayoutParams(layoutParams);	//提交事务
                    return false; //设置为未完成消耗掉的时间   如果将此返回为     true  那么按钮的  单击事件将会被屏蔽掉
                }
            });

        }

    }

    //封装 Fragment 类
    public static class GT_Fragment{

        /**
         * add(Fragment fragment, String tag) //  调用add(int, Fragment, String),填入为0的containerViewId.
         * add(int containerViewId, Fragment fragment) // 调用add(int, Fragment, String),填入为null的tag.
         * add(int containerViewId, Fragment fragment, String tag) // 向Activity中添加一个Fragment.
         * addSharedElement(View sharedElement, String name) // 添加共享元素
         * addToBackStack(String name) // 将事务添加到回退栈
         * attach(Fragment fragment) // 重新关联Fragment(当Fragment被detach时)
         * commit() // 提交事务
         * commitAllowingStateLoss() // 类似commit(),但允许在Activity状态保存之后提交(即允许状态丢失)。
         * commitNow() // 同步提交事务
         * commitNowAllowingStateLoss() // 类似commitNow(),但允许在Activity状态保存之后提交(即允许状态丢失)。
         * detach(Fragment fragment) // 将fragment保存的界面从UI中移除
         * disallowAddToBackStack() // 不允许调用addToBackStack(String)操作
         * hide(Fragment fragment) // 隐藏已存在的Fragment
         * isAddToBackStackAllowed() // 是否允许添加到回退栈
         * isEmpty() // 事务是否未包含的任何操作
         * remove(Fragment fragment) // 移除一个已存在的Fragment
         * replace(int containerViewId, Fragment fragment) // 调用replace(int, Fragment, String)填入为null的tag.
         * replace(int containerViewId, Fragment fragment, String tag) // 替换已存在的Fragment
         * setBreadCrumbShortTitle(int res) // 为事务设置一个BreadCrumb短标题
         * setBreadCrumbShortTitle(CharSequence text) // 为事务设置一个BreadCrumb短标题,将会被FragmentBreadCrumbs使用
         * setBreadCrumbTitle(int res) // 为事务设置一个BreadCrumb全标题,将会被FragmentBreadCrumbs使用
         * setBreadCrumbTitle(CharSequence text) // 为事务设置一个BreadCrumb全标题
         * setCustomAnimations(int enter, int exit, int popEnter, int popExit) // 自定义事务进入/退出以及入栈/出栈的动画效果
         * setCustomAnimations(int enter, int exit) // 自定义事务进入/退出的动画效果
         * setTransition(int transit) // 为事务设置一个标准动画
         * setTransitionStyle(int styleRes) // 为事务标准动画设置自定义样式
         * show(Fragment fragment) // 显示一个被隐藏的Fragment
         *
         */

        private Context context;                                //定义 Activity
        private Bundle savedInstanceState;                      //定义 Bundle
        private static FragmentManager supportFragmentManager;  //定义 Fragment 管理器
        private FragmentTransaction transaction;                //定义 Fragment 事务管理器
        private static Object topFragment = null;               //定义 最顶层的 Fragment
        private static Map<Object, Fragment> fragmentMap = new HashMap<>();    //定义容器 map
        private int fragmentLayoutId = 0;


        public GT_Fragment(Bundle savedInstanceState, Context context, FragmentManager supportFragmentManager){
            if(savedInstanceState != null){
                this.savedInstanceState = savedInstanceState;
            }
            if(context != null){
                this.context = context;
            }
            if(supportFragmentManager != null){
                GT_Fragment.supportFragmentManager = supportFragmentManager;
            }
        }//构造方法 初始化 Activity 与 Bundle

        public GT_Fragment initFragment(Map<Object, Fragment> map, int fragmentLayoutId, Object initFragmentLayoutKey){
            if(map != null && savedInstanceState == null){ //如果当前map 不为空 且当前的 Activity 活动为第一次创建
                fragmentMap = map;
                this.fragmentLayoutId = fragmentLayoutId;
                transaction = getTransaction();//获取事务
                for(Object key : fragmentMap.keySet()){
                    transaction.add(fragmentLayoutId, fragmentMap.get(key)).hide(fragmentMap.get(key));//添加 页面 并隐藏
                }
                transaction.show(fragmentMap.get(initFragmentLayoutKey)).commit();//显示 页面1
                topFragment = initFragmentLayoutKey;//记录为 最顶层 Fragment
            }
            return this;
        } //初始化 Fragment

        public GT_Fragment startFragment(Object fragmentKey){
            if(fragmentKey != null && !topFragment.equals(fragmentKey)){    //如果当前要跳转的 Fragment 不是最顶层 且 要跳转的 Fragment 不为空
                transaction = getTransaction();//获取事务
                transaction.hide(fragmentMap.get(topFragment));//隐藏 当前最顶层的 Fragment
                transaction.show(fragmentMap.get(fragmentKey));//显示 当前 Fragment
                topFragment = fragmentKey;//记录为 最顶层 Fragment
                transaction.commit();
            }
            return this;
        }//启动另外一个 Fragment

        //有 bug
       /* public GT_Fragment updateFragment(String key,Fragment newFragment){
            *//** * replace(int containerViewId, Fragment fragment, String tag) // 替换已存在的Fragment *//*
            transaction = getTransaction();//获取事务
            for(Object keys : fragmentMap.keySet()){

                boolean tf = fragmentMap.containsKey(keys);
                if(tf){
                    transaction.remove(fragmentMap.get(key));//删除旧的 Fragment
                    fragmentMap.put(key,newFragment);//添加新的 Fragment
                    transaction.add(fragmentLayoutId, fragmentMap.get(key)).hide(fragmentMap.get(key));//添加 页面 并隐藏
                }


            }


            return this;
        }//更新一个 Fragment*/



        //获取事务
        public FragmentTransaction getTransaction(){
            return supportFragmentManager.beginTransaction();
        }
    }






    /********************************************  设备监听 类 *****************************************************/
    //ScreenListener 监听屏幕状态类
    public static class ScreenListener {

        /**
         * 监听
         * 手机屏幕点亮
         * 手机屏幕锁屏
         * 手机屏幕解锁
         *
         * 使用实例:
         * GT.ScreenListener screenListener  = new GT.ScreenListener(this); //初始化 ScreenListener
         * screenListener.begin(new GT.ScreenListener.ScreenStateListener(){....} //new 一个匿名内部类 即可
         * 在销毁该 Activity 时一定要 调用该方法来注销广播
         * unregisterListener(); 方法来注销该广播
         */

        private Context context2;                                //联系上下文
        private ScreenBroadcastReceiver mScreenReceiver;        //定义一个广播
        private ScreenStateListener mScreenStateListener;       //定义个内部接口
        /**
         * 初始化
         * */
        public ScreenListener(Context context) {
            this.context2 = context;
            mScreenReceiver = new ScreenBroadcastReceiver();//初始化广播
        }

        /**
         * 自定义接口
         * */
        public interface ScreenStateListener{
            void onScreenOn();			//手机屏幕点亮
            void onScreenOff();		    //手机屏幕锁屏
            void onUserPresent();		//手机屏幕解锁
        }

        /**
         * 获取screen的状态
         * */
        private void getScreenState() {
            //初始化powerManager
            PowerManager manager = (PowerManager) context2.getSystemService(Context.POWER_SERVICE);
            if (manager.isScreenOn()){   //如果监听已经开启
                if (mScreenStateListener != null){
                    mScreenStateListener.onScreenOn();
                }
            }else {					  //如果监听没开启
                if (mScreenStateListener != null){
                    mScreenStateListener.onScreenOff();
                }
            }
        }


        /**
         * 写一个内部的广播
         * */
        private class ScreenBroadcastReceiver extends BroadcastReceiver {
            private String action = null;
            @Override
            public void onReceive(Context context, Intent intent) {
                action = intent.getAction();
                if (Intent.ACTION_SCREEN_ON.equals(action)){        //屏幕亮时操作
                    mScreenStateListener.onScreenOn();
                }else if (Intent.ACTION_SCREEN_OFF.equals(action)){   //屏幕关闭时操作
                    mScreenStateListener.onScreenOff();
                }else if (Intent.ACTION_USER_PRESENT.equals(action)) {//解锁时操作
                    mScreenStateListener.onUserPresent();
                }
            }
        }
        /**
         * 开始监听广播状态
         * */
        public void begin(ScreenStateListener listener){
            mScreenStateListener = listener;
            registerListener();							    //注册监听
            getScreenState();								//获取监听
        }
        /**
         * 启动广播接收器
         * */
        private void registerListener() {
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_ON);		    //屏幕亮起时开启的广播
            filter.addAction(Intent.ACTION_SCREEN_OFF);		    //屏幕关闭时开启的广播
            filter.addAction(Intent.ACTION_USER_PRESENT);	    //屏幕解锁时开启的广播
            context2.registerReceiver(mScreenReceiver, filter);	//发送广播

        }

        /**
         * 解除广播
         * */
        public void unregisterListener(){
            context2.unregisterReceiver(mScreenReceiver); //注销广播
        }


    }

    //HeadsetPlugReceiver 监听耳机是否插入
    public static class GT_HeadsetPlugReceiver{

        /**
         * 监听 耳机
         *
         * 使用实例:
         * GT.GT_HeadsetPlugReceiver gt_headsetPlugReceiver = new GT.GT_HeadsetPlugReceiver(this); //初始化 GT_HeadsetPlugReceiver
         * gt_headsetPlugReceiver.isHeadset_TF();    //获取当前耳机的状态  插入则返回 true 否则返回 false
         * 在销毁该 Activity 时一定要 调用该方法来注销广播
         * unregisterListener(); 方法来注销该广播
         */

        private Activity activity;
        private static boolean headset_TF;//定义耳机是否插入
        private HeadsetPlugReceiver headsetPlugReceiver;//监听手机是否有耳机插入广播

        public boolean isHeadset_TF() {
            registerHeadsetPlugReceiver();
            return headset_TF;
        }

        public GT_HeadsetPlugReceiver(Activity activity){
            this.activity = activity;
        }

        public void unregisterListener(){
            activity.unregisterReceiver(headsetPlugReceiver); //注销广播
        }

        public void registerHeadsetPlugReceiver() {
            headsetPlugReceiver = new HeadsetPlugReceiver();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("android.intent.action.HEADSET_PLUG");
            activity.registerReceiver(headsetPlugReceiver, intentFilter);
        }

        private static class HeadsetPlugReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.hasExtra("state")){
                    if (intent.getIntExtra("state", 0) == 0){
                        if(GT_LOG_TF)
                            log_v("耳机测试: 没插入耳机");
                        headset_TF = false;
                    }
                    else if (intent.getIntExtra("state", 0) == 1){
                        if(GT_LOG_TF)
                            log_v("耳机测试: 插入耳机");
                        headset_TF = true;
                    }
                }
            }
        }

    }





    /********************************************  设备属性 类 *****************************************************/
    //AudioManager 安卓手机音量类
    public static class GT_AudioManager{
        /**
         * 提示:再设置音量大小时,请先搞清楚,该音量的最大值
         */
        private AudioManager mAudioManager;//定义 AudioManager
        private Activity activity;//定义 Activity
        private int max;//最大值
        private int current;//当前值
        public GT_AudioManager(Activity activity){
            this.activity = activity;
            mAudioManager = (AudioManager) activity.getSystemService(activity.AUDIO_SERVICE);
        }//初始化

        //获取 通话声音 最大值 与 当前通过的声音值
        public int getVoiceCall(){
            current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
            return current;
        }
        public int getVoiceCallMax(){
            max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
            return max;
        }
        public void setVoiceCallValue(int value){
            mAudioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, value, AudioManager.FLAG_PLAY_SOUND);//设置 通话声音 音量大小为 0 静音
        }//设置 通话声音 的音量

        //获取 系统音量 最大值 与 当前通过的声音值
        public int getVoiceSystem(){
            max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
            current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
            return current;
        }
        public int getVoiceSystemMax(){
            max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
            return max;
        }
        public void setVoiceSystemValue(int value){
            mAudioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, value, AudioManager.FLAG_PLAY_SOUND);//设置 通话声音 音量大小为 0 静音
        }//设置 系统音量 的音量

        //获取 铃声音量 最大值 与 当前通过的声音值
        public int getVoiceRing(){
            current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
            return current;
        }
        public int getVoiceRingMax(){
            max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
            return max;
        }
        public void setVoiceRingValue(int value){
            mAudioManager.setStreamVolume(AudioManager.STREAM_RING, value, AudioManager.FLAG_PLAY_SOUND);//设置 铃声音量 音量大小为 0 静音
        }//设置 铃声音量 的音量

        //获取 音乐音量(多媒体) 最大值 与 当前通过的声音值
        public int getVoiceMusic(){
            current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
            return current;
        }
        public int getVoiceMusicMax(){
            max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
            return max;
        }
        public void setMusicValue(int value){
            mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value, AudioManager.FLAG_PLAY_SOUND);//设置多媒体音量大小为 0 静音
        }//设置 多媒体 的音量

        //获取 提示声音 音量 最大值 与 当前通过的声音值
        public int getVoiceAlarm(){
            current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
            return current;
        }
        public int getVoiceAlarmMax(){
            max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
            return max;
        }
        public void setVoiceAlarmValue(int value){
            mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, value, AudioManager.FLAG_PLAY_SOUND);//设置 铃声音量 音量大小为 0 静音
        }//设置 提示声音 的音量

        public void gemgMusiceNoSet(){
            activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        }//游戏过程中只允许调整多媒体音量,而不允许调整通话音量。

    }

    //获取当前手机信息
    public static class MobilePhoneAttribute {

        //获取手机型号
        public String getModel(){
            return Build.MODEL;
        }

        //获取手机SDK版本号
        public String getSDK(){
            return Build.VERSION.SDK;
        }

        //获取手机系统版本号
        public String getRELEASE(){
            return Build.VERSION.RELEASE;
        }

    }





    /********************************************  多媒体 类 *****************************************************/
    // 播放音乐
    public static class GT_MediaPlayer{

        /**
         *
         * 本类使用案列:
         *  GT.GT_MediaPlayer mediaPlayer = new GT.GT_MediaPlayer(this);//实例化对象
         *  mediaPlayer.loadMusic(R.raw.bg_music);  //加载 或 更新 将要播放的 音频, 此方法可用于 更新接下来要播放的音频
         *  mediaPlayer.play_pause();//暂停 或 播放
         *   mediaPlayer.stop();//停止播放
         *   mediaPlayer.close();//释放资源
         *
         * 相关属性设置
         * int getDuration():获取流媒体的总播放时长,单位是毫秒。
         * int getCurrentPosition():获取当前流媒体的播放的位置,单位是毫秒。
         * void seekTo(int msec):设置当前MediaPlayer的播放位置,单位是毫秒。
         * void setLooping(boolean looping):设置是否循环播放。
         * boolean isLooping():判断是否循环播放。
         * boolean  isPlaying():判断是否正在播放。
         * void prepare():同步的方式装载流媒体文件。
         * void prepareAsync():异步的方式装载流媒体文件。
         * void release ():回收流媒体资源。
         * void setAudioStreamType(int streamtype):设置播放流媒体类型。
         * void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
         * setNextMediaPlayer(MediaPlayer next):设置当前流媒体播放完毕,下一个播放的MediaPlayer。
         */
        private boolean isPlay = true;    //定义是否为可播放状态
        private Activity activity;
        private MediaPlayer mediaPlayer;
        private int resid = 0;
        private String url = null;

        public GT_MediaPlayer(Activity activity){
            this.activity = activity;
        }//初始化 上下文

        public MediaPlayer loadMusic(int resid){
            this.resid = resid;
            if(!isPlay){       //停止过播放
                if(mediaPlayer.isPlaying()){//如果属于播放状态
                    mediaPlayer.stop();//停止播放
                    mediaPlayer.release();//释放资源
                }
            }
            mediaPlayer = null;//清空内存中对象
            mediaPlayer = MediaPlayer.create(activity,resid);    //初始化 MediaPlayer 对象
            isPlay = true;//恢复可播放状态
            return mediaPlayer;
        }//加载 res 目录下的资源文件

        public MediaPlayer loadMusic(String url){
            this.url = url;
            if(!isPlay){       //停止过播放
                if(mediaPlayer.isPlaying()){//如果属于播放状态
                    mediaPlayer.stop();//停止播放
                }
                mediaPlayer.release();//释放资源
            }
            mediaPlayer = null;//清空内存中对象
            mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource(url);
                mediaPlayer.prepare();//预加载音频
            } catch (IOException e) {
//                e.printStackTrace();
                GT.log_e(getLineInfo(),"你的音频资源可能 需要添加 网络或访问SD卡的读取权限,否则无法进行有效的获取资源 url:" + url);
            }
            isPlay = true;//恢复可播放状态
            return mediaPlayer;
        }//获取 网络 或 SD 上的的音频资源

        public MediaPlayer play(){
            if(mediaPlayer != null){
                recover_play();//如果音频被停止了就恢复音频可播放,在进行 start
                mediaPlayer.start();
            }
            return mediaPlayer;
        }//播放

        public MediaPlayer pause(){
            if(mediaPlayer != null){
                mediaPlayer.pause();
            }
            return mediaPlayer;
        }//暂停

        public MediaPlayer play_pause(){
            recover_play();//如果音频被停止了就恢复音频可播放,在进行 start
            if(!mediaPlayer.isPlaying()){        //如果当前的 mediaPlayer 处于暂停状态  且 播放状态为 false 没有在播放
                mediaPlayer.start();//继续播放
            }else{  //当前处于音乐暂停状态
                mediaPlayer.pause();//暂停音乐
            }
            return mediaPlayer;
        }//播放 与 暂停

        public MediaPlayer stop(){
            isPlay = false;//设置为暂停状态
            mediaPlayer.stop();
            return mediaPlayer;
        }//停止音乐

        private MediaPlayer recover_play(){
            if(!isPlay){       //停止过播放
                if(mediaPlayer.isPlaying()){//如果属于播放状态
                    mediaPlayer.stop();//停止播放
                }
                mediaPlayer.release();//释放资源
                mediaPlayer = null;//清空内存中对象
                if(resid != 0){
                    mediaPlayer = MediaPlayer.create(activity, resid);    //初始化 MediaPlayer 对象
                }else if(url != null){
                    mediaPlayer = new MediaPlayer();
                    try {
                        mediaPlayer.setDataSource(url);
                        mediaPlayer.prepare();//预加载音频
                    } catch (IOException e) {
                        GT.log_e(getLineInfo(),"你的音频资源可能 需要添加 网络或访问SD卡的读取权限,否则无法进行有效的获取资源 url:" + url);
                    }
                }
                isPlay = true;//恢复可播放状态
            }
            return mediaPlayer;
        }//恢复可播放

        public void close(){
            if(mediaPlayer.isPlaying()){//如果属于播放状态
                mediaPlayer.stop();//停止播放
            }
            mediaPlayer.release();//释放资源
            mediaPlayer = null;
        }//释放资源



    }

    //播放音频
    public static class GT_SoundPool{

        private Context context;
        private static SoundPool soundPool;
        private AudioAttributes attr = null;
        private static Map<String,Integer> map = new HashMap<>();      //初始化 map  用于存放 音频 key 与 值
        private static Map<String,Integer> mapMusic = new HashMap<>(); //初始化 mapMusic 用于存放待播放的音频

        //初始化 Content
        public GT_SoundPool(Context context){
            this.context = context;
        }

        public GT_SoundPool setAudioAttributes(AudioAttributes attr){
            this.attr = attr;
            return this;
        }//设置音频属性

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public GT_SoundPool loadMusic(Map map){
            if(map != null){
                this.map = map;
                if(attr == null){
                    //设置音效属性 如果为空,就设置默认的音频属性
                    attr = new AudioAttributes.Builder()
                            .setUsage(AudioAttributes.USAGE_GAME)//设置音效的使用场景 为游戏
                            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//设置音效类型
                            .build();
                }

                //初始化
                soundPool = new SoundPool.Builder()
                        .setAudioAttributes(attr)//设置音效池的属性
                        .setMaxStreams(map.size())//最大容纳 动态添加最大值 个音频
                        .build();

                initMusic();//初始化 音频流
            }
            return this;
        }

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public GT_SoundPool addMusic(String key,int rawId){
            if(map != null){
                if(!map.containsKey(key)){ //如果当前 map 中没有此 key
                    map.put(key,rawId); //将值保存到 map 中

                    if(attr == null){
                        //设置音效属性 如果为空,就设置默认的音频属性
                        attr = new AudioAttributes.Builder()
                                .setUsage(AudioAttributes.USAGE_GAME)//设置音效的使用场景 为游戏
                                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)//设置音效类型
                                .build();
                    }

                    //初始化
                    soundPool = new SoundPool.Builder()
                            .setAudioAttributes(attr)//设置音效池的属性
                            .setMaxStreams(map.size())//最大容纳 动态添加最大值 个音频
                            .build();

                    initMusic();//初始化 音频流

                }else{
                    GT.log_v(getLineInfo(),"添加音频无效,当前已经包含相同的 key,无法再进行装载相同的 key");//提示无效的添加
                }
            }
            return this;
        } //添加音频

        private void initMusic(){
            if(map != null){
                for(String key:map.keySet()){
                    mapMusic.put(key,soundPool.load(context, map.get(key),1));//初始化 待播放的音频
                }
            }
        }//初始化音频

        public GT_SoundPool removalMusic(Integer key){
            if(map != null){
                if(map.containsKey(key)){
                    map.remove(key);
                    mapMusic.remove(key);
                    initMusic();//初始化音频
                }else{
                    log_v(getLineInfo(),"移除音频失败,当前并不存在此 key:" + key);
                }
            }
            return this;
        }//移除音频

        public GT_SoundPool clear(){
            if(map != null){
                map.clear();
                mapMusic.clear();
            }
            return this;
        }//清空音频

        public GT_SoundPool updateMusic(String key,Integer rawId){
            if(map != null){
                if(map.containsKey(key)){
                    map.put(key,rawId);
                    mapMusic.put(key,rawId);
                    initMusic();//初始化音频
                }else{
                    GT.log_v(getLineInfo(),"修改音频无效,当前并不存在当前 key,无法进行更新操作");//提示无效的更新
                }
            }
            return this;
        }//修改音频

        //播放音频
        public GT_SoundPool play(String key,boolean loop,float rate){
            //播放所选音频
            soundPool.play(
                    mapMusic.get(key),           //指定播放的音频id
                    1,              //左声道 为0.0 到 1.0
                    1,             //右声道 为0.0 到 1.0
                    0,                 //优先级 0
                    (loop == true ? -1 : 0),    //是否循环 0为不循环, -1 为循环
                    rate                        //速率 为正常速率 1  最低为 0.5,最高为 2
            );

            return this;
        }
    }

    //播放视频
    public static class GT_Video implements SurfaceHolder.Callback{

        /**
         * 使用说明:
         * 第一步:在 xml 中 定义好 SurfaceView 组件
         * 第二步:video = new GT.GT_Video(this,R.raw.lmh,surfaceView);//初始化 GT_Video 视频播放器
         * 第三步:播放 video.play();、暂停 video.pause();、 停止 video.stop();、释放资源 video.close();
         */

        private MediaPlayer mediaPlayer = null;
        private SurfaceView surfaceView;
        private SurfaceHolder surfaceHolder;
        private Context context;
        private int resId;
        private static boolean isPlay = true;   //定义是否被停止播放过视频

        public GT_Video(Context context,int resId,SurfaceView surfaceView){
            this.context = context;
            this.surfaceView = surfaceView;
            this.resId = resId;
            surfaceHolder = this.surfaceView.getHolder();
            surfaceHolder.addCallback(this);
        }

        public GT_Video play(){

            if(mediaPlayer != null){
                recover_play();
                mediaPlayer.start();
            }
            return this;
        }

        public GT_Video pause(){
            if(mediaPlayer != null){
                recover_play();
                mediaPlayer.pause();
            }
            return this;
        }

        public GT_Video stop(){
            if(mediaPlayer != null){
                mediaPlayer.stop();
                isPlay = false;
            }
            return this;
        }


        private MediaPlayer recover_play(){
            if(!isPlay){       //停止过播放
                close();
                mediaPlayer = null;//清空内存中对象
                if(resId != 0){
                    mediaPlayer = MediaPlayer.create(context, resId);//设置加载的视频资源
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    mediaPlayer.setDisplay(surfaceHolder);    //设置显示视频显示在SurfaceView上
                }
                isPlay = true;//恢复可播放状态
            }
            return mediaPlayer;
        }//恢复可播放


        public void close(){
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
            }
            mediaPlayer.release();
        }//释放资源

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            mediaPlayer = MediaPlayer.create(context, resId);//设置加载的视频资源
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDisplay(surfaceHolder);    //设置显示视频显示在SurfaceView上
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {

        }
    }





    /******************************************** Run GT 的内部注解 *****************************************************/
    //注解类
    public static class Annotations{

        //Toast 注解:用于获取调用 GT.Toast的类对象
        @Retention(RetentionPolicy.RUNTIME)
        @Target(value={ElementType.TYPE})
        public @interface Toast {}

    }
    //判断注解类
    public static class AnnotationAssist {

        /**
         * 目的:用于判断 当前类是否被 当前的注解注解过
         * 用例:new GT.AnnotationAssist(LogActivity.class, GT.Annotations.Toast.class);
         * 第一个参数:任意被
         * 再打开 GT 内部的 Log 日志
         */
        @SuppressWarnings("unchecked")
        public AnnotationAssist(Object obj,Object annotation) {

            if(GT_LOG_TF){
                log_i("obj:" + obj);
                log_i("annotation:" + annotation);
            }

            //获取所有注解
            obj = ObjectClassToObject(obj);
            Annotation[] annotations = obj.getClass().getAnnotations();
            if(GT_LOG_TF) log_i("---------------该类有所的注解---------------------");
            for(Annotation annotation1 : annotations) if(GT_LOG_TF) log_i(annotation1);
            if(GT_LOG_TF) log_i("-------------------close--------------------------");


            /*
             * 获取声明注解	[Ljava.lang.annotation.Annotation;@28c97a5
             * 			[Ljava.lang.annotation.Annotation;@28c97a5
             */
            Annotation[] deAnnos = obj.getClass().getDeclaredAnnotations();
            if(GT_LOG_TF) log_i("被声明式注解标识过:" + deAnnos);


            if(annotation != null){
                //获取被 SubAnnotation 注解过的类
                Annotation subAnnotation = obj.getClass().getAnnotation((Class<Annotation>) annotation);
                if(GT_LOG_TF) log_i("该类被 [" + subAnnotation + "] 注解过");
            }

        }

        public Object ObjectClassToObject(Object obj){
            String[] strs = obj.toString().split(" ");
            String str = strs[1];
            Class<?> clazz = getClass();
            try {
                clazz = Class.forName(str);
            } catch (ClassNotFoundException e1) {
                e1.printStackTrace();
            }
            try {
                obj = clazz.newInstance();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
            return obj;
        }

    }

}



猜你喜欢

转载自blog.csdn.net/qq_39799899/article/details/89840263