UniApp写入读取android本地文件,不会被清除

这篇具有很好参考价值的文章主要介绍了UniApp写入读取android本地文件,不会被清除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       项目背景,我们是用uniapp编写的收银程序,然后打包到android工程,再打包成apk包安装到用户的收银机上,收银机是android系统。由于项目需求,每次升级我们收银系统版本后,之前连接的打印机和LED显示屏的缓存数据都会被重新清除,因为升级相当于重新安装apk。所以把这几个配置写入到本地文件里面,登入时自动读取配置,再自动连接。下面直接贴代码

       一、在common目录下新建convertFormat.js

// 读取json文件
function getJsonData(path) { //path:路径
	
	return new Promise(resolve => { 
		plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, fs => { //请求文件系统
				fs.root.getFile(
					path, {   
						create: true //当文件不存在时创建
					}, fileEntry => {
						fileEntry.file(function(file) {
							let fileReader = new plus.io
								.FileReader(); //new一个可以用来读取文件的对象fileReader
							fileReader.readAsText(file, "utf-8"); //读文件的格式
							fileReader.onerror = e => { //读文件失败
								// console.log("获取文件失败", fileReader.error);
								// plus.nativeUI.toast("获取文件失败,请重启应用", {
								// 	background: "#ffa38c",
								// });
								return;
							};
							fileReader.onload = e => { //读文件成功
								// console.log("读取文件成功");
								let txtData = e.target.result;
								resolve(txtData);    
								// 回调函数内的值想返回到函数外部  就用promise+resolve来返回出去
							};
						});
					}, error => {
						// console.log("2新建获取文件失败", error);
						// plus.nativeUI.toast("获取文件失败,请重启应用", {
						// 	background: "#ffa38c",
						// });
						return;
					});
			},
			e => {
				// console.log("1请求文件系统失败", e.message);
				// plus.nativeUI.toast("请求系统失败,请重启应用", {
				// 	background: "#ffa38c",
				// });
				return;
			}
		);
	});
};
// 写入josn文件
function changeData(path, seek, writeData) { //参数1:上传路径,参数2:seek方法可设置文件操作指定位置,参数3:写入的json数据
	plus.nativeUI.showWaiting("正在保存信息");
	return new Promise(resolve => {
		plus.io.requestFileSystem(plus.io.PUBLIC_DOWNLOADS, fs => {
			fs.root.getFile(path, {
					create: true
				}, fileEntry => {
					fileEntry.file(file => {
						fileEntry.createWriter(writer => {
								//plus.nativeUI.showWaiting("正在保存信息");
								writer.seek(seek); //覆盖文件
								const writeDataTemp = JSON.stringify(writeData, null,
									"\r").replace(/[\r]/g, "");
								writer.write(writeDataTemp); // 整个文件重写
								writer.onerror = function() {
									//console.log("4写入文件失败", writer.error.message);
									plus.nativeUI.closeWaiting();
									plus.nativeUI.toast("修改信息失败,请重新操作", {
										background: "#ffa38c",
									});
									return;
								};
								writer.onsuccess = function() { //填写文件成功
									plus.nativeUI.closeWaiting();
									// plus.nativeUI.toast("填写文件成功", {
									// 	background: "rgba(255, 255, 255, 0.6)",
									// });
									resolve("1");
								};
							},
							error => {
								// console.log("3创建creactWriter失败", error);
								// plus.nativeUI.toast("保存文件失败,请重新操作", {
								// 	background: "#ffa38c",
								// });
								return;
							});
					});
				},
				error => {
					// console.log("2获取文件失败", error);
					// plus.nativeUI.toast("保存文件失败,请重新操作", {
					// 	background: "#ffa38c",
					// });
					return;
				}
			);
		}, e => {
			//console.log("1请求文件系统失败", e.message);
			plus.nativeUI.toast("请求系统失败,请重新操作", {
				background: "#ffa38c",
			});
			return;
		});
	});
}

