623 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			623 lines
		
	
	
		
			21 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | package com.novelbook.android.utils; | |||
|  | 
 | |||
|  | import android.app.Activity; | |||
|  | import android.content.Context; | |||
|  | import android.content.pm.ApplicationInfo; | |||
|  | import android.content.pm.PackageInfo; | |||
|  | import android.content.pm.PackageManager; | |||
|  | import android.content.res.Resources; | |||
|  | import android.graphics.Point; | |||
|  | import android.os.Build; | |||
|  | import android.support.v4.app.ActivityCompat; | |||
|  | import android.support.v4.content.ContextCompat; | |||
|  | import android.support.v4.widget.ContentLoadingProgressBar; | |||
|  | import android.text.TextUtils; | |||
|  | import android.util.DisplayMetrics; | |||
|  | import android.util.Log; | |||
|  | import android.util.TypedValue; | |||
|  | import android.view.Display; | |||
|  | import android.view.KeyCharacterMap; | |||
|  | import android.view.KeyEvent; | |||
|  | import android.view.TextureView; | |||
|  | import android.view.ViewConfiguration; | |||
|  | import android.view.Window; | |||
|  | import android.view.WindowManager; | |||
|  | import android.widget.Toast; | |||
|  | 
 | |||
|  | import com.novelbook.android.netsubscribe.BookSubscribe; | |||
|  | import com.novelbook.android.netutils.OnSuccessAndFaultListener; | |||
|  | import com.novelbook.android.netutils.OnSuccessAndFaultSub; | |||
|  | 
 | |||
|  | import java.lang.reflect.InvocationTargetException; | |||
|  | import java.lang.reflect.Method; | |||
|  | import java.security.Timestamp; | |||
|  | import java.text.DateFormat; | |||
|  | import java.text.SimpleDateFormat; | |||
|  | import java.util.Date; | |||
|  | import java.util.Locale; | |||
|  | 
 | |||
|  | 
 | |||
