使用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吧。