async function saveFile(url, file, newfilename) {
	let c = await creatDirs(url)
	let isokm = moveDirectyOrFile(file, url + "/", newfilename);
	return isokm
}
//循环创建目录 url:"_doc/...."  _doc开头
async function creatDirs(url) {
	let urllist = url.split("/");
	console.log(urllist)
	//创建文件夹
	let u = "";
	for (let i = 0; i < urllist.length - 1; i++) {
		let j = i;
		if (i == 0) {
			u = urllist[i];
		} else {
			u = u + "/" + urllist[i];
		}
		console.log(i + "-------------------")
		console.log(u)
		console.log(urllist[j + 1])
		await CreateNewDir(u, urllist[j + 1]);
	}
}
//重命名目录或文件名
function moveDirectyOrFile(srcUrl, dstUrl, newName) { //srcUrl需要移动的目录或文件,dstUrl要移动到的目标目录(父级)
	plus.io.resolveLocalFileSystemURL(srcUrl, function(srcEntry) {
		//console.log(111)
		plus.io.resolveLocalFileSystemURL(dstUrl, function(dstEntry) {
			//console.log(222)
			if (srcEntry.isDirectory) {
				//console.log(33)
				srcEntry.moveTo(dstEntry, newName, function(entry) {
					//console.log("New Path: " + entry.fullPath);
					return true;
				}, function(e) {
					return e;
					//console.log(e.message);
				});
			} else {
				srcEntry.moveTo(dstEntry, newName, function(entry) {
					//console.log("New Path: " + entry.fullPath);
					return true;
				}, function(e) {
					return e;
					//console.log(e.message);
				});
			}
		}, function(e) {
			uni.showToast({
				title: '获取目标目录失败:' + e.message,
				duration: 2000,
				icon: 'none'
			});
		});
	}, function(e) {
		uni.showToast({
			title: '获取目录失败:' + e.message,
			duration: 2000,
			icon: 'none'
		});
	});
}

//创建一个新目录
function CreateNewDir(url, dirName) {
	//url值可支持相对路径URL、本地路径URL
	return new Promise((resolver, reject) => {
		plus.io.resolveLocalFileSystemURL(url, function(entry) {
			entry.getDirectory(dirName, {
				create: true,
				exclusive: false
			}, function(dir) {
				resolver(true)
			}, function(error) {
				reject(error.message)
				uni.showToast({
					title: dirName + '目录创建失败:' + error.message,
					duration: 2000,
					icon: 'none'
				});
			});
		}, function(e) {
			reject(error.message)
			uni.showToast({
				title: '获取目录失败:' + e.message,
				duration: 2000,
				icon: 'none'
			});
		});
	})
}


function copyFileTo(url, newUrl, dirName, newName) {
	if (url.length >= 7 && "file://" == url.substring(0, 7)) {
		url = url.substring(7)
	}
	let tempUrl = url.substring(0, url.lastIndexOf('/'));
	let addUrl = newUrl + '/' + dirName;
	console.log(addUrl, tempUrl)
	if (addUrl == tempUrl) {
		return url;
	}
	console.log(newUrl, dirName, newName)
	return new Promise((resolve, reject) => {
		plus.io.resolveLocalFileSystemURL(url, async (entry) => {
			if (entry.isFile) {
				let c = await CreateNewDir(newUrl, dirName)
				let u = await getDirsys(addUrl)
				entry.copyTo(u, newName, en => {
					resolve(en.fullPath);
				}, e => {
					console.log(e);
					reject('错误:复制时出现错误')
					uni.showModal({
						title: "错误",
						content: "复制时出现错误"
					})
				})
			} else {
				reject('错误:路径必须是文件')
				uni.showModal({
					title: "错误",
					content: "路径必须是文件"
				})
			}
		}, (e) => {
			console.log(e);
			reject(e)
			uni.showModal({
				title: "错误",
				content: "打开文件系统时出错"
			})
		});
	})
}
//获取目录对象
function getDirsys(url) {
	return new Promise((resolve, reject) => {
		plus.io.resolveLocalFileSystemURL(url, (entry) => {
			resolve(entry)
		}, (e) => {
			reject(e)
			console.log(e);
		});
	})
}
//将这些方法暴露出去
export {
	getJsonData,
	changeData,
	saveFile,
	creatDirs,
	moveDirectyOrFile,
	copyFileTo,
	getDirsys,
};

   二、写入

	import {changeData,getJsonData} from '@/common/convertFormat.js';

    //写在对应的方法上

       let ledData = {
		serialPortIndex : this.serialPortIndex,
		serialBaudrate: this.serialBaudrate
	  }
    //绝对路径,以"file://"开头。加粗样式 // /sdcard–>为根目录
	const pathUrl = 'file:///sdcard/records/led.txt';
	changeData(pathUrl, 0,ledData);

三、读取

	import {getJsonData} from '@/common/convertFormat.js';
    
    async initFile (){
				//获取配置文件中的打印机配置和led配置,赋值到缓存中
				const pathUrl = 'file:///sdcard/records/led.txt';
				let ledData = await getJsonData(pathUrl);
				ledData = JSON.parse(ledData);
				 if (ledData){
					 uni.setStorageSync('serialPortIndex',ledData.serialPortIndex)
					 uni.setStorageSync('serialBaudrate',ledData.serialBaudrate)
	 
				 }
					
				const printUrl = 'file:///sdcard/records/print.txt';
				let printData = await getJsonData(printUrl);
				printData = JSON.parse(printData)
				if (printData){
				 
					uni.setStorageSync('vendorId',printData.vendorId)
					 
				}
			},

  这样每次升级后,这个文件都会在,你也可以用android的文件管理工具,找到生成的这几个文件。路径 首页/ records/

