uniapp在安卓10+情况下移动文件的解决方案

这篇具有很好参考价值的文章主要介绍了uniapp在安卓10+情况下移动文件的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

uniapp在安卓10+情况下移动文件的解决方案

首先看一个简单的问题,就是uniapp如何将下载的图片保存到手机本地,直接看下面的代码

				const imgUrl = 'https://fanyi-cdn.cdn.bcebos.com/static/translation/img/header/logo_e835568.png'
				let dtask = plus.downloader.createDownload(imgUrl, {
					//1.本地路径开头使用file://;
					//2.Android平台本地绝对路径为"storage/emulated/0",就是用户文件管理器能看到的了;
					//3.创建"xxx"作为文件夹名称,后缀是用于文件命名和格式修改,大家可以使用变量。
					filename: 'file:///storage/emulated/0/nameplate/' + filename  //利用保存路径,实现下载文件的重命名
				}, (d, status) => { //d为下载的文件对象;status下载状态
					// console.log(d, status)
					if(status == 200){
						//d.filename是文件在保存在本地的相对路径,使用下面的API可转为平台绝对路径
						// let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename)
						// plus.runtime.openFile(d.filename); //选择软件打开文件
						uni.showToast({
							title: '保存成功',
							duration: 2000
						})
					} else {
						uni.showToast({
							title: '保存失败',
							duration: 2000
						})
					}
				})
				dtask.start()

主要说明一个问题,就是安卓平台本地路径的问题,'file:///storage/emulated/0/nameplate/' + filename这行代码实际上是在用户打开安卓手机文件管理器的根目录下的nameplate文件夹下下载指向imgUrl链接的图片,如果没有nameplate文件夹,则会新建一个文件夹

回到主题,有这么个需求,手机在离线情况下,app拍了一张照片,如何把这张照片保存在手机本地呢?写了三天的bug终于搞通了

这个问题困扰了我好几天的时间,主要遇到了的是下面这个问题:

安卓10+平台,APP不能直接将文件存储到任何的本地目录,通俗来说,就是没有手机文件夹的访问权限,所以,如果想要像上面那样,把文件移动或者复制到nameplate文件夹下,根本做不到,不要问为啥下载图片可以做到,这根本就不是同一个概念。这里的保存图片,是将刚刚拍摄的照片(这个照片是临时的,不要选择原图)存在了应用下的一个沙盒目录里,注意,**“应用下”**很重要。相当复杂,根本解释不明白,笑死,这里给个链接,就是涉及到code: 15报错时的解决方案

适配Android10+设备注意事项

博主非安卓开发,看的一知半解,大概意思就是,uniapp开发的安卓应用,只能在自己的应用下对文件进行读写,官方称之为沙盒目录,当然,也可以访问有限几个公共目录,诸如相册、音乐之类的

那这不完蛋了,那开发的安卓应用要使用手机里面的文件可咋办,怎么说呢,无解,很头疼

再次回到主题,手机离线状态下,用开发的app拍了一张照片,然后想把这张照片保存在手机本地,等有网络后再次发给谁,这个需求相对的怪异对不对,也别管了,我自己都觉得怪异,反正就是这么个需求。

