左晓为主开发手持机充值管理机
zuoxiao
2024-01-09 0baf94225974a8a993789f671860f3679e1a9ff0
修改权限框架
添加包名和签名验证
数据库文件隐藏
7个文件已修改
175 ■■■■ 已修改文件
app/build.gradle 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/BaseActivity.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/HomeActivity.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/LoginActivity.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/dao/BaseDaoSingleton.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
settings.gradle 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -21,9 +21,9 @@
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk{
            abiFilters 'armeabi-v7a'
        }
//        ndk{
//            abiFilters 'armeabi-v7a'
//        }
        signingConfig signingConfigs.debug
    }
@@ -79,12 +79,8 @@
    implementation 'com.tencent.bugly:crashreport:latest.release'
//    处理图片
//    implementation (name: 'ocr-library', ext: 'aar')
    //权限
    implementation ('com.guolindev.permissionx:permissionx:1.7.1'){
        exclude group: 'androidx.core';
        exclude group: 'androidx.appcompat';
        exclude group: 'androidx.annotation';
    }
    //权限申请
    implementation 'com.github.getActivity:XXPermissions:18.5'
    //滚动选择框
    implementation 'com.contrarywind:Android-PickerView:4.1.9'
app/src/main/java/com/dayu/recharge/activity/BaseActivity.java
@@ -1,11 +1,16 @@
package com.dayu.recharge.activity;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import com.dayu.recharge.MyApplication;
import com.dayu.recharge.R;
import com.dayu.recharge.dao.AppDatabase;
import com.dayu.recharge.dao.BaseDaoSingleton;
@@ -22,12 +27,16 @@
    public AppDatabase baseDao;
    //异步线程查询
    public AppDatabase asynchBaseDao;
    public final String SIGN = "308202b8308201a0020101300d06092a864886f70d01010b05003022310f300d06035504030c06e5a4a7e7a6b9310f300d06035504070c06e5a4a9e6b4a5301e170d3233313132303035333131325a170d3438313131333035333131325a3022310f300d06035504030c06e5a4a7e7a6b9310f300d06035504070c06e5a4a9e6b4a530820122300d06092a864886f70d01010105000382010f003082010a0282010100a0924f3d618e4a622def691e16e54ce5bdfd035bd73e7cb947d2bf3bd0c00afa26e52963e0299fc06d76d153be696c5285d630577e1dcb2b740a72b6d904482217de308fb91c8435441ed05e844ced1e5c3446d82cb8f38751049df26a42adcfc33f1f12c2ce03f676e5d148aad800ace89670b87835e2c02a8570a0b6740d9c0669d4cb3c597d0b2dd49fc0904e885773b6d3a87d9f1e73eb526e0d1a9e9e3c48d986938286cd824151b5a6214faf89d3e699524511b23c86d3b110a7f0bb56a6d2436f69816538a62a38cb1fee6eb685d267cc200df8af51b936bd280beaa2023f75678d77a11ac6de734b30af63d394c8b63bccf2115a47ea15c9212c740d0203010001300d06092a864886f70d01010b05000382010100307cafa9b14be91ba6424cfcc6aed75b069a1c4d6eb646eab0de93f372f236f5f0a6097499df99391075d6ced18d419a2b15adb041890e2b56a3bfbd6be40efee99c5c713ba8ea1d45da09b67916106116e96eb735271c4d53e0739f753145cbc42e149ad3d9507d422ec1c6f1a7f792a4542f9a64f0de3d4f4af69f0fb3390ef3577dcf8844cf744426d173b0934d879148062c5ca64022dc99af370dbfeaf2b5d4a279b20c54a361bca12c25bf185c2885519bbbc36e46ddb083080f0cc5b1f2eafe964ebce5071b0ae7d92a34a9193861b996d2c0299b1993f41063a27038199365a6e3cb27a02ffa9facdc48a63713eb5fbf90e9fd73056aba16b28e5fee";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        baseDao = BaseDaoSingleton.getInstance(this);
        asynchBaseDao = BaseDaoSingleton.getAsynchInstance(this);
        if (!isMyApp()) {
            this.finish();
        }
    }
@@ -52,5 +61,24 @@
        }
    }
    public boolean isMyApp() {
        String signStr = getSign();
        return SIGN.equals(signStr);
    }
    public String getSign() {
        try {
            PackageInfo packageInfo = this.getPackageManager().getPackageInfo(this.getPackageName(), PackageManager.GET_SIGNATURES);
            Signature[] signatures = packageInfo.signatures;
            StringBuilder builder = new StringBuilder();
            for (Signature signature : signatures) {
                builder.append(signature.toCharsString());
            }
            return builder.toString();
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }
}
app/src/main/java/com/dayu/recharge/activity/HomeActivity.java
@@ -1,6 +1,5 @@
package com.dayu.recharge.activity;
import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
@@ -13,8 +12,6 @@
import com.dayu.recharge.databinding.ActivityHomeBinding;
import com.dayu.recharge.dbBean.AdminDataBean;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.utils.ToastUtil;
import com.permissionx.guolindev.PermissionX;
/**
app/src/main/java/com/dayu/recharge/activity/LoginActivity.java
@@ -8,6 +8,7 @@
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.dayu.recharge.MyApplication;
@@ -15,10 +16,12 @@
import com.dayu.recharge.databinding.ActivityLoginBinding;
import com.dayu.recharge.dbBean.PassWordBean;
import com.dayu.recharge.utils.TipUtil;
import com.dayu.recharge.utils.WSMD5;
import com.permissionx.guolindev.PermissionX;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import java.io.File;
import java.util.List;
/**
@@ -27,7 +30,7 @@
 * Date: 2023-11-10 19:52
 * Description: 登录界面
 */
