release IcAkLauncher V163
authorsnickersun <scy@incartech.cn>
Thu, 22 Oct 2020 04:06:55 +0000 (12:06 +0800)
committersnickersun <scy@incartech.cn>
Thu, 22 Oct 2020 04:06:55 +0000 (12:06 +0800)
1、日志重定向到/sdcard/Android/ic/com.ic.ak.launcher
2、back执行finish Dialog

app/libs/android-logging-log4j-1.0.3.jar [new file with mode: 0644]
app/libs/ftp4j-1.7.2.jar [new file with mode: 0644]
app/libs/log4j-1.2.17.jar [new file with mode: 0644]
app/release/ICAkLauncher_V163_202010221200_release.apk [moved from app/release/ICAkLauncher_V161_202010211934_release.apk with 53% similarity]
app/release/output-metadata.json
app/src/main/java/com/ic/ak/launcher/LauncherApp.java
app/src/main/java/com/ic/ak/launcher/ui/DialogActivity.java
app/src/main/java/com/ic/ak/launcher/util/ICLogger.java [new file with mode: 0644]
app/src/main/java/com/ic/ak/launcher/util/IcLog.java
app/src/main/java/com/ic/ak/launcher/util/StorageUtils.java [new file with mode: 0644]
app/version_code.properties

diff --git a/app/libs/android-logging-log4j-1.0.3.jar b/app/libs/android-logging-log4j-1.0.3.jar
new file mode 100644 (file)
index 0000000..7d4146f
Binary files /dev/null and b/app/libs/android-logging-log4j-1.0.3.jar differ
diff --git a/app/libs/ftp4j-1.7.2.jar b/app/libs/ftp4j-1.7.2.jar
new file mode 100644 (file)
index 0000000..fca26ec
Binary files /dev/null and b/app/libs/ftp4j-1.7.2.jar differ
diff --git a/app/libs/log4j-1.2.17.jar b/app/libs/log4j-1.2.17.jar
new file mode 100644 (file)
index 0000000..068867e
Binary files /dev/null and b/app/libs/log4j-1.2.17.jar differ
similarity index 53%
rename from app/release/ICAkLauncher_V161_202010211934_release.apk
rename to app/release/ICAkLauncher_V163_202010221200_release.apk
index 4ab0614..5606237 100644 (file)
Binary files a/app/release/ICAkLauncher_V161_202010211934_release.apk and b/app/release/ICAkLauncher_V163_202010221200_release.apk differ
index daf8a38..407179f 100644 (file)
       "type": "SINGLE",
       "filters": [],
       "properties": [],
-      "versionCode": 161,
-      "versionName": "202010211934",
+      "versionCode": 163,
+      "versionName": "202010221200",
       "enabled": true,
-      "outputFile": "ICAkLauncher_V161_202010211934_release.apk"
+      "outputFile": "ICAkLauncher_V163_202010221200_release.apk"
     }
   ]
 }
\ No newline at end of file
index bc7c011..785b279 100644 (file)
@@ -11,6 +11,7 @@ import com.ic.ak.launcher.data.hardware.HardwareDispose;
 import com.ic.ak.launcher.data.phone.PhoneDispose;
 import com.ic.ak.launcher.data.time.TimeDispose;
 import com.ic.ak.launcher.util.CrashHandler;
+import com.ic.ak.launcher.util.ICLogger;
 import com.ic.ak.launcher.util.IcLog;
 import com.jakewharton.threetenabp.AndroidThreeTen;
 
