首页 小组 话题 唠叨 搜索 文章 相册 我的社区 用户

ProjectY[Java 安卓APP开发汇总]版本号2.2.419,我们调整一下“小熊派护花使者APP”更新策略

2022-09-08 04:47:30
0
357

我们的上一篇文章:https://ost.51cto.com/posts/16134

菜卡Vegeca上一篇文章:https://hub.cdnet.run/topic/show/96

我们的GitHub:点我

我们的Gitee:点我
发行版页面:点我


实时监测、远程浇花我们有了!多设备添加这一次的更新我们就想往这方向走了,当地气象信息API的事情我们也能做!碰一碰联网还没想好该怎么实现类似,但是我们肯定要做的!
所以,我们得调整一下开发方向了,就有了这一次更新:

  • 修复正常启动的逻辑Bug问题,并且让正常启动优化了一下,如果您是第二次使用正常登录的用户,您会发现正常登录可以免输入账号信息了,这是因为我们保存了这些信息,让护花使者的流程减少了不少并且全自动化。
  • 第二就是第一点的补充了:新增保存信息功能,让正常启动可以第二次启动后,敲键盘次数大幅减少!!!
  • 我们通过大量灰度测试发现,部分地区的电信宽带使用浩瀚银河居若科技联动函数(HaohanyhOranMeCDNDecideData),会有网络不佳导致数据进不去的问题,所以我花了点时间修复了这样的网络问题并且让服务器接入更好的网络、高防设施。现在我们的联动函数,已经有很好的网络情况了。

  • 众所周知,我们在写文章说明我们更新的同时,我也更希望能够补充一些内容,做一个教程,讲述讲述我在开发时遇到的问题。所以接下来,就是你们肯定特别想看到的内容了~
    首先,我重写了Android APP申请权限的代码,包装成一个类,目前我们仅索要以下权限:

  • 存储权限(Android 10以上我们索要存储管理权限)
  • 定位权限(用于获取Wi-Fi SSID)
  • 震动权限(NFCActivity时震动提示)
  • 网络权限(华为云API交互)
  • NFC权限(NFCActivity时写入数据到护花使者)
    然后,我们的震动、网络、NFC权限并不需要动态获取,所以我们就写了存储和定位的动态获取,代码如下:

  • com.haohanyh.hamos.projecty.HAMOSGetSomePermission
    public static final class Permission {
        private static final List ListStorages = new ArrayList<>(1);
        private static final List ListLocations = new ArrayList<>(2);
        public static final class Location {
            public static final String ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
            public static final String ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
        }
        public static final class Storage {
            public static final String READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
            public static final String WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
        }
        static {
            //HAMOS ProjectY需要获取存储权限来保证:用户键入的内容可以得到保存处理和后续读取。
            ListStorages.add(Storage.READ_EXTERNAL_STORAGE);
            ListStorages.add(Storage.WRITE_EXTERNAL_STORAGE);
            //HAMOS ProjectY需要获取GPS权限来保证:正常启动时可以自动获取Wi-Fi SSID名称。
            ListLocations.add(Location.ACCESS_FINE_LOCATION);
            ListLocations.add(Location.ACCESS_COARSE_LOCATION);
        }
    }

    当然,我们不可能少得了Android高版本获取最高存储权限的代码!

    com.haohanyh.hamos.projecty.MainActivity
     	//2.2.301版本,初始化新增获取权限,获取完了就不会弹出了
            permissions = HAMOSGetSomePermission
                    .with(this)
                    .requestCode(0)
                    .permissions(Storage.READ_EXTERNAL_STORAGE, Storage.WRITE_EXTERNAL_STORAGE, Location.ACCESS_FINE_LOCATION, Location.ACCESS_COARSE_LOCATION)
                    .request();
            //2.2.311版本,我们发现安卓10以上设备,需要单独获取MANAGE,所以就写了这一段
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                if (Environment.isExternalStorageManager()) {
                    Log.v("浩瀚银河:","Android 10以上设备是否获取最高读写文件权限?:" + Environment.isExternalStorageManager());
                } else {
                    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                    intent.setData(Uri.parse("package:" + this.getPackageName()));
                    startActivityForResult(intent, 1024);
                }
            }

    获取完了存储权限,那么我们就需要写好:读取值后存储成JSON格式,到一个JSON文件夹里。
    那么问题来了!我们该把JSON文件存到哪里呢?JSON文件该怎么存?
    我先来解答第一个问题:我们把JSON文件,存储到如下地址:
    /data/user/0/com.haohanyh.hamos.projecty/files/HAMOSData/XXX.json
    如果是其他用户,可能是如下地址可以找得到文件:

    /data/data/com.haohanyh.hamos.projecty/files/HAMOSData/XXX.json
    那么第二个问题,也就明了了:我们存到/data根目录下,能保证文件极大不容易被用户简单读取(需要ROOT最高管理员),同时在Android高版本设备上,/data/user/0/软件包地址,各个软件互不干扰。
    当然,我们始终把用户隐私放在第一位,所以这个版本如果有担心被窃取的可以不用升级,在下一个版本,我们会有:混淆存储+解决算法,确保做到信息安全。
    接下来就是我们的存储和读取的类了,我们包装了三个类:


    ReadHuaweiAndWlanData,读取华为账号和WLAN数据
    SaveHuaweiData,存储华为账号数据
    SaveWLANData,存储WLAN数据

    这三个类,我们认为写的非常成功,因为我们使用JSON格式存储,JSON格式的包装拆解我们已经非常熟悉了。
    同时,我们写的方法,可以做到先处理数据后传值!
    那么,就来阐述一下我写的代码吧~首先先写存储,那么上代码!!

    com.haohanyh.hamos.managedata.SaveHuaweiData
    public String ProcessDataToWriteFile() {
            wergjiker = GetData().getJsonDomainName();
            wergofjer = GetData().getJsonName();
            werobfker = GetData().getJsonPassword();
            //取得值后,接下来得组成一个JSON框架,当然这个框架很简单。
            JSONObject First = new JSONObject();
            try {
                First.put("Domain",wergjiker);
                First.put("Name",wergofjer);
                First.put("Pwd",werobfker);
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return String.valueOf(First);
        }
    
        /**
         * WriteFile(),保存文件到我们的一亩三分地里~不乱存
         */
        @SuppressLint("SdCardPath")
        public boolean WriteFile() {
            Log.v(TAG,"开始");
            try {
                File file = new File(Dir + "/HAMOSData");
                if(!file.exists()) { file.mkdir(); }//判断目录是否存在,不存在就得创建
                File newFile = new File(file + "/User.json");
                if(!newFile.exists()) { newFile.createNewFile(); }//判断文件是否存在,不存在就得创建
                //经过多次版本测试,我们终于得到了确切目录树: /data/user/0/com.haohanyh.hamos.projecty/files/HAMOSData
                String Path = "/data/user/0/com.haohanyh.hamos.projecty/files/HAMOSData/User.json";
                File targetFile = new File(Path);
                RandomAccessFile randomAccessFile = new RandomAccessFile(targetFile,"rw");
                randomAccessFile.seek(0);//写一次而不是在上一次基础上继续写,而是覆写!!!
                randomAccessFile.write(ProcessDataToWriteFile().getBytes(StandardCharsets.UTF_8));//写入我们保存的用户信息
                randomAccessFile.close();
                Log.v(TAG,"结束");
                return true;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return false;
        }

    我单独挑一个我写的存储华为账号的类(SaveHuaweiData),那么上面的操作,基本上就是先String方法处理一下华为函数的信息,然后组成JSON格式,最后就是丢到User.json里。
    同理,WLAN那边也是如此,我就不贴代码了(Ctrl+C Ctrl+V多好啊)!
    另外一个读取类,我就讲下流程:

  • 首先进到文件夹里,然后进文件
  • 读取第一份文件(华为账号)
  • 读取第二份文件(WLAN信息)
  • 有函数调用getData1()或getData2()时,先把JSON数据拆成String数组,然后直接return data数组。
  • 回到MainActivity,NormalStart()里,如果用户存储了JSON文件,那么我们直接通过上面俩函数取值的同时,通过for循环把数组分配到每一个String参数上。
  • //取第一份文件的值,这里我使用的是For循环+Switch,已经测过了毫无问题
                for (int i = 0;i <= ReadHuaweiAndWlanData.GetReadData().getData1().length;i++) {
                    switch (i) {
                        case 0:
                            IAMDomainName = ReadHuaweiAndWlanData.GetReadData().getData1()[i];break;
                        case 1:
                            IAMName = ReadHuaweiAndWlanData.GetReadData().getData1()[i];break;
                        case 2:
                            IAMPassword = ReadHuaweiAndWlanData.GetReadData().getData1()[i];break;
                    }
                }
    //取第二份文件的值,当然,跟上面一样
                for (int i = 0;i < ReadHuaweiAndWlanData.GetReadData().getData2().length;i++) {
                    switch (i) {
                        case 0:
                            WPA_address_normal = ReadHuaweiAndWlanData.GetReadData().getData2()[i];break;
                        case 1:
                            WPA_pwd_normal = ReadHuaweiAndWlanData.GetReadData().getData2()[i];break;
                    }
                }
  • 结束此工作,直接NewNormalStartLogin(IAMDomainName, IAMName, IAMPassword, WPA_address_normal, WPA_pwd_normal);
  • 那么,我们的2.2.419版本,应该能得到不少看官满意了!至少我们梦寐以求的正常登录能够少敲键盘,已经做到了。而且在我们看来非常的成功!
    接下来,2.2版本就到此End了,而是2.3版本,万众期待的调试API、账号本地加密保存、优化快速启动(2.4)、当地气象信息API这几个功能,会与各位见面的。
    埋个坑,2.3版本,10月左右会和大家见面,大家不用担心我会跑路什么的哈哈哈哈哈哈哈哈哈哈(不可能的事!)


    再来一些内容,为什么呢?因为我们很有可能(哪怕一丝哈)会和小熊派开源社区在软件方面,进行合作了哈!当然,只是很有可能(哈哈哈)
    不写文章了,我去睡会,一夜没睡熬夜写代码的感觉,下一次我还想要嘿嘿嘿~(大家要注意按时睡觉可不要学我!!
    End
    2022.9.8 4:46

    扫码_白.png
    评论