如果有遇到权限问题则加 AndroidManifest.xml文章来源地址https://www.toymoban.com/news/detail-538619.html

<uses-permission android:name=“android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>
<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE\"/>
<uses-permission android:name=“android.permission.READ_EXTERNAL_STORAGE\"/>

到了这里,关于UniApp写入读取android本地文件,不会被清除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【uniapp】存储数据到本地文件以及读取本地文件数据

          可能存在的问题:                 1、高版本的安卓系统可能在文件系统中看不到文件但是可以读取                 2、该方法在安卓10系统中可能会有问题  

    2024年02月11日
    浏览(39)
  • uniapp小程序临时图片路径写入内存保存,并读取写入的图片

    功能背景 开发遇到奇葩需求,需要用户使用小程序时把图片以及操作数据保存在用户手机本地,那么就遇到问题了。图片随便拍一张都是几百kb,那么如果使用localstorage,存两三张就满了,就会自动清空数据,而且微信也会提示运行内存不足。。。所以另辟蹊径,使用 wx.Fi

    2024年02月14日
    浏览(34)
  • uniapp Android本地打包

    昨天借助了 uniapp云打包 的力量实现了线上打包;今天去实现以下 本地打包 ,后来发现本地打包是真的复杂,就连麦克阿瑟将军都曾说到,如果让我用uniapp本地打包,那我宁愿将枪口指向上帝。 ps:每位道友可能遇到的环境不同,并不一定适合所有人的环境 1. 安卓编辑器下

    2024年04月15日
    浏览(27)
  • uniapp 修改本地文件名称

    uniapp下载文件本地saveFile之后,文件名是时间戳的形式。而且uniapp官网并没有文件修改的方法 折腾了一天,终于解决了。 直接上代码 使用plus.io的文件管理方法。(不得不吐槽一下,这个文档写的真的是云里雨雾) Tips:这个方法改的名字要带后缀的,也可以改成Promise方法 和

    2024年02月12日
    浏览(33)
  • 【Android studio+uniapp】将Android 的插件打包成aar包放在uniapp中使用, Android studio将uniapp本地资源包打包成apk, 以及一些常用的配置

    点击构建--rebuild project 打完包后会在build--output--aar文件夹中显示. 然后将这个.aar文件放到uniapp中的自定义插件中. nativeplugins这个文件夹名不能改,固定的.然后到app原生插件中选择你刚刚的本地插件 到这里你就可以使用自定义的安卓的插件了. 1,将uniapp端的代码打包成本地资源

    2024年02月04日
    浏览(53)
  • 【uniapp】实现对TXT文本文件的读取和保存下载

    开发一个uniapp项目时,需要实现对文本的读取和保存文件到本地,虽然可以跨平台,但还是有几个平台不受支持的,接下来讲讲怎么兼容处理读写文本文件这个问题。 项目都按照uniapp官方文档说明写,发现此功能对应的 App 和 H5 平台是没有实现的 App H5 微信小程序 QQ小程序

    2024年02月04日
    浏览(35)
  • uniapp下载文件保存到手机本地

    最近接到一个项目需求,下载各种格式文件保存到手机本地 遇到的问题如下: 1、iphone手机无法保存到文件中 2、Android手机文件保存的位置不易查找 3、Android手机文件存储名称非文件原名,而是以时间戳命名 不可抗因素:   1、iphone自带的文件管理功能不能自动扫描各个APP下

    2024年02月11日
    浏览(35)
  • uniapp选取本地资源(图片,视频,文件)

    从本地相册选择图片或使用相机拍照。 App端如需要更丰富的相机拍照API(如直接调用前置摄像头),参考plus.camera OBJECT 参数说明 参数名 类型 必填 说明 平台差异说明 count Number 否 最多可以选择的图片张数,默认9 见下方说明 sizeType ArrayString 否 original 原图,compressed 压缩图,

    2024年02月11日
    浏览(32)
  • uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    由于uniapp 框架的局限先,有很多功能不能如原生android开发使用顺畅,因此,需要使用插件进行辅助,再由uniapp引入插件,使得功能完善。废话不多说,直接上教程!觉得有用的麻烦点个赞吧! uniapp 项目(也就是你自己的项目) 下载 安装JDK (java的JDK)jdk1.8 下载 安装 andr

    2024年02月06日
    浏览(49)
  • 【下载文件】uniapp开发小程序,下载文件并保存到本地

    1.1实现效果:点击文件附件,下载到本地 1.2具体代码: 2.1:效果图 保存方式是:点击下载按钮,通过微信选择一个好友,发给给好友的方式,进行保存。 2.2实现代码: 下载按钮: js:

    2024年02月16日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包