我们的上一篇文章:https://ost.51cto.com/posts/16134
菜卡Vegeca上一篇文章:https://hub.cdnet.run/topic/show/96
我们的GitHub:点我
实时监测、远程浇花我们有了!多设备添加这一次的更新我们就想往这方向走了,当地气象信息API的事情我们也能做!碰一碰联网还没想好该怎么实现类似,但是我们肯定要做的!
所以,我们得调整一下开发方向了,就有了这一次更新:
众所周知,我们在写文章说明我们更新的同时,我也更希望能够补充一些内容,做一个教程,讲述讲述我在开发时遇到的问题。所以接下来,就是你们肯定特别想看到的内容了~。
首先,我重写了Android APP申请权限的代码,包装成一个类,目前我们仅索要以下权限:
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多好啊)!
另外一个读取类,我就讲下流程:
//取第一份文件的值,这里我使用的是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;
}
}
那么,我们的2.2.419版本,应该能得到不少看官满意了!至少我们梦寐以求的正常登录能够少敲键盘,已经做到了。而且在我们看来非常的成功!
接下来,2.2版本就到此End了,而是2.3版本,万众期待的调试API、账号本地加密保存、优化快速启动(2.4)、当地气象信息API这几个功能,会与各位见面的。
埋个坑,2.3版本,10月左右会和大家见面,大家不用担心我会跑路什么的哈哈哈哈哈哈哈哈哈哈(不可能的事!)
再来一些内容,为什么呢?因为我们很有可能(哪怕一丝哈)会和小熊派开源社区在软件方面,进行合作了哈!当然,只是很有可能(哈哈哈)
不写文章了,我去睡会,一夜没睡熬夜写代码的感觉,下一次我还想要嘿嘿嘿~(大家要注意按时睡觉可不要学我!!)
End
2022.9.8 4:46