那么,要明确这么几个问题

  1. 安卓10+,uniapp开发的应用只能读写应用目录下的文件,也就是沙盒里面的文件

  2. 承接上面的问题,不管是拍照,还是直接选取本地的图片,那么,想要移动这个图片,就不能选原图了,因为选择原图之后,图片路径指向就到了沙盒外面,所以这个问题要注意

  3. 那么,怎么移动图片呢,推荐使用plus.io中的moveTo(直接移动)或copyTo(复制)方法,经测,这两个都可行,网上都说copy好用而move不好用,我不知道他们的具体问题是啥,所以也不好评价他们为啥会得出这么怪异的结论

  4. 既然说到用moveTo方法,那看看uniapp怎么说的,它说moveTo只支持沙盒目录,正好印证了上面我说的,移动文件只能在应用目录下面

    以下是针对分区存储机制作出文件操作目录限制的5+API:

    • plus.io中的getAudioInfo、getVideoInfo、getFileInfo、getImageInfo仅支持应用沙盒目录和系统公共目录
    • plus.io中的DirectoryEntry对象的removeRecursively、getDirectory、getFile、remove、copyTo、moveTo仅支持应用沙盒目录
    • plus.io中的DirectoryEntry对象的getMetadata 、getParent仅支持应用沙盒目录和系统公共目录
    • DirectoryReader.readEntries仅支持应用沙盒目录和系统功能目录
    • FileWriter.write、FileWriter.truncate、FileReader.readAsText仅支持应用沙盒目录
    • plus.camera.CameraOptions中的filename仅支持应用沙盒目录。
    • plus.gallery.save中的path仅支持应用沙盒目录。
    • plus.zip.compress中的src、zipfile仅支持应用沙盒目录。
    • plus.zip.decompress中的zipfile、target仅支持应用沙盒目录。
    • plus.zip.CompressImageOptions中的dst仅支持应用沙盒目录、src仅支持应用沙盒目录和系统公共目录。
    • plus.map相关的plus.maps.Marker.setIcon、setIcons、plus.maps.Bubble.setIcon图片地址仅支持应用沙盒目录。
    • plus.nativeObj.Bitmap.save中的path 仅支持应用沙盒目录。
    • plus.video.VideoPlayerStyles中的src仅支持应用沙盒目录和系统公共目录。
    • plus.nativeUI.toast自定义ToastStyles后android11设备不支持应用进入后台弹出toast显示。

    以上API设置了不支持的目录部分会返回code =15的错误信息!,部分会返回执行失败的错误回调具体以API为准!

  5. 那么,到底该怎么写代码呢,官方也没说,它只给了一个沙盒目录的写法,如下,怎么被坑的,就是被这个官方推荐的链接给坑的。经过好几天的实测,发现文件的移动应该是在外部存储空间目录,就是file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/documents这个东西,但是它给错了,经测,正确写法是file:///storage/emulated/0/Android/data/%PACKAGENAME%/apps/%APPID%/doc,当然,这个目录其实要自己打印,可能每个安卓版本都不一样,所以我才会被坑了如此之久

    应用沙盒目录分为:

    • 内部存储空间目录
      • plus.io.PRIVATE_WWW 对应绝对路径 file:///data/user/0/%PACKAGENAME%/files/apps/%APPID%/www
      • plus.io.PRIVATE_DOC 对应绝对路径 file:///data/user/0/%PACKAGENAME%/files/apps/%APPID%/doc
    • 外部存储空间目录
      • plus.io.PUBLIC_DOCUMENTS 对应绝对路径 file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/documents
      • plus.io.PUBLIC_DOWNLOADS 对应绝对路径 file:///storage/emulated/0/Android/data/%PACKAGENAME%/.%APPID%/downloads

到了这里,前因后果都说的差不多了,可以上代码了

我把相关的代码放上来

启动相机部分

				uni.chooseImage({
					count: 1,
					sizeType: ['compressed'],
					sourceType: ['album', 'camera'],
					success: (res) => {
						that.resShow = true
						let filepath = res.tempFilePaths[0]
						that.phtotoUrl = filepath
						
					}
				})

这段代码是拍摄图片时需要用到的,注意看,sizeType有两个可选参数,一个是原图’original’,还有一个就是压缩图’compressed’,我这里只选了压缩图,是因为我发现选择原图的话,后面又会报错,就是下面这个让人头疼的报错,主要原因还是原图不在沙盒目录下,选择压缩图,会在应用目录下面创建一个临时的文件路径

{"code":15,"message":"targetSdkVersion设置>=29后在Android10+系统设备不支持当前路径。请更改为应用运行路径!具体请看:https://ask.dcloud.net.cn/article/36199"}

文件移动部分

			moveDirecty(){				
				
				const oldPath = this.phtotoUrl
				
				const newLocalPath = 'file:///storage/emulated/0/Android/data/%PACKAGENAME%/apps/%APPID%/doc'
				const filename = '/' + Date.now() + '.png'
				plus.io.resolveLocalFileSystemURL(newLocalPath, function(entry1){
					console.log('新目录----'+entry1.fullPath)
					plus.io.resolveLocalFileSystemURL(oldPath, function(entry2) {
						console.log('旧文件---'+entry2.fullPath)
						entry2.moveTo(entry1, filename, function(res){
							console.log('移动成功')
						}, function(e){
							console.log('内层移动失败'+JSON.stringify(e))
						})
					}, function(e){
						console.log('移动失败'+JSON.stringify(e))
					})
				}, function(e){
					console.log('外层操作失败'+JSON.stringify(e))
				})
				
			}

上面说了这么多,到这里应该差不多了,不过这里一串的异步代码,让人看了非常无语,没办法,只能这么写了,上面的这个代码其实也搞了很久才搞明白,下面解释一下

plus.io.resolveLocalFileSystemURL这个是安卓解析路径的方法,它有一个参数和一个回调函数,参数就是文件路径,回调函数只有一个参数,它是个啥玩意儿呢,就是将你前面传递的文件路径解析出来

这里我嵌套了两层plus.io.resolveLocalFileSystemURL,一个解析原图片的路径,一个解析目标文件的路径,最里层就正儿八经的用到了moveTo这个方法,注意写法,是解析出来的对象再调用这个方法,entry2是旧目录,moveTo传递2个参数和一个回调函数,第一个参数是解析后的新目录,第二个参数类似重命名,回调函数就是成功与否了

