saveImg(imgurl) {
// #ifdef APP-PLUS
uni.downloadFile({
url: imgurl,
success: function(res) {
uni.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: (f) => {
getApp().showToast("已保存至" + f.path.split(
'file:///storage/emulated/0')[1])
console.log('保存成功')
},
fail: (err) => {
console.error(err)
getApp().showToast('保存失败')
}
})
}
})
// #endif
}
- 发布:2023-07-14 15:02
- 更新:2024-07-21 11:53
- 阅读:1531
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 22621.1992
HBuilderX类型: Alpha
HBuilderX版本号: 3.8.7
手机系统: Android
手机系统版本号: Android 13
手机厂商: vivo
手机机型: vivo Y77e
页面类型: vue
vue版本: vue3
打包方式: 云端
项目创建方式: HBuilderX
示例代码:
操作步骤:
- 新建项目,设置mainfest.json Android配置的targetSdkVersion为33。
- 新建页面,将代码示例中的方法复制至methods中,调用方法。
- 新建项目,设置mainfest.json Android配置的targetSdkVersion为33。
- 新建页面,将代码示例中的方法复制至methods中,调用方法。
预期结果:
保存成功
保存成功
实际结果:
保存失败
{"errMsg":"saveImageToPhotosAlbum:fail No Permission","code":12}
保存失败
{"errMsg":"saveImageToPhotosAlbum:fail No Permission","code":12}
bug描述:
原本是没有设置 targetSdkVersion的,打包出来运行一切正常。
因项目需要使用UTS插件,将mainfest.json中Android配置 targetSdkVersion设为33。
在Android 13系统中,同样的代码,调用 uni.saveImageToPhotosAlbum() 无法保存图片至相册,报错信息:
{"errMsg":"saveImageToPhotosAlbum:fail No Permission","code":12}
检查过应用权限,确认照片与视频、管理所有文件权限均已打开,依旧报错。
**示例项目:
下载地址
SingmyAaronLan (作者)
emmm...决定放弃uni.saveImageToPhotosAlbum()了
项目没准备适配iOS,所以直接用plus的 Downloader模块 加上 Android 的 MediaScanner库(用来解决保存文件不能立刻被其他应用发现的问题,不想写插件的可以直接参考 Ba-MediaUtil)
示例代码
const mediaUtil = uni.requireNativePlugin('Ba-MediaUtil');
let dtask = plus.downloader.createDownload(url, {
filename: "file:///storage/emulated/0/Pictures/xx.png" //这里注意一定是三个“/”
},
function (d, status) {
if (status == 200) {
let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);
mediaUtil.refreshFile({
path: fileSaveUrl
}, (ret) => {
console.log('媒体库刷新:', ret)
});
getApp().showToast('成功保存至' + fileSaveUrl.replace('/storage/emulated/0', ''))
} else {
getApp().showToast('下载失败')
plus.downloader.clear();
}
})
dtask.start();
相册权限问题的话可以写uts插件或者原生插件,
因为 比较懒 没精力,直接用uts了
参考 Android平台uts开发指南 - 系统权限管理
经测试,官网的demo代码出现许多报错,
大概为:
1.错误的关键字:val -> var
-
错误的数据类型: MutableList<String> -> Array<string>
-
错误的非空断言:!! -> !(kotlin中的非空断言是!!,ts中是一个!)
-
错误的注释:用户拒绝了部分权限,仅允许了grantedList中的权限 -> 用户拒绝了grantedList中的权限
以下为修复后的 uts 代码
import { UTSAndroid } from "io.dcloud.uts";
export function checkSystemPermissionGranted(permissions : Array<string>) : boolean {
var grant = UTSAndroid.checkSystemPermissionGranted(UTSAndroid.getUniActivity()!, permissions);
return grant
}
export function getSystemPermissionDenied(permissions : Array<string>) : Array<string> {
var denied = UTSAndroid.getSystemPermissionDenied(UTSAndroid.getUniActivity()!, permissions)
return denied
}
export function requestSystemPermission(permissions : Array<string>) : void {
UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, permissions, function (allRight : boolean, grantedList : string[]) {
if (allRight) {
console.log('用户同意了全部权限')
} else {
console.log(`用户仅同意了如下权限:${grantedList}`)
}
}, function (doNotAskAgain : boolean, grantedList : string[]) {
if (doNotAskAgain) {
console.log('用户拒绝了权限,并且选择不再询问')
} else {
console.log(`用户拒绝了如下权限:${grantedList}`)
}
})
}
export function gotoSystemPermissionActivity(permissions : Array<string>) : void {
UTSAndroid.gotoSystemPermissionActivity(UTSAndroid.getUniActivity()!, permissions);
}
使用示例
import * as sinlePerm from "../../uni_modules/sinle-perm";
// 检查权限是否被允许
console.log(sinlePerm.checkSystemPermissionGranted(["android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VIDEO",
"android.permission.READ_MEDIA_AUDIO"
]))
// 获取被禁止权限列表
console.log(sinlePerm.getSystemPermissionDenied(["android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VIDEO", "android.permission.READ_MEDIA_AUDIO"
]))
// 请求指定权限
sinlePerm.requestSystemPermission(["android.permission.READ_MEDIA_IMAGES",
"android.permission.READ_MEDIA_VIDEO", "android.permission.READ_MEDIA_AUDIO"
])
请问一下有人解决吗
爱豆豆 - 办法总比困难多
可以参考一下这篇问答 跟你的问题类似:https://ask.dcloud.net.cn/question/160879
-
SingmyAaronLan (作者)
这篇之前看过,
"<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\"/>",
"<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\"/>",
两个权限都已经加入,但仍然无效2023-07-14 16:16
-
SingmyAaronLan (作者)
回复 2***@qq.com: 附件过大,就直接上链接了
https://mp-cc3f25eb-d6ea-44a4-8c91-70c11cd03d7b.cdn.bspapp.com/resources/errors/permission.zip2023-07-15 09:33
SingmyAaronLan (作者)
另外,uts的权限管理用的是XXPermissions,
根据文档
参考官网 Android原生应用清单文件和资源,在根目录新建AndroidManifest.xml文件(注意大小写敏感),在
<application>
下写入<meta-data android:name="ScopedStorage" android:value="true" />
以此来声明适配了Android 10 及以上版本的分区存储特性,否则可能会在请求部分权限时报错:
除了以上方法,如果你的项目未适配分区存储的话,可以声明android.permission.MANAGE_EXTERNAL_STORAGE权限。当然如果你的项目面对Android较高版本时,尽量使用第一种方法
2023-08-16 16:28