endian11
2019-09-09 8ee04ba82a1455ac08bb2e6a729bdc7ebbe6c4da
加入权限管理类;加入日志写入SD文件
8个文件已修改
3个文件已添加
520 ■■■■■ 已修改文件
app/build.gradle 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/AndroidManifest.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/MainActivity.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/app.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/MyLog.java 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/PermissionManager.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_face.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_take_photo.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
gradle/wrapper/gradle-wrapper.properties 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
settings.gradle 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -22,14 +22,14 @@
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    api "android.arch.lifecycle:extensions:1.1.1"
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    // To get SwipeBack feature, rely on both fragmentation & fragmentation-swipeback
    implementation 'me.yokeyword:fragmentation:1.3.6'
// Swipeback is based on fragmentation. Refer to SwipeBackActivity/Fragment for your Customized SupportActivity/Fragment
    implementation 'me.yokeyword:fragmentation-swipeback:1.3.6'
    implementation 'me.dm7.barcodescanner:zxing:1.9.8'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
    package="safeluck.drive.evaluation">
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
app/src/main/java/safeluck/drive/evaluation/MainActivity.java
@@ -1,23 +1,31 @@
package safeluck.drive.evaluation;
import android.Manifest;
import android.app.AlertDialog;
import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProvider;
import android.arch.lifecycle.ViewModelProviders;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;
import me.yokeyword.fragmentation.SupportActivity;
import safeluck.drive.evaluation.fragment.HomeFragment;
import safeluck.drive.evaluation.util.MyLog;
import safeluck.drive.evaluation.util.PermissionManager;
import safeluck.drive.evaluation.viewmodels.MainViewModel;
public class MainActivity extends SupportActivity {
    private static final int PERMISSIONS_REQUEST_CODE = 1001;
    private String TAG = MainActivity.class.getCanonicalName();
    private PermissionManager mPermissionsManager ;
    String[] PERMISSIONS = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
@@ -26,13 +34,43 @@
        setContentView(R.layout.activity_main);
        mPermissionsManager = new PermissionManager(this) {
            @Override
            public void authorized(int requestCode) {
            }
            @Override
            public void noAuthorization(int requestCode, String[] lackPermissions) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                builder.setTitle("提示");
                builder.setMessage("缺少"+lackPermissions+"权限");
                builder.setPositiveButton("设置权限", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        PermissionManager.startAppSettings(getApplicationContext());
                    }
                });
                builder.create().show();
            }
            @Override
            public void ignore() {
            }
        };
        MainViewModel mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
        mainViewModel.getJson().observe(this, new Observer<String>() {
            @Override
            public void onChanged(@Nullable String json) {
                Toast.makeText(MainActivity.this, json, Toast.LENGTH_SHORT).show();
                Log.i(TAG,"json=========="+json);
                Log.i(TAG,"json=========="+Thread.currentThread().getName());
                MyLog.i(TAG,"json=========="+json);
                MyLog.i(TAG,"json=========="+Thread.currentThread().getName());
            }
        });