|  | public class CommonUtil { | |||
|  | 
 | |||
|  |     private static final String TAG= CommonUtil.class.getSimpleName(); | |||
|  |     public static int getScreenHeight(Context context){ | |||
|  |         int diff = statusBarDiff(context); | |||
|  |         int ret=0; | |||
|  |         if(diff >0){ | |||
|  |             ret = getRealScreenSize(context).y;// -diff;  // return height for no navigation bar  //有虚拟按键 honor 8 或 没有虚拟按键但顶部有其他占用高度的 mi8 | |||
|  |             Log.d(TAG, String.format("getNavigationBarSize:screen height is getRealScreenSize(context).y -diff = %s , diff is %s" ,ret ,diff)); | |||
|  |         }else { | |||
|  |             ret = getAppUsableScreenSize(context).y;  //return for with navigationbar  //没有虚拟按键 mate20 | |||
|  |             Log.d(TAG, String.format("getNavigationBarSize:screen height is getAppUsableScreenSize(context).y =%s", ret)); | |||
|  |         } | |||
|  | 
 | |||
|  |         return ret; | |||
|  |     } | |||
|  |     /** | |||
|  |      * 获取是否存在NavigationBar | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int statusBarDiff(Context context) { | |||
|  |         Point appUsableSize = getAppUsableScreenSize(context); | |||
|  |         Point realScreenSize = getRealScreenSize(context); | |||
|  | 
 | |||
|  |         Log.d(TAG, String.format("getNavigationBarSize:getDpi %s,getScreenHeightWithOutBottomBar %s, usablesize.y %s,realScreenSize.y %s" + | |||
|  |                         ",realScreenSize.y -usablesize.y =%s, statusbar height %s" | |||
|  |                 ,getDpi(context) ,getScreenHeightWithOutBottomBar(context),appUsableSize.y ,realScreenSize.y, realScreenSize.y-appUsableSize.y ,getStatusBarHeight(context) )); | |||
|  |         Point p = getNavigationBarSize(context); | |||
|  | //        Toast.makeText(context,String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s,diff %s", | |||
|  | //                appUsableSize.y ,realScreenSize.y,realScreenSize.y-appUsableSize.y - getStatusBarHeight(context)),Toast.LENGTH_LONG).show(); | |||
|  |         return   realScreenSize.y-appUsableSize.y - getStatusBarHeight(context); | |||
|  | 
 | |||
|  |     } | |||
|  |     //状态栏高度 | |||
|  |     public static int getStatusBarHeight(Context c) { | |||
|  |         int resourceId = c.getResources() | |||
|  |                 .getIdentifier("status_bar_height", "dimen", "android"); | |||
|  |         if (resourceId > 0) { | |||
|  |             return c.getResources().getDimensionPixelSize(resourceId); | |||
|  |         } | |||
|  |         return 0; | |||
|  |     } | |||
|  |     //返回值就是导航栏的高度,得到的值单位px | |||
|  |     public float getNavigationBarHeight(Context c) { | |||
|  |         float result = 0; | |||
|  |         int resourceId = c.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); | |||
|  |         if (resourceId > 0) { | |||
|  |             result = c.getResources().getDimension(resourceId); | |||
|  |         } | |||
|  |         return result; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static Point getNavigationBarSize(Context context) { | |||
|  |         Point appUsableSize = getAppUsableScreenSize(context); | |||
|  |         Point realScreenSize = getRealScreenSize(context); | |||
|  | 
 | |||
|  |         Log.d(TAG, String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s,realScreenSize.y -usablesize.y =%s, statusbar height %s" | |||
|  |                 ,appUsableSize.y ,realScreenSize.y, realScreenSize.y-appUsableSize.y ,getStatusBarHeight(context) )); | |||
|  |         // navigation bar on the side | |||
|  |         if (appUsableSize.x < realScreenSize.x) { | |||
|  |             return new Point(realScreenSize.x - appUsableSize.x, appUsableSize.y); | |||
|  |         } | |||
|  | 
 | |||
|  |         // navigation bar at the bottom | |||
|  |         if (appUsableSize.y < realScreenSize.y) { | |||
|  |             return new Point(appUsableSize.x, realScreenSize.y - appUsableSize.y); | |||
|  |         } | |||
|  | 
 | |||
|  |         // navigation bar is not present | |||
|  |         return new Point(); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static Point getAppUsableScreenSize(Context context) { | |||
|  |         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); | |||
|  |         Display display = windowManager.getDefaultDisplay(); | |||
|  |         Point size = new Point(); | |||
|  |         display.getSize(size); | |||
|  |         return size; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static Point getRealScreenSize(Context context) { | |||
|  |         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); | |||
|  |         Display display = windowManager.getDefaultDisplay(); | |||
|  |         Point size = new Point(); | |||
|  | 
 | |||
|  |         if (Build.VERSION.SDK_INT >= 17) { | |||
|  |             display.getRealSize(size); | |||
|  |         } else if (Build.VERSION.SDK_INT >= 14) { | |||
|  |             try { | |||
|  |                 size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display); | |||
|  |                 size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display); | |||
|  |             } catch (IllegalAccessException e) {} catch (InvocationTargetException e) {} catch (NoSuchMethodException e) {} | |||
|  |         } | |||
|  | 
 | |||
|  |         return size; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取虚拟功能键高度 | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int getVirtualBarHeigh(Context context) { | |||
|  |         int vh = 0; | |||
|  |         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); | |||
|  |         Display display = windowManager.getDefaultDisplay(); | |||
|  |         DisplayMetrics dm = new DisplayMetrics(); | |||
|  |         try { | |||
|  |             @SuppressWarnings("rawtypes") | |||
|  |             Class c = Class.forName("android.view.Display"); | |||
|  |             @SuppressWarnings("unchecked") | |||
|  |             Method method = c.getMethod("getRealMetrics", DisplayMetrics.class); | |||
|  |             method.invoke(display, dm); | |||
|  |             vh = dm.heightPixels - windowManager.getDefaultDisplay().getHeight(); | |||
|  |         } catch (Exception e) { | |||
|  |             e.printStackTrace(); | |||
|  |         } | |||
|  |         return vh; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取屏幕原始尺寸高度,包括虚拟功能键高度 | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int getDpi(Context context){ | |||
|  |         int dpi = 0; | |||
|  |         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); | |||
|  |         Display display = windowManager.getDefaultDisplay(); | |||
|  |         DisplayMetrics displayMetrics = new DisplayMetrics(); | |||
|  |         @SuppressWarnings("rawtypes") | |||
|  |         Class c; | |||
|  |         try { | |||
|  |             c = Class.forName("android.view.Display"); | |||
|  |             @SuppressWarnings("unchecked") | |||
|  |             Method method = c.getMethod("getRealMetrics",DisplayMetrics.class); | |||
|  |             method.invoke(display, displayMetrics); | |||
|  |             dpi=displayMetrics.heightPixels; | |||
|  |         }catch(Exception e){ | |||
|  |             e.printStackTrace(); | |||
|  |         } | |||
|  |         return dpi; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取 虚拟按键+ 顶部状态栏 + x 的高度 | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static  int getBottomStatusHeight(Context context){ | |||
|  |         int totalHeight = getDpi(context); | |||
|  | 
 | |||
|  |         int contentHeight = getScreenHeight(context); | |||
|  | 
 | |||
|  |         return totalHeight  - contentHeight; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获得屏幕高度 | |||
|  |      * | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int getScreenHeightWithOutBottomBar(Context context) | |||
|  |     { | |||
|  |         WindowManager wm = (WindowManager) context | |||
|  |                 .getSystemService(Context.WINDOW_SERVICE); | |||
|  |         DisplayMetrics outMetrics = new DisplayMetrics(); | |||
|  |         wm.getDefaultDisplay().getMetrics(outMetrics); | |||
|  |         return outMetrics.heightPixels; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 标题栏高度 | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int getTitleHeight(Activity activity){ | |||
|  |         return  activity.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获得状态栏的高度 | |||
|  |      * | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int getStatusHeight(Context context) | |||
|  |     { | |||
|  | 
 | |||
|  |         int statusHeight = -1; | |||
|  |         try | |||
|  |         { | |||
|  |             Class<?> clazz = Class.forName("com.android.internal.R$dimen"); | |||
|  |             Object object = clazz.newInstance(); | |||
|  |             int height = Integer.parseInt(clazz.getField("status_bar_height") | |||
|  |                     .get(object).toString()); | |||
|  |             statusHeight = context.getResources().getDimensionPixelSize(height); | |||
|  |         } catch (Exception e) | |||
|  |         { | |||
|  |             e.printStackTrace(); | |||
|  |         } | |||
|  |         return statusHeight; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static int getAPIVersion(){ | |||
|  |         int APIVersion; | |||
|  |         try { | |||
|  |             APIVersion = Integer.valueOf(android.os.Build.VERSION.SDK); | |||
|  |         } catch (NumberFormatException e) { | |||
|  |             APIVersion = 0; | |||
|  |         } | |||
|  |         return APIVersion; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * | |||
|  |      * @param context | |||
|  |      * @param px | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static float convertPixelsToDp(final Context context, final float px) { | |||
|  |         return px / context.getResources().getDisplayMetrics().density; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * | |||
|  |      * @param context | |||
|  |      * @param dp | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static float convertDpToPixel(final Context context, final float dp) { | |||
|  |         return dp * context.getResources().getDisplayMetrics().density; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * sp转px | |||
|  |      * | |||
|  |      * @param context | |||
|  |      * @param spVal | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static int sp2px(Context context, float spVal) | |||
|  |     { | |||
|  |         return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, | |||
|  |                 spVal, context.getResources().getDisplayMetrics()); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * px转sp | |||
|  |      * | |||
|  |      * @param context | |||
|  |      * @param pxVal | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static float px2sp(Context context, float pxVal) | |||
|  |     { | |||
|  |         return (pxVal / context.getResources().getDisplayMetrics().scaledDensity); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static String subString(String text,int num){ | |||
|  |         String content = ""; | |||
|  |         if (text.length() > num){ | |||
|  |             content = text.substring(0,num -1) + "..."; | |||
|  |         }else{ | |||
|  |             content = text; | |||
|  |         } | |||
|  | 
 | |||
|  |         return content; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取版本号 | |||
|  |      * | |||
|  |      * @return 当前应用的版本号 | |||
|  |      */ | |||
|  | 
 | |||
|  |     public static String getVersion(Context context) { | |||
|  |         try { | |||
|  |             PackageManager manager = context.getPackageManager(); | |||
|  |             PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); | |||
|  |             return info.versionName; | |||
|  |         } catch (Exception e) { | |||
|  |             e.printStackTrace(); | |||
|  |             return "找不到版本号"; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @return 版本号 | |||
|  |      */ | |||
|  |     public static int getVersionCode(Context context) { | |||
|  |         try { | |||
|  |             PackageManager manager = context.getPackageManager(); | |||
|  |             PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); | |||
|  |             return info.versionCode; | |||
|  |         } catch (Exception e) { | |||
|  |             e.printStackTrace(); | |||
|  |             return 0; | |||
|  |         } | |||
|  |     } | |||
|  |     public static int getVersionCodeLong(Context context) { | |||
|  |         if(Constants.version >0){ | |||
|  |             return Constants.version; | |||
|  |         } | |||
|  |         try { | |||
|  |             PackageManager manager = context.getPackageManager(); | |||
|  |             PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); | |||
|  |             Constants.version = (int) info.getLongVersionCode(); | |||
|  |         } catch (Exception e) { | |||
|  |             e.printStackTrace(); | |||
|  |             return 0; | |||
|  |         }catch (NoSuchMethodError e){ | |||
|  |             e.printStackTrace(); | |||
|  |             return 0; | |||
|  |         } | |||
|  |         return  Constants.version; | |||
|  |     } | |||
|  |     public static String  getPackageName(Context context) { | |||
|  |         try { | |||
|  | 
 | |||
|  |             return context.getPackageName(); | |||
|  |         } catch (Exception e) { | |||
|  |             e.printStackTrace(); | |||
|  |             return ""; | |||
|  |         }catch (NoSuchMethodError e){ | |||
|  |             e.printStackTrace(); | |||
|  |             return ""; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取当前手机系统语言。 | |||
|  |      * | |||
|  |      * @return 返回当前系统语言。例如:当前设置的是“中文-中国”,则返回“zh-CN” | |||
|  |      */ | |||
|  |     public static String getSystemLanguage() { | |||
|  |         return Locale.getDefault().getLanguage(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取当前系统上的语言列表(Locale列表) | |||
|  |      * | |||
|  |      * @return  语言列表 | |||
|  |      */ | |||
|  |     public static Locale[] getSystemLanguageList() { | |||
|  |         return Locale.getAvailableLocales(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取当前手机系统版本号 | |||
|  |      * | |||
|  |      * @return  系统版本号 | |||
|  |      */ | |||
|  |     public static String getSystemVersion() { | |||
|  |         return android.os.Build.VERSION.RELEASE; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取手机型号 | |||
|  |      * | |||
|  |      * @return  手机型号 | |||
|  |      */ | |||
|  |     public static String getSystemModel() { | |||
|  |         return android.os.Build.MODEL; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取手机厂商 | |||
|  |      * | |||
|  |      * @return  手机厂商 | |||
|  |      */ | |||
|  |     public static String getDeviceBrand() { | |||
|  |         return android.os.Build.BRAND; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取APP版本 | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |     public static String getVersionName(Context context) { | |||
|  |         PackageManager packageManager = context.getPackageManager(); | |||
|  |         PackageInfo packageInfo; | |||
|  |         String versionName = ""; | |||
|  |         try { | |||
|  |             packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); | |||
|  |             versionName = packageInfo.versionName; | |||
|  |         } catch (PackageManager.NameNotFoundException e) { | |||
|  |             e.printStackTrace(); | |||
|  |         } | |||
|  |         return versionName; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static String getDateString(long time,String format){ | |||
|  |         String f = TextUtils.isEmpty(format) ?"yyyy年MM月dd日 HH:mm:ss":format; | |||
|  | 
 | |||
|  |         Date dt = new Date(time); | |||
|  |         SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); | |||
|  |       String rt =sdf.format(dt); | |||
|  |        Log.d(TAG, String.format("getDateString:timestamp %s, formated time %s",time,rt)); | |||
|  |          /*  long time2 =System.currentTimeMillis(); | |||
|  |         dt = new Date(time2); | |||
|  |         rt =sdf.format(dt); | |||
|  |         Log.d(TAG, String.format("getDateString:timestamp %s, formated time %s",time2,rt));*/ | |||
|  |         return sdf.format(dt); | |||
|  | 
 | |||
|  |        /* Timestamp ts = new Timestamp(time); | |||
|  |         String tsStr = ""; | |||
|  |         DateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); | |||
|  |         try { | |||
|  |             //方法一 | |||
|  |             tsStr = sdf2.format(ts); | |||
|  |             System.out.println(tsStr); | |||
|  |             //方法二 | |||
|  |             tsStr = ts.toString(); | |||
|  |             System.out.println(tsStr); | |||
|  |         } catch (Exception e) { | |||
|  |             e.printStackTrace(); | |||
|  |         }*/ | |||
|  | 
 | |||
|  |     } | |||
|  |     public static String getDateString(long time){ | |||
|  | 
 | |||
|  |         return getDateString(time,""); | |||
|  |     } | |||
|  | 
 | |||
|  |     public static String getTimeCnt4Read(Long time,boolean isIncludeSec) | |||
|  |     { | |||
|  |         int ish = (int) (time/1000/60/60); | |||
|  |         int ism = (int) ((time - ish*3600*1000)/1000/60); | |||
|  |         int iss = (int) ((time -ish*3600*1000 - ism*60*1000)/1000); | |||
|  | //			 int ish =Integer.valueOf(String.valueOf(hour)); | |||
|  | //			 int ism =  Integer.valueOf(String.valueOf(minute)); | |||
|  | //			 int iss = Integer.valueOf(String.valueOf(second)); | |||
|  |         String sh =   String.valueOf( ish>0 ?ish+"小时" :"")  ; | |||
|  |         String sm =   String.valueOf(ism>0 ? ism +"分" :"") ; | |||
|  |         String ss =   String.valueOf(iss>=0 ?iss +"秒":""  ) ; | |||
|  | //			 if (10>ish && ish>0)sh ="0"+sh; | |||
|  |         if (ish>0&& 10>ism && ism>0)sm ="0"+sm; | |||
|  |         if (ism>0 && 10>iss && iss>0)ss ="0"+ss; | |||
|  | 
 | |||
|  |         if(!isIncludeSec) | |||
|  |             return sh    + sm +(ish==0?(ism>0 ? "钟" :""):""); | |||
|  | 
 | |||
|  |         return sh  + sm +ss; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static int getDayscnt(Long time ) | |||
|  |     { | |||
|  |         int days =(int) (time/1000/60/60/24); | |||
|  |         if(days>0){ | |||
|  |             days++; | |||
|  |         } | |||
|  |         return days; | |||
|  |     } | |||
|  | 
 | |||
|  |     public static String getFileName() { | |||
|  |         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); | |||
|  |         String date = format.format(new Date(System.currentTimeMillis())); | |||
|  |         return date;// 2012年10月03日 23:41:31 | |||
|  |     } | |||
|  | 
 | |||
|  |     public static String getDateEN() { | |||
|  |         SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |||
|  |         String date1 = format1.format(new Date(System.currentTimeMillis())); | |||
|  |         return date1;// 2012-10-03 23:41:31 | |||
|  |     } | |||
|  |     public static String getChannel(Context context) { | |||
|  |         try { | |||
|  |             PackageManager pm = context.getPackageManager(); | |||
|  |             ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(context), PackageManager.GET_META_DATA); | |||
|  |             return appInfo.metaData.getString("UMENG_CHANNEL"); | |||
|  |         } catch (PackageManager.NameNotFoundException ignored) { | |||
|  |         } | |||
|  |         return ""; | |||
|  |     } | |||
|  |     public static  String getMeta(Context context,String key) { | |||
|  |         try { | |||
|  |             PackageManager pm = context.getPackageManager(); | |||
|  |             ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(context), PackageManager.GET_META_DATA); | |||
|  |             return appInfo.metaData.getString(key); | |||
|  |         } catch (PackageManager.NameNotFoundException ignored) { | |||
|  |         } | |||
|  |         return ""; | |||
|  |     } | |||
|  |     public static void checkPermission (Activity thisActivity, String permission, int requestCode, String errorText) { | |||
|  |         //判断当前Activity是否已经获得了该权限 | |||
|  |         if(ContextCompat.checkSelfPermission(thisActivity,permission) != PackageManager.PERMISSION_GRANTED) { | |||
|  |             //如果App的权限申请曾经被用户拒绝过,就需要在这里跟用户做出解释 | |||
|  |             if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, | |||
|  |                     permission)) { | |||
|  |                 Toast.makeText(thisActivity,errorText,Toast.LENGTH_SHORT).show(); | |||
|  |                 //进行权限请求 | |||
|  |                 ActivityCompat.requestPermissions(thisActivity, | |||
|  |                         new String[]{permission}, | |||
|  |                         requestCode); | |||
|  |             } else { | |||
|  |                 //进行权限请求 | |||
|  |                 ActivityCompat.requestPermissions(thisActivity, | |||
|  |                         new String[]{permission}, | |||
|  |                         requestCode); | |||
|  |             } | |||
|  |         } else { | |||
|  | 
 | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |    public static void getSearchTabTtitle(Context context){ | |||
|  | 
 | |||
|  |         BookSubscribe.getSearchTitles(Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { | |||
|  |             @Override | |||
|  |             public void onSuccess(String result) { | |||
|  | 
 | |||
|  |                 // mFirstPage= gson.fromJson(result, FirstPage.class); | |||
|  |                 try { | |||
|  | 
 | |||
|  |                     Constants.lstSex = GsonUtil.parserStringBlocks(result,"sex"); | |||
|  |                     Constants.lstNt =GsonUtil.parserStringBlocks(result,"nt"); | |||
|  |                     Constants.lstProgressType =GsonUtil.parserProgressType(result,"progress"); | |||
|  | 
 | |||
|  |                     //  initTabs(); | |||
|  |                     //   loadSearchData(); | |||
|  |                 } catch (Exception e) { | |||
|  |                     Log.e(TAG, "onSuccess: prepare book",e ); | |||
|  |                     e.printStackTrace(); | |||
|  |                 } | |||
|  | 
 | |||
|  | 
 | |||
|  |             } | |||
|  | 
 | |||
|  |             @Override | |||
|  |             public void onFault(String errorMsg) { | |||
|  |                 //失败 | |||
|  | 
 | |||
|  |                 //  getSearchTabTtitle(); | |||
|  | 
 | |||
|  |             } | |||
|  |         },context)); | |||
|  | 
 | |||
|  |     } | |||
|  | /*    public static boolean isNavigationBarShow(){ | |||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { | |||
|  |             Display display = getActivity().getWindowManager().getDefaultDisplay(); | |||
|  |             Point size = new Point(); | |||
|  |             Point realSize = new Point(); | |||
|  |             display.getSize(size); | |||
|  |             display.getRealSize(realSize); | |||
|  |             boolean  result  = realSize.y!=size.y; | |||
|  |             return realSize.y!=size.y; | |||
|  |         }else { | |||
|  |             boolean menu = ViewConfiguration.get(getActivity()).hasPermanentMenuKey(); | |||
|  |             boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); | |||
|  |             if(menu || back) { | |||
|  |                 return false; | |||
|  |             }else { | |||
|  |                 return true; | |||
|  |             } | |||
|  |         } | |||
|  |     }*/ | |||
|  | 
 | |||
|  |     /** | |||
|  |      * 获取是否有虚拟按键 | |||
|  |      * 通过判断是否有物理返回键反向判断是否有虚拟按键 | |||
|  |      * mate20 不行 | |||
|  |      * @param context | |||
|  |      * @return | |||
|  |      */ | |||
|  |    /* public static boolean checkDeviceHasNavigationBar2(Context context) { | |||
|  | 
 | |||
|  |         boolean hasMenuKey = ViewConfiguration.get(context) | |||
|  |                 .hasPermanentMenuKey(); | |||
|  |         boolean hasBackKey = KeyCharacterMap | |||
|  |                 .deviceHasKey(KeyEvent.KEYCODE_BACK); | |||
|  |         if (!hasMenuKey & !hasBackKey) { | |||
|  |             // 做任何你需要做的,这个设备有一个导航栏 | |||
|  |             return true; | |||
|  |         } | |||
|  |         return false; | |||
|  |     } | |||
|  | */ | |||
|  | 
 | |||
|  | } |