ionic多图片选择器-ImagePicker

前言

上一篇文章已经阐述了如何进行ionic项目的快速开发和一些注意事项,接下来这一篇就简单说明一下多图片选择器的使用。
在很多场景中我们都需要用到图片的选择,其中有选择一张图片的,也有选择多张图片的。选择一张图片的话,可以使用cordova-plugin-camera插件,如果需要选择多张图片的话,可以使用cordova-plugin-telerik-imagepicker插件

安装

ionic的官网上有imagepicker插件的安装介绍。
步骤一:打开终端,cd进入到你的项目路径,输入:

ionic cordova plugin add cordova-plugin-telerik-imagepicker --variable PHOTO_LIBRARY_USAGE_DESCRIPTION="your usage message"

your usage message 是你要访问图片权限的说明,这个是必须写的,否则在iOS平台和android6+平台上,程序会奔溃。

步骤二:需要将安装好后的插件通过npm安装到ionic-native中,这样在后面的页面使用到这个imagepicker的时候,可以导入直接使用。安装命令:

npm install --save @ionic-native/image-picker

使用

1)在app.module.ts中导入

import{ ImagePicker } from'@ionic-native/image-picker';

2)在app.module.ts中的providers中写入ImagePicker,这个是ionic导入插件的方式。

3)在需要使用到imagepicker的页面的ts文件中导入

import{ ImagePicker } from'@ionic-native/image-picker';

4)在需要使用到imagepicker的页面的ts文件的constructor中声明一下实例。

constructor(private imagePicker: ImagePicker){ }

5)接着就可以在你的页面中调用imagepickerAPI了。

let options = {
  maximumImagesCount: **9**,
  outputType: 0,
  title:"相册"
  width:800,
  height:800,
  quality: 100,
};
this.imagePicker.getPictures(options).then((results) => { 
for(vari =0; i < results.length; i++) { 
console.log('Image URI: '+ results[i]); 
} 
}, (err) => {
});

参数说明:
maximumImagesCount:这个是最多选择的图片数量。
outputType:输出的数据类型,默认是FILE_URI对应的值是0,DATA_URL对应的值是1,也就是编码的base64
width:图片的宽度。
height:图片的高度。
quality:图片的质量,0最小,100最大。
title:选择器的标题,注意这个一定要写上,否则图片选择页面的标题默认是英文的。

图片的权限

iOS中,对于图片的选择,这个涉及到隐私,需要得到用户的允许;在android6+之后也加入了用户的权限允许。所以在进行调用imagepickerAPI之前一定要先判断一下,是否已经得到用户的权限允许。
hasReadPermission是判断用户是否已经阅读过权限,如果true,则调用getPictures API;如果为false,则调用requsetReadPermession来请求权限弹窗。
需要注意,requsetReadPermession只是弹出一个权限的窗口,窗口中的“允许”和“不允许”按钮是没有回调事件的。正是因为没有回调事件,所以“允许”和“不允许”之后的事件处理就不好操作。
权限处理的完整步骤:
首先,在app的platform ready之后调用requsetReadPermession,此时app启动后就会有一个权限弹窗,不管用户选择“允许”还是“不允许”,然后去到使用相册插件的页面,调起相册的API的时候就要进行判断,如果返回是false,可以弹出一个dialog告知用户相册权限已被禁止,需到手机的“设置”中修改,如果是true,则调用getPictures API。
1)platform ready中:

imagePicker.requestReadPermission();

2)需要调用相册API的页面中:

this.imagePicker.hasReadPermission().then((hasReadPermission)=>{//检查是否已经阅读相册权限
  console.log("--hasReadPermission--" + hasReadPermission);
  if(hasReadPermission == true){//是否允许
    this.getPhotoLibrary();
  }else {
    this.methodsProvider.alertText("相册权限已被您禁止!如需访问相册,请到手机的\"设置\"-\”该app\"-允许相册访问");
  }
});

