使用photo-library插件保存图片到相册的时候,按照ionic上文档说明先使用requestAuthorization
方法请求权限,然后再使用saveImage
方法来保存图片即可。
this.photoLibrary.requestAuthorization().then(() => {
this.photoLibrary.saveImage(this.shareImage,'水滴打卡',{}).then(()=>{
this.toastProvider.show("保存成功","success");
console.log("保存成功");
}).catch((err) => {
console.log("保存失败");
console.log(err);
});
}).catch((err) => {
console.log("请求相册权限失败");
});
然而,当我实际放到android机器上测试后发现保存图片并没有效果,甚至也不弹出错误日志来。
没办法,我有在android studio上debug插件的源代码,当定位到请求权限的时候,我发现一个惊奇的事情。
原来当不定义option
的时候,默认write权限是false
.
好吧,原来是这里的问题。后台我去了cordova-plugin-photo-library的主页,发现文档里确实有说明。
所以修改代码增加option即可。
this.photoLibrary.requestAuthorization({
"read": true,
"write": true
}).then(() => {
this.photoLibrary.saveImage(this.shareImage,'水滴打卡',{}).then(()=>{
this.toastProvider.show("保存成功","success");
}).catch((err) => {
console.log(err);
this.toastProvider.show("保存失败,请重试","error");
});
}).catch((err) => {
this.toastProvider.show("请求相册权限失败","error");
});
另外一个要注意的地方就是,插件默认不会把android的写权限增加AndroidManifest.xml里面去,所以如果的config.xml里面没有这条权限的话,需要手动把他加入进来。
<platform name="android">
<config-file target="AndroidManifest.xml" parent="/*">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</config-file>
</platform>
当然,事情还没那么顺利,我的相册仍然没有保存成功。后来在这个issue里找到和我问题类似的表述。
因为我的图片是远程图片地址并且带有参数?imageslime
,所以会导致图片保存失败,于是按照他们的提示
在图片地址上加入&ext=.jpg
这样的参数强制下载图片,问题得以解决,最终代码:
this.photoLibrary.requestAuthorization({
"read": true,
"write": true
}).then(() => {
this.photoLibrary.saveImage(this.shareImage+‘&.ext=jpg’,'水滴打卡',{}).then(()=>{
this.toastProvider.show("保存成功","success");
}).catch((err) => {
console.log(err);
this.toastProvider.show("保存失败,请重试","error");
});
}).catch((err) => {
this.toastProvider.show("请求相册权限失败","error");
});
2018.08.01 更新
ios11保存图片竟然也失败了,报了一个错误。
Retrieved asset is nil
在这个issue里也有具体的讨论,于是我去看了一下插件源码,保存图片还使用的是ALAssetsLibrary
,而问题可能就是出在使用这个库上。
而实际上从ios9以后苹果官方就建议使用PHPhotoLibrary
了,所以就把源码修改成了PHPhotoLibrary
的方式,
于是我修改了插件的源码,保存图片和返回都没有问题了。具体修改代码细节,请参考我提交的pull吧。
全部评论