1. 程式人生 > >MUI-APP開發之mui框架封裝獲取檔案方式

MUI-APP開發之mui框架封裝獲取檔案方式

<!doctype html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<link href="../css/mui.min.css" rel="stylesheet" />
		<header class="mui-bar mui-bar-nav">
			<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
			<h1 class="mui-title">檔案查詢</h1>
		</header>
	</head>

	<body>
		<div class="mui-content">
			<ul id="list" class="mui-table-view mui-table-view-chevron"></ul>
		</div>
		<script src="../js/mui.min.js"></script>
		<script src="../js/njs-io.js" type="text/javascript" charset="utf-8"></script>
		<script type="text/javascript">
			var nowFileType;
			var subRoot = null;
			var lockOadWebview = null;
			mui.init({
				/*preloadPages: [{
					id: 'lock-oadUpdate.html',
					url: 'lock-oadUpdate.html'
				}]*/
			});
			mui.plusReady(function() {
				var self = plus.webview.currentWebview();
				nowFileType = self.fileType;
				console.log("filepath:" + self.filepath);
				init(self.filepath);
				var sdRoot = getSDRoot();
				/*var location = "Download";
				init(sdRoot + "/" + location);*/

				//點選事件
				mui('.mui-table-view').on('tap', 'li', function() {
					var name = this.getAttribute('name');
					var fileType = this.getAttribute('data-type');
					var filepath = subRoot + '/' + name;
					console.log("檔案路徑-->" + filepath);
					console.log("檔名稱-->" + name);

					if(fileType === 'Folder') {
						mui.openWindow({
							url: 'file-query.html',
							id: 'file-query.html',
							createNew: true,
							extras: {
								filepath: filepath,
								fileType:nowFileType
							}
						})
					} else {
						//檔案
						if(name.indexOf(".bin") != -1) {
							console.log("這是bin檔案");
							if(name.indexOf("_"+nowFileType) == -1){
								mui.alert("請使用 "+nowFileType +" 型別檔案進行升級操作");
								return;
							}
							if(!lockOadWebview) {
								lockOadWebview = plus.webview.getWebviewById("lock-oadUpdate.html");
							}
							mui.fire(lockOadWebview, "oadInfa", {
								fileName: name,
								filePath: filepath
							})
							
							//跳轉不了
							/*mui.openWindow({
								url: 'lock-oadUpdate.html',
								id: 'lock-oadUpdate.html'
							});*/
							mui.back();
						}
					}
				})
			})

			function init(filePath) {
				// 獲得sd卡根目錄
				document.querySelector('.mui-title').innerHTML = filePath;
				var File = plus.android.importClass("java.io.File");
				subRoot = new File(filePath);

				// 遍歷sd卡根目錄下的所有檔案和資料夾
				var files = plus.android.invoke(subRoot, "listFiles");
				var len = files.length;

				var list = document.getElementById("list");
				var fragmentFolder = document.createDocumentFragment();
				var fragmentFile = document.createDocumentFragment();
				var li;
				for(var i = 0; i < len; i++) {
					var file = files[i];
					// 過濾隱藏檔案
					if(!plus.android.invoke(file, "isHidden")) {
						var name = plus.android.invoke(file, "getName");
						li = document.createElement('li');
						li.className = 'mui-table-view-cell mui-media';
						li.setAttribute('name', name);

						// 判斷是檔案還是資料夾
						if(plus.android.invoke(file, "isDirectory")) {
							// 設定標誌為資料夾,供後面使用
							li.setAttribute('data-type', 'Folder');
							// 讀取資料夾下子資料夾及子檔案數目
							var obj = readSonFilenum(file);
							li.innerHTML = '<a class="mui-navigate-right">' +
								'<img class="mui-media-object mui-pull-left" src="../img/folder.png">' +
								'<div class="mui-media-body">' + name +
								'<p class="mui-ellipsis">資料夾數量:' + obj.subFolderNum + ' 檔案數量:' + obj.subFileNum + '</p></div></a>';
							fragmentFolder.appendChild(li);
						} else {
							li.setAttribute('data-type', 'File');
							// 讀檔案大小
							var fileSizeString = readFileSize(file);
							li.innerHTML = '<a class="mui-navigate-right">' +
								'<img class="mui-media-object mui-pull-left" src="../img/file.png">' +
								'<div class="mui-media-body mui-ellipsis">' + name +
								'<p class="mui-ellipsis">' + fileSizeString + '</p></div></a>';
							fragmentFile.appendChild(li);
						}
					};
				}
				list.appendChild(fragmentFolder);
				list.appendChild(fragmentFile);
			}
		</script>
	</body>

</html>

其中njs-io.js檔案如下所示

/**
 * 獲得sd卡根目錄
 */
function getSDRoot(){
	// 匯入android.os.Environment類物件
	var environment = plus.android.importClass("android.os.Environment");
	// 判斷SD卡是否插入
	if(environment.getExternalStorageState() !== environment.MEDIA_MOUNTED){
		plus.nativeUI.toast('沒有找到SD卡');
		return;
	}
	console.log("獲取 Android 資料目錄:"+environment.getDataDirectory());
	console.log("獲取 Android 下載/快取內容目錄:"+environment.getDownloadCacheDirectory());
	console.log("獲取外部儲存目錄即 SDCard:"+environment.getExternalStorageDirectory());
	console.log("獲取外部儲存裝置的當前狀態:"+environment.getExternalStorageState());
	//console.log("獲取 Android 的根目錄:"+getRootDirectory());
	return environment.getExternalStorageDirectory();
}

/**
 * 建立資料夾
 * @param {Object} path
 */
function creatFolder(path){
	var File = plus.android.importClass("java.io.File");
	var fd = new File(path);
	if(!fd.exists()){
		fd.mkdirs();
		plus.nativeUI.toast("建立成功");
	}
}

/**
 *  刪除檔案(資料夾)
 * @param {Object} path
 */
function deleteFile(path){
	var File = plus.android.importClass("java.io.File");
	var fd = new File(path);
	if (fd != null && fd.exists()){
		fd.delete();
		plus.nativeUI.toast("刪除成功");
	}		
}

/**
 * 讀檔案大小
 * @param {Object} file
 */
function readFileSize(file){
	var FileInputStream = plus.android.importClass("java.io.FileInputStream");
    var fileSize = new FileInputStream(file);
	var size = fileSize.available();
	var fileSizeString;
	if(size == 0){
		fileSizeString = "0B";
	}else if(size < 1024){
		fileSizeString = size + "B";
	}else if(size < 1048576){
		fileSizeString = (size/1024).toFixed(2) + "KB";
	}else if (size < 1073741824){
		fileSizeString = (size/1048576).toFixed(2) + "MB";
	}else{
		fileSizeString = (size/1073741824).toFixed(2) + "GB";
	}
	return fileSizeString;
}

/**
 * 讀取資料夾下子資料夾及子檔案數目
 * @param {Object} file
 */
function readSonFilenum(file){
	var subFile = plus.android.invoke(file,"listFiles");
	var subLen = subFile.length;
	var obj = {
		subFolderNum: 0,
		subFileNum: 0
	};
	for(var k=0;k<subLen;k++){
		if(!plus.android.invoke(subFile[k],"isHidden")){
			if(plus.android.invoke(subFile[k],"isDirectory")){
				obj.subFolderNum++;
			}else{
				obj.subFileNum++;
			}
		}
	}
	return obj;
}