ps:对于权限弹窗的“允许”和“不允许”没有回调事件,在GitHub上看到有人是这样处理的,还是先调用hasReadPermission ,如果返回false,就调用requsetReadPermession,如果也是返回false,就再次调用hasReadPermission,再次返回false的话,就再调用requsetReadPermession,这样周而复始。对于iOS来说,这样循环调用,权限弹窗始终只有一个,不会因为循环调用requsetReadPermession而导致多个权限弹窗,但是在Xcode上查看CPU一直在上涨,这样是不允许的;对于android来说。循环调用requsetReadPermession,如果此时不要点击权限弹窗的“不再提醒”并且点击“不允许”,那么权限弹窗会一直弹出来,这样也是不允许的。

permission.png

ImagePicker汉化

如果开发的app是给国内的用户使用的话,那么需要对imagepicker进行汉化,可以参考这篇文章
需要指出说明的是iOS不需要汉化,Resources目录下已经有文件夹zh-Hans.lproj ,但是对于android,则需要在platforms/android/res下创建文件夹values-zh,其下创建文件multiimagechooser_strings_zh.xml。 写入:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="multi_app_name">图片选择器</string>
  <string name="free_version_label">还可以选择 %d 张图片</string>
  <string name="error_database">打开图像数据库时出错,请反馈问题.</string>
  <string name="requesting_thumbnails">请求缩略图,请耐心等待</string>
  <string name="multi_image_picker_processing_images_title">正在处理...</string>
  <string name="multi_image_picker_processing_images_message">请稍等...</string>
  <string name="discard" translatable="false">取消</string>
  <string name="done" translatable="false">确定</string>
</resources>

注意点

1)ionic官网有2个imgaepicker,
https://github.com/wymsee/cordova-imagePicker
这个是比较旧的插件,可以使用,但是不能返回base64,只能返回file uri,如果想要将file uri转换为base64,可以使用file插件中的readAsDataURL API来转换。

let path;
if(this.platform.is('ios')){//ios
  path = this.file.tempDirectory;
}else {
  path = this.file.cacheDirectory;
}
//获取最后一个“/”的index
let index = file_uri.lastIndexOf("\/");
//获取最后一个"/"的内容最为fileName
let fileName = file_uri.substring(index+1,file_uri.length);
this.file.readAsDataURL(path, fileName)
  .then(base64File=>{
});

另一个插件:
https://github.com/Telerik-Verified-Plugins/ImagePicker
这个是ionic官方推荐的,返回可以是base64数据,但是刚开始使用的时候,android在选择图片的时候总是会crash,要查看AndroidManifest文件中是否写入:

<uses-permission android:name="android.permission.CAMERA" /> 

也有些人提示修改com.android.support:support 的版本问题。
后面是通过写入移除android平台,再重新加入android,并且写入android.permission.CAMERA解决了问题。
2)在汉化imagepicker的时候,需要给optiontitle参数赋值,否则图片选择页面的title默认是英文。
3)如果设置了maximumImagesCount,那么再选取完图片之后需要重新设置optionmaximumImagesCount
4)如果返回是file uri,对于android平台,这些文件会存储在临时文件里面,并且app不会自行清除,那么需要手动清除,可以使用file插件的removeFile API来清除。
原文:

When outputType is FILE_URI the plugin returns images that are stored in a temporary directory. These images will often not be deleted automatically though. The files should be moved or deleted after you get their filepaths in javascript. If Base64 Strings are being returned, there is nothing to clean up.

总结

cordova-plugin-camera插件可以直接调用API,不需进行权限的判断,getPictures已经包含了权限的判断,但是只能选去一张图片,而且选完图片之后还有一个图片范围的截取,对于很多应用是没有必要的。因此,只能使用imagepicker插件,在使用这个插件过程中遇到过许多问题,也进行了许多测试,其中最多的问题就是权限的问题和android crash的问题,后面都一一解决了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,472评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,566评论 25 707
  • 今天,发生在爸爸身上一件“乌龙”事件。 每周7天,语数外要上5次辅导班,一般情况都是下午放学,五点多接住你在外面赖...
    烫嘴的素饺子阅读 95评论 0 0
  • 有一次朋友问我,你喜欢了那么久的他现在还有感觉吗,我想了很久没有说那句话差点脱口而出的没有,我说,我举个例子吧,你...
    遥宝x阅读 277评论 0 0
  • 一、产品功能体验——五要素法 战略层(用户需求分析,包括用户画像,用户需求,产品的定位,产品的特色) 范围层(产品...
    小r的阿迪阅读 837评论 0 0