@@ -30,6 +31,7 @@ public class LauncherApp extends Application {
     @Override
     public void onCreate() {
         super.onCreate();
+        ICLogger.setContext(this);
         CrashHandler crashHandler = CrashHandler.getInstance();
         crashHandler.init(getApplicationContext());
 
index f84a1f0..f68c95b 100644 (file)
@@ -51,7 +51,7 @@ public class DialogActivity extends AppCompatActivity {
         IcLog.i(DialogActivity.class.getSimpleName(),"keyCode "+keyCode+" "+event.getKeyCode());
 
         if(keyCode==KeyEvent.KEYCODE_BACK || keyCode==KeyEvent.KEYCODE_HOME){
-  //          this.finish();
+            this.finish();
             IcLog.i(DialogActivity.class.getSimpleName(),"finish!");
         }
         return true;
diff --git a/app/src/main/java/com/ic/ak/launcher/util/ICLogger.java b/app/src/main/java/com/ic/ak/launcher/util/ICLogger.java
new file mode 100644 (file)
index 0000000..7677e48
--- /dev/null
@@ -0,0 +1,314 @@
+package com.ic.ak.launcher.util;\r
+\r
+import android.content.Context;\r
+\r
+import org.apache.log4j.Level;\r
+import org.apache.log4j.Logger;\r
+import org.apache.log4j.PatternLayout;\r
+import org.apache.log4j.RollingFileAppender;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.OutputStream;\r
+import java.io.PrintStream;\r
+\r
+import de.mindpipe.android.logging.log4j.LogConfigurator;\r
+\r
+\r
+public class ICLogger {\r
+\r
+    private static boolean isInitConfig = false;\r
+    private static Context mContext=null;\r
+\r
+  private static Logger Log = null;\r
+//  private static Logger GPS = null;\r
+//  private static Logger Nmea = null;\r
+//  private static Logger APILog = null;\r
+//  private static Logger alarmCycle = null;\r
+//  private static Logger Battery = null;\r
+//  private static Logger LBS = null;\r
+  //  private static java.util.logging.Logger originLog= java.util.logging.Logger.getLogger(ICLogger.class.getSimpleName());\r
+  private static final boolean DEBUG = true;   //BuildConfig.DEBUG;\r
+\r
+  public static void setContext(Context context){\r
+    mContext=context;\r
+  }\r
+  private static String getFunctionName() {\r
+    StackTraceElement[] currentStack = Thread.currentThread().getStackTrace();\r
+    if (currentStack == null) {\r
+      return null;\r
+    } else {\r
+      int stackLen = currentStack.length;\r
+\r
+      for(int i = 0; i < stackLen; ++i) {\r
+        StackTraceElement stackElement = currentStack[i];\r
+        if (!stackElement.isNativeMethod() && !stackElement.getClassName().equals(Thread.class.getName()) && !stackElement.getClassName().equals(ICLogger.class.getName())) {\r
+          StringBuilder sb = new StringBuilder();\r
+          sb.append("[ ");\r
+          sb.append(Thread.currentThread().getName());\r
+          sb.append(": ");\r
+          sb.append(stackElement.getFileName());\r
+          sb.append(":");\r
+          sb.append(stackElement.getLineNumber());\r
+          sb.append(" ");\r
+          sb.append(stackElement.getMethodName());\r
+          sb.append(" ]");\r
+          return sb.toString();\r
+        }\r
+      }\r
+\r
+      return null;\r
+    }\r
+  }\r
+\r
+  /**\r
+   初始化与配置Logger   Log4j\r
+   日志信息格式中符号所代表的含义\r
+   (1)-X号: X信息输出时左对齐。\r
+   (2)%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。\r
+   (3)%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921。\r
+   (4)%r: 输出自应用启动到输出该log信息耗费的毫秒数。\r
+   (5)%c: 输出日志信息所属的类目,通常就是所在类的全名。\r
+   (6)%t: 输出产生该日志事件的线程名。\r
+   (7)%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)。\r
+   (8)%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。\r
+   (9)%%: 输出一个"%"字符。\r
+   (10)%F: 输出日志消息产生时所在的文件名称。\r
+   (11)%L: 输出代码中的行号。\r
+   (12)%m: 输出代码中指定的消息,产生的日志具体信息。\r
+   (13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。\r
+   可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:\r
+   (1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。\r
+   (2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。\r
+   (3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。\r
+   (4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。\r
+   */\r
+    private static void initConfig() {\r
+      if (!isInitConfig) {\r
+\r
+        LogConfigurator logConfigurator = new LogConfigurator();\r
+\r
+        String filename=StorageUtils.getExternalStorageLogDir(mContext)+ File.separator + "log.txt";\r
+        logConfigurator.setFileName(filename);                         // 日志存储路径,如果该路径没有会自动创建文件\r
+        logConfigurator.setRootLevel(Level.ALL);\r
+\r
+        logConfigurator.setLevel("log", Level.ALL);\r
+//        logConfigurator.setFilePattern("%d %-5p [%c{2}]-[%L] %m%n");// 设置文件输出模式\r
+        logConfigurator.setFilePattern("%d %m%n ");// 设置文件输出模式\r
+//        02-29 16:28:38.195 4629-4658/com.enqualcomm.support E/com.enqualcomm.support.utils.ICLogger:\r
+        logConfigurator.setMaxBackupSize(2); // 设置最大备份数量\r
+        logConfigurator.setMaxFileSize(1024 * 1024 * 20);// 设置最大文件大小  20MB\r
+        logConfigurator.setImmediateFlush(true);// 设置是否立即刷新\r
+        logConfigurator.setUseFileAppender(true); // 设置用户文件输出器\r
+        logConfigurator.setInternalDebugging(false); //控制console是否输出\r
+        logConfigurator.setUseLogCatAppender(true);\r
+        logConfigurator.setLogCatPattern("%m%n");\r
+        logConfigurator.configure();// 设置提交\r
+\r
+\r
+//        String logfilelist[]={"Log","GPS","Nmea","APILog","alarmCycle","Battery","LBS"};\r
+\r
+        //Log 和log目前是同一个配置\r
+        Log = Logger.getLogger("log");\r
+        Log.info("init Logger "+Log.getName());\r
+//        Log.addAppender( getRollingFileAppender("log","%d %m%n "));\r
+//        Log.info("init Logger "+Log.getName()+" "+((RollingFileAppender)Log.getAppender("log")).getFile());\r
+\r
+//        GPS = Logger.getLogger("GPS");\r
+//        GPS.addAppender( getRollingFileAppender("GPS","%d %m%n "));\r
+//        GPS.info("init Logger "+GPS.getName()+" "+((RollingFileAppender)GPS.getAppender("GPS")).getFile());\r
+//\r
+//        Nmea = Logger.getLogger("Nmea");\r
+//        Nmea.addAppender( getRollingFileAppender("Nmea","%m%n"));\r
+//        Nmea.info("init Logger "+Nmea.getName()+" "+((RollingFileAppender)Nmea.getAppender("Nmea")).getFile());\r
+//\r
+//        APILog = Logger.getLogger("APILog");\r
+//        APILog.addAppender( getRollingFileAppender("APILog","%d %m%n "));\r
+//        APILog.info("init Logger "+APILog.getName()+" "+((RollingFileAppender)APILog.getAppender("APILog")).getFile());\r
+//\r
+//        alarmCycle = Logger.getLogger("alarmCycle");\r
+//        alarmCycle.addAppender( getRollingFileAppender("alarmCycle","%d %m%n "));\r
+//        alarmCycle.info("init Logger "+alarmCycle.getName()+" "+((RollingFileAppender)alarmCycle.getAppender("alarmCycle")).getFile());\r
+//\r
+//        Battery = Logger.getLogger("Battery");\r
+//        Battery.addAppender( getRollingFileAppender("Battery","%d %m%n "));\r
+//        Battery.info("init Logger "+Battery.getName()+" "+((RollingFileAppender)Battery.getAppender("Battery")).getFile());\r
+//\r
+//\r
+//        LBS = Logger.getLogger("LBS");\r
+//        LBS.addAppender( getRollingFileAppender("LBS","%d %m%n "));\r
+//        LBS.info("init Logger "+LBS.getName()+" "+((RollingFileAppender)LBS.getAppender("LBS")).getFile());\r
+        isInitConfig = true;\r
+      }\r
+    }\r
+\r
+    public static void logRAWtoFile(String filename, String msg){\r
+//      if (filename.equals("Nmea")){\r
+//        Nmea.info(msg);\r
+//      }else if  (filename.equals("LBS")) {\r
+//        LBS.info(msg);\r
+//      }else if  (filename.equals("GPS")) {\r
+//        GPS.info(msg);\r
+//      }else if  (filename.equals("APILog")) {\r
+//        APILog.info(msg);\r
+//      }else if  (filename.equals("alarmCycle")) {\r
+//        alarmCycle.info(msg);\r
+//      }else if  (filename.equals("Battery")) {\r
+//        Battery.info(msg);\r
+//      }else {\r
+        Log.info(msg);\r
+//      }\r
+    }\r
+  public static void logToFile(String filename, String msg){\r
+//    if (filename.equals("Nmea")){\r
+//      Nmea.info(msg);\r
+//    }else if  (filename.equals("LBS")) {\r
+//      LBS.info(msg);\r
+//    }else if  (filename.equals("GPS")) {\r
+//      GPS.info(msg);\r
+//    }else if  (filename.equals("APILog")) {\r
+//      APILog.info(msg);\r
+//    }else if  (filename.equals("alarmCycle")) {\r
+//      alarmCycle.info(msg);\r
+//    }else if  (filename.equals("Battery")) {\r
+//      Battery.info(msg);\r
+//    }else {\r
+      Log.info(msg);\r
+//    }\r
+  }\r
+    private static  RollingFileAppender getRollingFileAppender(String name, String layoutpattern){\r
+      PatternLayout fileLayout = new PatternLayout(layoutpattern);\r
+      String filename=StorageUtils.getExternalStorageLogDir(mContext)+ File.separator + name+".txt";\r
+      RollingFileAppender rollingFileAppender= null;\r
+      try {\r
+        rollingFileAppender = new RollingFileAppender(fileLayout,filename);\r
+      } catch (IOException e) {\r
+        e.printStackTrace();\r
+        return null;\r
+      }\r
+      rollingFileAppender.setName(name);\r
+      rollingFileAppender.setMaxBackupIndex(2);  //最多3个备份文件\r
+      rollingFileAppender.setMaximumFileSize(10*1024*1024); //10M 大小\r
+      rollingFileAppender.setImmediateFlush(true);\r
+\r
+      return rollingFileAppender;\r
+    }\r
+\r
+    public static void v(String msg) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.debug(buildMessage(msg));\r
+    }\r
+\r
+    public static void v(String msg, Throwable thr) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.debug(buildMessage(msg), thr);\r
+    }\r
+\r
+    public static void d(String msg) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.debug(buildMessage(msg));\r
+    }\r
+\r
+    public static void d(String msg, Throwable thr) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.debug(buildMessage(msg), thr);\r
+    }\r
+\r
+    public static void i(String msg) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.info(buildMessage(msg));\r
+    }\r
+\r
+    public static void i(String msg, Throwable thr) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.info(buildMessage(msg), thr);\r
+    }\r
+\r
+    public static void w(String msg) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.warn(buildMessage(msg));\r
+    }\r
+\r
+    public static void w(String msg, Throwable thr) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.warn(buildMessage(msg), thr);\r
+    }\r
+\r
+    public static void w(Throwable thr) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.warn(buildMessage(""), thr);\r
+    }\r
+\r
+    public static void e(String msg) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.error(buildMessage(msg));\r
+    }\r
+\r
+    public static void e(String msg, Throwable thr) {\r
+      initConfig();\r
+      if (Log!=null)\r
+        Log.error(buildMessage(msg), thr);\r
+    }\r
+\r
+    public static void PrintExceptionStackTrace(Exception e){\r
+\r
+      StringBuffer sb=new StringBuffer();\r
+      sb.append(e.getMessage()).append("\n");\r
+      e.printStackTrace(new PrintStream(new OutputStream() {\r
+        @Override\r
+        public void write(int b) throws IOException {\r
+          sb.append((char)b);\r
+        }\r
+      }));\r
+      i(sb.toString());\r
+    }\r
+\r
+    /**\r
+     * 生成消息\r
+     * @param msg\r
+     * @return\r
+     */\r
+    protected static String buildMessage(String msg) {\r
+      initConfig();\r
+      if (DEBUG && msg !=null) {\r
+        String var1 = getFunctionName();\r
+        if (var1 != null) {\r
+          StringBuilder sb = new StringBuilder();\r
+          sb.append(var1);\r
+          sb.append(" - ");\r
+          sb.append(msg);\r
+          return sb.toString();\r
+        }else{\r
+          return "msg is null";\r
+        }\r
+      }else{\r
+        return "msg is null";\r
+      }\r
+    }\r
+  public static  void log(String TAG, String msg) {\r
+    if (DEBUG) {\r
+      if (Log!=null)Log.debug(TAG+ " "+msg);\r
+\r
+    }\r
+  }\r
+\r
+  public static void log(String TAG, String funcName, String msg) {\r
+    if (DEBUG) {\r
+      if (Log!=null)\r
+        Log.debug(TAG + " [" + funcName + "]" + msg);\r
+\r
+    }\r
+  }\r
+\r
+}\r
+\r
index 3d2f5b7..a536b06 100644 (file)
@@ -17,31 +17,31 @@ public class IcLog {
 
     public static void v(String tag, String msg) {
         if (isDebug) {
-            Log.v(mergeHeadTag(tag), msg);
+            ICLogger.v(mergeHeadTag(tag)+" "+ msg);
         }
     }
 
     public static void d(String tag, String msg) {
         if (isDebug) {
-            Log.d(mergeHeadTag(tag), msg);
+            ICLogger.d(mergeHeadTag(tag)+" "+ msg);
         }
     }
 
     public static void i(String tag, String msg) {
         if (isDebug) {
-            Log.i(mergeHeadTag(tag), msg);
+            ICLogger.i(mergeHeadTag(tag)+" "+ msg);
         }
     }
 
     public static void w(String tag, String msg) {
         if (isDebug) {
-            Log.w(mergeHeadTag(tag), msg);
+            ICLogger.w(mergeHeadTag(tag)+" "+ msg);
         }
     }
 
     public static void e(String tag, String msg,Throwable e) {
         if (isDebug) {
-            Log.e(mergeHeadTag(tag), msg,e);
+            ICLogger.e(mergeHeadTag(tag)+" "+ msg,e);
         }
     }
 
diff --git a/app/src/main/java/com/ic/ak/launcher/util/StorageUtils.java b/app/src/main/java/com/ic/ak/launcher/util/StorageUtils.java
new file mode 100644 (file)
index 0000000..d291d14
--- /dev/null
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright 2011-2013 Sergey Tarasevich
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *******************************************************************************/
+package com.ic.ak.launcher.util;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Environment;
+import android.os.StatFs;
+
+import com.ic.ak.launcher.BuildConfig;
+import com.ic.ak.launcher.data.app.AppConfig;
+
+import java.io.File;
+import java.io.IOException;
+
+import static android.os.Environment.MEDIA_MOUNTED;
+
+/**
+ * Provides application storage paths
+ *
+ * @author Sergey Tarasevich (nostra13[at]gmail[dot]com)
+ * @since 1.0.0
+ */
+public final class StorageUtils {
+
+       private static final String EXTERNAL_STORAGE_PERMISSION = "android.permission.WRITE_EXTERNAL_STORAGE";
+       private static final String INDIVIDUAL_DIR_NAME = "uil-images";
+
+       private StorageUtils() {
+       }
+
+       public static String getExternalStorageLogDir(Context context) {
+
+               if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+                       File dir = new File(Environment.getExternalStorageDirectory().getPath(), "Android/ic/"+ context.getApplicationInfo().packageName);
+                       String path = dir.getPath();
+                       if (!dir.exists()) {
+                               dir.mkdirs();
+                       }
+                       return path;
+               }
+               return "/storage/emulated/0/Android/ic/icprotocol";
+       }
+       /**
+        * Returns application cache directory. Cache directory will be created on SD card
+        * <i>("/Android/data/[app_package_name]/cache")</i> if card is mounted and app has appropriate permission. Else -
+        * Android defines cache directory on device's file system.
+        *
+        * @param context Application context
+        * @return Cache {@link File directory}.<br />
+        * <b>NOTE:</b> Can be null in some unpredictable cases (if SD card is unmounted and
+        * {@link Context#getCacheDir() Context.getCacheDir()} returns null).
+        */
+       public static File getCacheDirectory(Context context) {
+               return getCacheDirectory(context, true);
+       }
+
+       /**
+        * Returns application cache directory. Cache directory will be created on SD card
+        * <i>("/Android/data/[app_package_name]/cache")</i> (if card is mounted and app has appropriate permission) or
+        * on device's file system depending incoming parameters.
+        *
+        * @param context        Application context
+        * @param preferExternal Whether prefer external location for cache
+        * @return Cache {@link File directory}.<br />
+        * <b>NOTE:</b> Can be null in some unpredictable cases (if SD card is unmounted and
+        * {@link Context#getCacheDir() Context.getCacheDir()} returns null).
+        */
+       public static File getCacheDirectory(Context context, boolean preferExternal) {
+               File appCacheDir = null;
+               if (preferExternal && MEDIA_MOUNTED
+                               .equals(Environment.getExternalStorageState()) && hasExternalStoragePermission(context) && haveFreeSpace()) {
+                       appCacheDir = getExternalCacheDir(context);
+               }
+               if (appCacheDir == null) {
+                       appCacheDir = context.getCacheDir();
+               }
+               if (appCacheDir == null) {
+                       String cacheDirPath = "/data/data/" + context.getPackageName() + "/cache/";
+                       appCacheDir = new File(cacheDirPath);
+               }
+               return appCacheDir;
+       }
+
+       /**
+        * Returns individual application cache directory (for only image caching from ImageLoader). Cache directory will be
+        * created on SD card <i>("/Android/data/[app_package_name]/cache/uil-images")</i> if card is mounted and app has
+        * appropriate permission. Else - Android defines cache directory on device's file system.
+        *
+        * @param context Application context
+        * @return Cache {@link File directory}
+        */
+       public static File getIndividualCacheDirectory(Context context) {
+               File cacheDir = getCacheDirectory(context);
+               File individualCacheDir = new File(cacheDir, INDIVIDUAL_DIR_NAME);
+               if (!individualCacheDir.exists()) {
+                       if (!individualCacheDir.mkdir()) {
+                               individualCacheDir = cacheDir;
+                       }
+               }
+               return individualCacheDir;
+       }
+
+       /**
+        * Returns specified application cache directory. Cache directory will be created on SD card by defined path if card
+        * is mounted and app has appropriate permission. Else - Android defines cache directory on device's file system.
+        *
+        * @param context  Application context
+        * @param cacheDir Cache directory path (e.g.: "AppCacheDir", "AppDir/cache/images")
+        * @return Cache {@link File directory}
+        */
+       public static File getOwnCacheDirectory(Context context, String cacheDir) {
+               File appCacheDir = null;
+               if (MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) && hasExternalStoragePermission(context)) {
+                       appCacheDir = new File(Environment.getExternalStorageDirectory(), cacheDir);
+               }
+               if (appCacheDir == null || (!appCacheDir.exists() && !appCacheDir.mkdirs())) {
+                       appCacheDir = context.getCacheDir();
+               }
+               return appCacheDir;
+       }
+
+       private static File getExternalCacheDir(Context context) {
+               File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data");
+               File appCacheDir = new File(new File(dataDir, context.getPackageName()), "cache");
+               if (!appCacheDir.exists()) {
+                       if (!appCacheDir.mkdirs()) {
+                               return null;
+                       }
+                       try {
+                               new File(appCacheDir, ".nomedia").createNewFile();
+                       } catch (IOException e) {
+                       }
+               }
+               return appCacheDir;
+       }
+
+       private static boolean hasExternalStoragePermission(Context context) {
+               int perm = context.checkCallingOrSelfPermission(EXTERNAL_STORAGE_PERMISSION);
+               return perm == PackageManager.PERMISSION_GRANTED;
+       }
+
+       private static boolean haveFreeSpace() {
+        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+            StatFs st = new StatFs(Environment.getExternalStorageDirectory().getPath());
+            int blockSize = st.getBlockSize();
+            long available = st.getAvailableBlocks();
+            long availableSize = (blockSize * available);
+            if (availableSize < 1024 * 1024 * 10) {// //sd卡空间如果小于10M,就认为sd卡空间不足
+                return false;
+            }
+            return true;
+        }
+        return false;
+    }
+}
index fb82437..88ce61f 100644 (file)
@@ -1,2 +1,2 @@
-#Wed Oct 21 19:34:49 CST 2020\r
-VERSION_CODE=161\r
+#Thu Oct 22 12:00:35 CST 2020\r
+VERSION_CODE=163\r