@@ -42,4 +80,17 @@
            loadRootFragment(R.id.fl_container,HomeFragment.newInstance());
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        mPermissionsManager.checkPermissions(PERMISSIONS_REQUEST_CODE,PERMISSIONS);
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionsManager.recheckPermissions(PERMISSIONS_REQUEST_CODE,permissions,grantResults);
    }
}
app/src/main/java/safeluck/drive/evaluation/app.java
@@ -2,13 +2,14 @@
import android.app.Application;
import android.support.annotation.NonNull;
import android.util.Log;
import com.anyun.exam.lib.AYSdk;
import com.anyun.exam.lib.IAYExamListener;
import me.yokeyword.fragmentation.Fragmentation;
import me.yokeyword.fragmentation.helper.ExceptionHandler;
import safeluck.drive.evaluation.util.MyLog;
/**
 * MyApplication2
@@ -27,7 +28,7 @@
                .handleException(new ExceptionHandler() {
                    @Override
                    public void onException(@NonNull Exception e) {
                        Log.i(TAG, "onException: "+e.getMessage());
                        MyLog.i(TAG, "onException: "+e.getMessage());
                    }
                })
                .install();
@@ -39,18 +40,18 @@
    @Override
    public void onTerminate() {
        super.onTerminate();
        Log.e(TAG,"OnTerminate()");
        MyLog.e(TAG,"OnTerminate()");
        AYSdk.getInstance().uninit();
    }
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.e(TAG,"OnTerminate()");
        MyLog.e(TAG,"OnTerminate()");
    }
    @Override
    public void callBackMsg(String json) {
        Log.d(TAG,"收到=="+json);
        MyLog.d(TAG,"收到=="+json);
    }
}
app/src/main/java/safeluck/drive/evaluation/fragment/HomeFragment.java
@@ -1,19 +1,31 @@
package safeluck.drive.evaluation.fragment;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AlertDialog;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.zxing.WriterException;
import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import me.yokeyword.fragmentation.ISupportFragment;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.util.DimenUtil;
/**
 * 首页
@@ -85,6 +97,7 @@
                    }
                }).show();
                break;
            case R.id.system_setting:
                //打开输入密码界面
@@ -95,7 +108,7 @@
                } else {
                    start(passwordFragment);
                }
//                    extraTransaction().startDontHideSelf(PasswordFragment.newInstance());
                break;
        }
    }
app/src/main/java/safeluck/drive/evaluation/util/MyLog.java
New file
@@ -0,0 +1,314 @@
package safeluck.drive.evaluation.util;
/**
 * anyunProject(20190906)
 * Created by lzw on 2019/9/6. 17:23:17
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
import android.content.Context;
import android.os.Environment;
import android.util.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class MyLog {
    private static final String TAG = "AYJiaKao";
    private static Boolean MYLOG_SWITCH = true; // 日志文件总开关
    private static Boolean MYLOG_WRITE_TO_FILE = true;// 日志写入文件开关
    // 输入日志类型,w代表只输出告警信息等,v代表输出所有信息
    private static char MYLOG_TYPE = 'v';
    // 日志文件在sdcard中的路径
    private static String MYLOG_PATH_SDCARD_DIR = "/sdcard/nvlog";
    private static int SDCARD_LOG_FILE_SAVE_DAYS = 3;// sd卡中日志文件的最多保存天数
    private static String MYLOGFILEName = "Log.txt";// 本类输出的日志文件名称
    private static SimpleDateFormat myLogSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 日志的输出格式
    private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");// 日志文件格式
    public Context context;
    public static void w(String tag, Object msg) { // 警告信息
        log(tag, msg.toString(), 'w');
    }
    public static void e(String tag, Object msg) { // 错误信息
        log(tag, msg.toString(), 'e');
    }
    public static void d(String tag, Object msg) {// 调试信息
        log(tag, msg.toString(), 'd');
    }
    public static void i(String tag, Object msg) {//
        log(tag, msg.toString(), 'i');
    }
    public static void i(Object msg) {//
        log(TAG, msg.toString(), 'i');
    }
    public static void v(String tag, Object msg) {
        log(tag, msg.toString(), 'v');
    }
    public static void w(String tag, String text) {
        log(tag, text, 'w');
    }
    public static void e(String tag, String text) {
        log(tag, text, 'e');
    }
    public static void d(String tag, String text) {
        log(tag, text, 'd');
    }
    public static void i(String tag, String text) {
        log(tag, text, 'i');
    }
    public static void i( String text) {
        log(TAG, text, 'i');
    }
    public static void v(String tag, String text) {
        log(tag, text, 'v');
    }
    /**
     * 根据tag, msg和等级,输出日志
     * @param tag
     * @param msg
     * @param level
     */
    private static void log(String tag, String msg, char level) {
        if (MYLOG_SWITCH) {//日志文件总开关
            if ('e' == level && ('e' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) { // 输出错误信息
                Log.e(tag, msg);
            } else if ('w' == level && ('w' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
                Log.w(tag, msg);
            } else if ('d' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
                Log.d(tag, msg);
            } else if ('i' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
                Log.i(tag, msg);
            } else {
                Log.v(tag, msg);
            }
            if (MYLOG_WRITE_TO_FILE)//日志写入文件开关
                writeLogtoFile(String.valueOf(level), tag, msg);
        }
    }
    /**
     * 打开日志文件并写入日志
     * @param mylogtype
     * @param tag
     * @param text
     */
    private static void writeLogtoFile(String mylogtype, final String tag, final String text) {// 新建或打开日志文件
        new Thread(new Runnable() {
            @Override
            public void run() {
                delFile();
                Date nowtime = new Date();
                String needWriteFiel = logfile.format(nowtime);
                String needWriteMessage = myLogSdf.format(nowtime) + " "+ tag + "  " + text;
                File dirsFile = new File(MYLOG_PATH_SDCARD_DIR);
                if (!dirsFile.exists()){
                    dirsFile.mkdirs();
                }
                //Log.i("创建文件","创建文件");
                File file = new File(dirsFile.toString(), needWriteFiel + MYLOGFILEName);// MYLOG_PATH_SDCARD_DIR
                if (!file.exists()) {
                    try {
                        //在指定的文件夹中创建文件
                        file.createNewFile();
                    } catch (Exception e) {
                    }
                }
                try {
/**后面这个参数代表是不是要接上文件中原来的数据,不进行覆盖**/
                    FileWriter filerWriter = new FileWriter(file, true);
                    BufferedWriter bufWriter = new BufferedWriter(filerWriter);
                    bufWriter.write(needWriteMessage);
                    bufWriter.newLine();
                    bufWriter.close();
                    filerWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
    /**
     * 删除制定的日志文件
     */
    public static void delFile() {// 删除日志文件
        String needDelFiel = logfile.format(getDateBefore());
        String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/nvlog";
        File file = new File(dirPath, needDelFiel + MYLOGFILEName);// MYLOG_PATH_SDCARD_DIR
        if (file.exists()) {
            file.delete();
        }
    }
    /**
     * 得到现在时间前的几天日期,用来得到需要删除的日志文件名
     */
    private static Date getDateBefore() {
        Date nowtime = new Date();
        Calendar now = Calendar.getInstance();
        now.setTime(nowtime);
        now.set(Calendar.DATE, now.get(Calendar.DATE) - SDCARD_LOG_FILE_SAVE_DAYS);
        return now.getTime();
    }
}
app/src/main/java/safeluck/drive/evaluation/util/PermissionManager.java
New file
@@ -0,0 +1,87 @@
package safeluck.drive.evaluation.util;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import java.util.ArrayList;
/**
 * MyApplication2
 * Created by lzw on 2019/9/9. 17:45:48
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
public abstract class PermissionManager {
    private static final String PACKAGE_URL_SCHEME = "package:";
    private Activity mTargetActivity;
    /**
     * 权限通过
     * @param requestCode
     */
    public abstract  void authorized(int requestCode);
    /**
     * 有权限没通过
     * @param requestCode
     * @param lackPermissions
     */
    public abstract void noAuthorization(int requestCode,String[] lackPermissions);
    /**
     * Android 6.0以下的系统不设置校验权限
     */
    public abstract void ignore();
    public PermissionManager(Activity targetActivity){
        this.mTargetActivity = targetActivity;
    }
    public void checkPermissions(int requestCode,String... permissions){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            ArrayList<String> lacks = new ArrayList<>();
            for (String permission:permissions){
                if (ContextCompat.checkSelfPermission(mTargetActivity.getApplicationContext(),permission) == PackageManager.PERMISSION_DENIED){
                    lacks.add(permission);
                }
            }
            if (!lacks.isEmpty()){
                //有权限没有授权
                String[] lacksPermissions = new String[lacks.size()];
                lacksPermissions = lacks.toArray(lacksPermissions);
                ActivityCompat.requestPermissions(mTargetActivity,lacksPermissions,requestCode);
            }else{
                authorized(requestCode);
            }
        }else{
            // 6.0以下版本不校验权限
            ignore();
        }
    }
    public void recheckPermissions(int requestCode, @NonNull String[] permissions,@NonNull int[] grantReuslts){
        for (int grantResult :
                grantReuslts) {
            if (grantResult == PackageManager.PERMISSION_DENIED) {
                //未授权
                noAuthorization(requestCode,permissions);
            }
        }
        authorized(requestCode);
    }
    public static void startAppSettings(Context context){
        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse(PACKAGE_URL_SCHEME + context.getApplicationContext().getPackageName() ));
        context.startActivity(intent);
    }
}
app/src/main/res/drawable/ic_face.xml
New file
@@ -0,0 +1,4 @@
<vector android:height="24dp" android:viewportHeight="1024"
    android:viewportWidth="1024" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:fillColor="#ffffff" android:pathData="M848,64h-84c-7.2,0 -14.3,2.7 -19.8,8.2 -5.5,5.5 -8.2,12.6 -8.2,19.8 0,7.2 2.7,14.3 8.2,19.8 5.5,5.5 12.6,8.2 19.8,8.2h84v84c0,7.2 2.7,14.3 8.2,19.8 5.5,5.5 12.6,8.2 19.8,8.2s14.3,-2.7 19.8,-8.2c5.5,-5.5 8.2,-12.6 8.2,-19.8v-84c0,-30.9 -25.1,-56 -56,-56zM876,512c-7.2,0 -14.3,2.7 -19.8,8.2 -5.5,5.5 -8.2,12.6 -8.2,19.8v84h-84c-7.2,0 -14.3,2.7 -19.8,8.2 -1.5,1.5 -2.3,3.4 -3.4,5.2 -31.6,-30.4 -67.1,-55.4 -106.4,-72C714.2,517.7 764.7,426 749.2,323c-14.6,-96.7 -89.6,-177.5 -185.3,-197.5 -17.6,-3.7 -35,-5.4 -51.9,-5.4 -132.6,0 -240,107.4 -240,240 0,87.6 47.5,163.5 117.6,205.4 -39.2,16.6 -74.8,41.6 -106.4,72 -1.1,-1.8 -1.9,-3.7 -3.4,-5.2 -5.5,-5.5 -12.6,-8.2 -19.8,-8.2h-84v-84c0,-7.2 -2.7,-14.3 -8.2,-19.8 -5.5,-5.5 -12.6,-8.2 -19.8,-8.2s-14.3,2.7 -19.8,8.2c-5.5,5.5 -8.2,12.6 -8.2,19.8v84c0,30.9 25.1,56 56,56h69c-46.8,60.6 -79.3,136.5 -89.5,221.3 -3.8,31.2 21.1,58.7 52.5,58.7h608c31.4,0 56.2,-27.6 52.5,-58.7 -10.2,-84.9 -42.7,-160.8 -89.5,-221.4h69c30.9,0 56,-25.1 56,-56v-84c0,-7.2 -2.7,-14.3 -8.2,-19.8 -5.5,-5.5 -12.6,-8.2 -19.8,-8.2zM211.5,905c16.9,-132.8 93.3,-242.9 199.9,-288 19.4,-8.2 32.6,-26.7 34.1,-47.7 1.5,-21.1 -9,-41.1 -27.2,-52C361.8,483.6 328,424.7 328,360c0,-101.5 82.5,-184 184,-184 13.4,0 27,1.4 40.4,4.3 72.1,15.1 130.3,77.2 141.4,151.1 11.4,75.5 -22.4,146.8 -88.2,186 -18.1,10.8 -28.6,30.9 -27.2,52 1.5,21.1 14.6,39.5 34.1,47.7C719,661.9 795.3,771.7 812.4,904l-600.9,1zM148,232c7.2,0 14.3,-2.7 19.8,-8.2 5.5,-5.5 8.2,-12.6 8.2,-19.8v-84h84c7.2,0 14.3,-2.7 19.8,-8.2 5.5,-5.5 8.2,-12.6 8.2,-19.8 0,-7.2 -2.7,-14.3 -8.2,-19.8 -5.5,-5.5 -12.6,-8.2 -19.8,-8.2h-84c-30.9,0 -56,25.1 -56,56v84c0,7.2 2.7,14.3 8.2,19.8 5.5,5.5 12.6,8.2 19.8,8.2z"/>
</vector>
app/src/main/res/layout/layout_take_photo.xml
@@ -2,12 +2,15 @@
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <safeluck.drive.evaluation.customview.AutoFitTextureView
        android:id="@+id/texture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentTop="true" />
        <safeluck.drive.evaluation.customview.AutoFitTextureView
            android:id="@+id/texture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true" />
    <FrameLayout
        android:id="@+id/control"
@@ -22,7 +25,7 @@
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="照片" />
            android:text="拍照" />
        <ImageButton
            android:id="@+id/info"
gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Fri Mar 15 10:07:01 CST 2019
#Fri May 10 10:06:28 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
settings.gradle
@@ -1 +1 @@
include ':app'
include ':app', ':lib'