public class LoginActivity extends AppCompatActivity {
public class LoginActivity extends BaseActivity {
    ActivityLoginBinding binding;
    PassWordBean passWordBean;
@@ -62,27 +65,51 @@
    }
    private void getPermission() {
        PermissionX.init(LoginActivity.this).permissions(Manifest.permission.READ_PHONE_STATE,
                        Manifest.permission.READ_EXTERNAL_STORAGE,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                .onExplainRequestReason((scope, deniedList) -> {
                })
                .request((allGranted, grantedList, deniedList) -> {
                    if (allGranted) {//所有申请的权限都已通过
                        MyApplication.myApplication.initEasySocket(false, null);
                        try {
                            File file = new File(BaseDaoSingleton.SqlitePath);
                            if (!file.exists()) {
                                file.mkdirs();
        try {
            XXPermissions.with(this)
                    // 申请单个权限
//                    .permission(Permission.RECORD_AUDIO)
                    // 申请多个权限
                    .permission(Permission.READ_PHONE_STATE,
                            Permission.READ_EXTERNAL_STORAGE,
                            Permission.WRITE_EXTERNAL_STORAGE)
                    // 设置权限请求拦截器(局部设置)
                    //.interceptor(new PermissionInterceptor())
                    // 设置不触发错误检测机制(局部设置)
                    //.unchecked()
                    .request(new OnPermissionCallback() {
                        @Override
                        public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
                            if (allGranted) {
                                if (allGranted) {//所有申请的权限都已通过
                                    MyApplication.myApplication.initEasySocket(false, null);
                                    try {
                                        File file = new File(BaseDaoSingleton.SqlitePath);
                                        if (!file.exists()) {
                                            file.mkdirs();
                                        }
                                        passWordBean = BaseDaoSingleton.getInstance(LoginActivity.this).loginPsDao().findFirst();
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                            passWordBean = BaseDaoSingleton.getInstance(this).loginPsDao().findFirst();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    } else {//您拒绝了如下权限:$deniedList
                    }
                });
                        @Override
                        public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
                            if (doNotAskAgain) {
                                // 如果是被永久拒绝就跳转到应用权限系统设置页面
                            } else {
//                                toast("获取录音和日历权限失败");
                            }
                        }
                    });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}
app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -1,6 +1,5 @@
package com.dayu.recharge.activity;
import android.Manifest;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
@@ -10,8 +9,7 @@
import android.view.LayoutInflater;
import android.view.View;
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.view.ProgressDialog;
import androidx.annotation.NonNull;
import com.dayu.recharge.MyApplication;
import com.dayu.recharge.card.UserCard;
@@ -28,14 +26,19 @@
import com.dayu.recharge.tools.HexUtil;
import com.dayu.recharge.tools.Utils;
import com.dayu.recharge.utils.CRC8;
import com.dayu.recharge.utils.DeviceNumberUtils;
import com.dayu.recharge.utils.SocketUtil;
import com.dayu.recharge.utils.TipUtil;
import com.permissionx.guolindev.PermissionX;
import com.dayu.recharge.view.ProgressDialog;
import com.hjq.permissions.OnPermissionCallback;
import com.hjq.permissions.Permission;
import com.hjq.permissions.XXPermissions;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -75,7 +78,7 @@
            @Override
            public void onClick(View v) {
                rxPermission();
                getPermission();
            }
        });
@@ -154,22 +157,40 @@
    }
    private void rxPermission() {
        PermissionX.init(NewCardActivity.this).permissions(Manifest.permission.CAMERA)
                .onExplainRequestReason((scope, deniedList) -> {
    private void getPermission() {
        try {
            XXPermissions.with(this)
                    // 申请单个权限
//                    .permission(Permission.RECORD_AUDIO)
                    // 申请多个权限
                    .permission(Permission.CAMERA)
                    // 设置权限请求拦截器(局部设置)
                    //.interceptor(new PermissionInterceptor())
                    // 设置不触发错误检测机制(局部设置)
                    //.unchecked()
                    .request(new OnPermissionCallback() {
// val message = "PermissionX需要您同意以下权限才能正常使用"
                })
                .request((allGranted, grantedList, deniedList) -> {
                    if (allGranted) {//所有申请的权限都已通过
//                        startCamera();
                    } else {//您拒绝了如下权限:$deniedList
                        @Override
                        public void onGranted(@NonNull List<String> permissions, boolean allGranted) {
                            if (allGranted) {
                            }
                        }
                    }
                });
                        @Override
                        public void onDenied(@NonNull List<String> permissions, boolean doNotAskAgain) {
                            if (doNotAskAgain) {
                                // 如果是被永久拒绝就跳转到应用权限系统设置页面
                            } else {
//                                toast("获取录音和日历权限失败");
                            }
                        }
                    });
        } catch (
                Throwable e) {
            e.printStackTrace();
        }
    }
    @Override
@@ -349,6 +370,7 @@
            // 汉字的Unicode范围是:0x4e00 - 0x9fa5
            return (c >= 0x4e00 && c <= 0x9fa5);
        }
    }
    @Override
app/src/main/java/com/dayu/recharge/dao/BaseDaoSingleton.java
@@ -19,7 +19,7 @@
public class BaseDaoSingleton {
    public static AppDatabase baseDao;
    public static AppDatabase AsynchBaseDao;
    public static String SqlitePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "dayu" + File.separator + "data" + File.separator;
    public static String SqlitePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ".dayu" + File.separator + "data" + File.separator;
    //MyFileUtil.SqlitePath +
    public static AppDatabase getInstance(Context context) {
settings.gradle
@@ -11,6 +11,7 @@
        google()
        jcenter()
        mavenCentral()
        maven {url 'https://www.jitpack.io'}
    }
}
rootProject.name = "Recharge"