还有一个坑,就是这几个回调函数能不能写成箭头函数的问题,我一度以为自己已经完全吃透了箭头函数的写法,但从现实来看,并没有,之前我这里都写的是箭头函数,因为疯狂报错,我全部改成了原始的写法,但我不确定到底是哪个错误引起的,箭头函数不一定背这个锅。如果还没完全搞明白箭头函数怎么写,还是老老实实写回原始的吧。文章来源地址https://www.toymoban.com/news/detail-433772.html

到了这里,关于uniapp在安卓10+情况下移动文件的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • win10安装安卓子系统android13肯定成功补充说明Win1022H2安装WSA安卓子系统部署失败0x80073CF3无法进行更新、相关性或冲突验证Xaml.2.8解决方案

    说明:该文章为我之前的文章的一个补充说明,也是由于最近系统出了问题后,进行了更新到Win10最新系统后,出现的一些问题,并做了以下的一些记录: 这里呢,我是昨天重新下载并更新了系统为22H2,所以,我还在用之前的安卓子系统时,出现了问题,无法部署成功,“部

    2024年02月20日
    浏览(51)
  • 死锁的典型情况、产生的必要条件和解决方案

    死锁:多个线程同时被阻塞,他们中的一个或全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 目录 前言 一、死锁的三种典型情况 (一)一个线程一把锁 (二)两个线程两把锁 (三)N个线程M把锁 二、死锁产生的必要条件(缺一不可)

    2024年02月11日
    浏览(39)
  • 应对苹果商店审核失败:解决Flutter应用被拒绝的常见情况与解决方案

    Flutter是一款由Google推出的跨平台移动应用开发框架,其强大的性能和流畅的用户体验使其备受开发者青睐。然而,开发一款应用只是第一步,将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上架到苹果商店,让您的应用更快

    2024年04月14日
    浏览(66)
  • 解决Uniapp插件市场试用原生插件项目 没有MD5签名安卓无法自定基座打包的情况

    由于Android Studio官网无法正常打开,所以进入google的网站进行下载Android Studio,网址:https://developer.android.google.cn/ 进入页面 后,点击“下载Android Studio” 进入页面后,当前推荐的版本是“Android Studio Hedgehog”, 点击按钮下载 。 Android Studio安装成功后,新建项目New Project选择

    2024年01月19日
    浏览(62)
  • 安卓APP抓包解决方案(教程)

      在我们日常的渗透测试工作中经常会发现手机APP抓取不到数据包的情况,本篇文章讲解的是通过postern代理软件来全局转发流量至charles联动BURP来对APP进行渗透,在这套环境配置完成之后可以为你后面的app抓包省下不少时间与麻烦。 kali windows burpsuite 夜神模拟器 Android7.0以

    2023年04月12日
    浏览(47)
  • pc端与移动端适配 解决方案

    一般网站实现pc端与移动端适配的需求,方案有两个: 1、一套页面,从设计时就考虑到跨设备适配,响应式的一步到位; 2、开发两套页面,根据设备尺寸加载加载不同的资源,目前已经不常见了; 做一个响应式的页面。即只用一个链接,用媒体查询来控制样式。同一个链接

    2024年02月04日
    浏览(38)
  • Unity 之 安卓平台上架隐私问题解决方案

    场景 1: APP 未见向用户明示个人信息收集使用的目的、方式和范围,未经用户同意,存在收集 Android ID、SIM 卡信息的行为。(存在风险) 场景 2: APP 未见向用户明示 SDK 收集使用个人信息的目的、方式和范围,未经用户同意,SDK 存在收集 com.unity3d.player 获 取 SIM 卡信息、c

    2024年02月16日
    浏览(35)
  • (转)H5和IOS/安卓通信解决方案

    项目背景:现有H5项目,要快速完成一个app开发,由于周期紧张只能先用H5套壳完成一版app。在其中,涉及到不同端的交互。 如果业务逻辑比较复杂,比如页面需要获取 IOS 端传回的返回值,或者 IOS 端需要调用 js 方法。可以通过第三方库来实现,我们项目用的是 WebViewJavasc

    2024年02月01日
    浏览(48)
  • web移动端适配有哪些解决方案?每个方案的优缺点评估

    移动端适配的解决方案主要包括以下几种: rem方案 :这是最早被广泛采用和讨论的移动端适配方案。通过在页面上使用 rem 单位来控制页面元素的大小,实现在不同尺寸的设备上保持界面展示效果的一致性。这种方案的优点在于简单易用,但缺点是对安卓的适配性可能不够好

    2024年02月21日
    浏览(49)
  • 安卓APP限制截屏录屏解决方案

    经过两天的研究, 思路:投屏到电脑,然后windows窗体截图。 具体思路是:可以使用投屏软件,把安卓屏幕投到电脑上,然后根据句柄,截取windows窗口截图 于是,我根据思路,,研究出来了使用python【当然如果精通其它语言,不会python,可以根据上面的思路自行写代码】,

    2023年04月08日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包