uniapp Android appelle le module IO de 5+plus pour gérer la gestion des fichiers

Étant donné que le récent projet uniapp doit ajuster 5+puls pour opérer l'ajout, la suppression, la modification et la requête de fichiers de téléphone mobile, je suis entré dans le puits de native.js>android>IO, et les documents officiels du site Web présentent d'abord le 5+
puls documents du site officiel

Tout d'abord, permettez-moi de vous présenter que notre espace de stockage a deux modes, à savoir le mode bac à sable et le répertoire public du système.
Nous utilisons ici le mode bac à sable et l'espace de stockage dans le répertoire racine de l'application (il peut être accessible sans autorisation, et il est autorisé par défaut)
L'adresse où nos fichiers téléchargés sont enregistrés sur le téléphone mobile.uni.saveFile() est également stocké en mode sandbox.

Mode bac à sable

PRIVATE_WWW : Application de constantes de répertoire de ressources privées
PRIVATE_DOC : Application de constantes de répertoire de documents privés
PUBLIC_DOCUMENTS : Application de constantes de répertoire de documents publics (utilisées dans l'exemple suivant)
PUBLIC_DOWNLOADS : Application de constantes de répertoire de téléchargement public
Si je veux télécharger un nouveau fichier ou créer un nouveau fichier dans le répertoire racine de l'application Comment faire fonctionner le répertoire , l'opération de style gras est la suivante

export function createFlie(path,data) {
    
    
  return new Promise(resolve => {
    
    //这里封装了个是一个promise异步请求
    // plus.io.requestFileSystem是请求本地文件系统对象
    plus.io.requestFileSystem(
    	plus.io.PUBLIC_DOCUMENTS, // 文件系统中的根目录下的DOCUMENTS目录
    	fs => {
    
    
    		// 创建或打开文件, fs.root是根目录操作对象,直接fs表示当前操作对象
    		fs.root.getFile(path+'.json', {
    
    
    			create: true // 文件不存在则创建
    		}, fileEntry => {
    
    
    			// 文件在手机中的路径
    			// console.log(fileEntry.fullPath)
    			fileEntry.createWriter(writer => {
    
    
    				// 写入文件成功完成的回调函数
    				writer.onwrite = e => {
    
    
    					console.log("写入本地文件成功");
						resolve("写入本地文件")
    				};
    				// 写入数据
    				writer.write(JSON.stringify(data));
    			})
    		}, e => {
    
    
    			console.log("getFile failed: " + e.message);
    		});
    	},
    	e => {
    
    
    		console.log(e.message);
    	}
    );
  })
}
//查看我们新建的documents目录下的所有文件,或者删除指定文件
export function getFileList(path) {
    
    
	return new Promise(resolve => {
    
     //文件读写是一个异步请求 用promise包起来方便使用时的async+await
	//  io.dcloud.HBuilder 是真机调试的包名,,
	//"/storage/emulated/0/Android/data/io.dcloud.HBuilder/documents"
	//  如果要进行打包那么就要改成你打包包名,比如我的包名是uni.UNIACE0B00那就改成
	//  "/storage/emulated/0/Android/data/uni.UNIACE0B00/documents"
		plus.io.requestFileSystem(
			"/storage/emulated/0/Android/data/uni.UNIACE0B00/documents", //指定的目录
			function(entry) {
    
    
				var directoryReader = entry.createReader(); //获取读取目录对象
				directoryReader.readEntries(
					function(entries) {
    
    
						resolve(entries)
						//entries目录是一个数字遍历就能得到文件了,如下
						// for (var i = 0; i < entries.length; i++) {
    
    
						// 	//   entries[i].remove();  //这是删除指定的文件
						// 	console.log("文件信息:" + entries[i].name);
						// }
					},
					function(err) {
    
    
						uni.showToast({
    
    
							title: "访问目录失败:" + err.message,
							duration: 2000
						})
						console.log("访问目录失败");
					});
			},
			function(err) {
    
    
				// uni.showToast({
    
    
				// 	title: "访问指定目录失败:" + err.message,
				// 	duration: 2000
				// })
				console.log("访问指定目录失败:" + err.message);
			});
	})
}
//查看目录下的某个指定文件
export function getFileData(path) {
    
    
	return new Promise(resolve => {
    
     //文件读写是一个异步请求 用promise包起来方便使用时的async+await
		plus.io.requestFileSystem(
			plus.io.PUBLIC_DOCUMENTS,
			fs => {
    
    
				fs.root.getFile(path + '.json', {
    
    
					create: false
				}, fileEntry => {
    
    
					fileEntry.file((file) => {
    
    
						console.log("文件大小:" + file.size + '-- 文件名:' + file.name);
						//创建读取文件对象
						let fileReader = new plus.io.FileReader();
						//以文本格式读取文件数据内容
						fileReader.readAsText(file, 'utf-8');
						//文件读取操作完成时的回调函数
						fileReader.onloadend = (evt) => {
    
    
							console.log(JSON.parse(evt.target.result),
								'JSON.parse(evt.target.result)')
							resolve(JSON.parse(evt.target.result))
							// sURL = JSON.parse(evt.target.result).URL;

						}
					});
				}, e => {
    
    
					console.log("getFile failed: " + e.message);
				});
			},
			e => {
    
    
				console.log(e.message);
			}
		);
	})
}

lorsque la page est appelée

import {
    
     createFlie,getFileData,getFileList } from '@/utils/localFile'

//新建文件
async customFlie() {
    
    
let fileName=123 //fileName为你要定义的字符串文件名,
let ballList=[0]   //ballList是你要存的json数据
	let resC = await createFlie(fileName, ballList)
}

async getlist() {
    
    
     //查看某个指定的目录下的所有文件文件
	 let resFileList = await getFileList()
     //查看documents目录下的某个指定文件,比如123
     let fileName=123
     let resFileData = await getFileData(fileName)
}

Ce qui précède est la méthode d'exploitation des fichiers sandbox

Répertoire public du système

Donc pour étendre, si vous voulez lire le fichier répertoire public du système d'exploitation, la méthode est la suivante

export function getFileList() {
    
    
	return new Promise(resolve => {
    
     
    调用系统的目录文件用绝对路径在在沙盒模式的路径前+file://
		plus.io.resolveLocalFileSystemURL(
			 "file:///storage/emulated/0/DCIM/Camera",, //系统公共本地相册
			function(entry) {
    
    
				var directoryReader = entry.createReader(); //获取读取目录对象
				directoryReader.readEntries(
					function(entries) {
    
    
						resolve(entries)
						//entries目录是一个数字遍历就能得到文件了,如下
						// for (var i = 0; i < entries.length; i++) {
    
    
						// 	//   entries[i].remove();  //这是删除指定的文件
						// 	console.log("文件信息:" + entries[i].name);
						// }
					},
					function(err) {
    
    
						console.log("访问目录失败");
					});
			},
			function(err) {
    
    
				console.log("访问指定目录失败:" + err.message);
			});
	})
}

Si vous avez besoin de créer un nouveau répertoire ou fichier local ?
5+plus ne semble pas fournir d'API, vous devez utiliser un plug-in natif.
Vient ensuite l'idée de développement d'un plug-in natif.
Android 9 et les versions antérieures ne peuvent pas lire et écrire dans l'espace interne d'autres applications, et les fichiers de tout autre répertoire peuvent lire et écrire.

Android 10 Si 29<targetSdkVersion <30, vous pouvez ajouter android:requestLegacyExternalStorage="true" au nœud d'application dans le fichier AndroidManifest.xml pour fermer la partition. S'il est
supérieur à targetSdkVersion >30, equestLegacyExternalStorage="true" sera également être invalide
et demander une autorisation

<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\"/>

andorid 11+ applique le stockage partitionné. Les applications ne sont pas autorisées à lire et à écrire des fichiers de ressources dans des répertoires sandbox non applicatifs et des répertoires publics système. Nécessite l'accès à toutes les autorisations de fichiers

Guess you like

Origin blog.csdn.net/weixin_45596949/article/details/125337305