ionic拍照,从相册选择功能

在介绍插件的使用之前,我们有必要先大致了解下插件的原理

一、插件工作原理分析

一个插件是如何正确地在IONIC框架下运行的呢?

前台的HTML/js代码又是如何与后面具体平台做数据交互的呢?

这个就需要对插件的工作原理及各个模块之间的流程关系有一个基本的了解。

为了让插件能够访问具体平台系统的代码,Cordova提供了对应的标准封装API来完成,下面的图简单地示意了Android平台情况下的封装过程:

这里写图片描述

当用户使用ionic platform add android这个命令之后, 
ionic项目会自动将插件下的Java文件copy到platform/android/目录下面,同时将JS也copy到platform/android/目录下,最终使用Android的编译工具(aapt/aidl/dx/apkbuilder等)生成.APK应用程序。

对于一个新建的ionic项目,目录结构如下:

这里写图片描述

我们添加了一个相机插件,对于该插件下的java文件,可以发现当前整个项目下只有该处存在这个java文件:(在目录:项目根目录\plugins\cordova-plugin-camera\src\android下)

这里写图片描述

当我们使用ionic platform add android这个命令之后,可以发现,我们的插件相关的java文件被copy到platform/android/目录下面,即(项目根目录\platforms\android\src\org\apache\cordova\camera)

这里写图片描述

当我们用ionic build android命令编译过后,可以发现,这些java文件被编译成了class文件:

这里写图片描述

二、数据的交互

接着之前的继续。

我们已经清楚JS和ANDROID平台之间分别通过JS的CORDOVA.EXEC()和JAVA的CORDOVAPLUGIN.EXECUTE()函数来对接。

这两个接口的参数对应关系如下所示:

由于JS发送到Java的数据已经作为函数的参数传入, 所以函数中的回调参数,主要是帮助Java侧反馈数据给JS侧所用。

Cordova使用了org.apache.cordova.PluginResult来完成,当中的PluginResult.Staus代表JS调用插件成功与否的状态。

通常代码中判断状态值是否为PluginResult.Staus.OK,来确认调用结果成果或者失败。

 

此处参考了:http://www.ioniconline.com/plugin-dev-android/

此处参考了:http://blog.csdn.net/luo_xinran/article/details/52163307

 

三、使用cordova的camera插件

cordova plugin add cordova-plugin-camera

四、插件使用

1、仿微信模式(拍照,从相册选择两种模式),做好模式选择模板(photo.html)

1  <ion-modal-view style="min-height:90px;height:90px;top:40%" id="photo">
2    <ion-content class="padding" scroll="false" style="height:90px;padding:0px;">
3        <button class="button button-full button-calm photo" style="width:100%;marigin-top:0px;marigin-bottom:0px;border-bottom:1px solid white" ng-click="takePhoto(str,data)">拍照</button>
4        <button class="button button-full button-calm photo" style="width:100%;marigin-top:0px;marigin-bottom:0px;" ng-click="takePhoto1(str,data)">从相册选择</button>
5    </ion-content>
6  </ion-modal-view>

2、modal展示

 1       $ionicModal.fromTemplateUrl('templates/photo.html', {
 2             scope: $scope
 3           }).then(function(modal) {
 4             $scope.modal1 = modal;
 5       });
 6       $scope.show1 = function(str,taskData) { 
 7             $scope.str=str;
 8             $scope.data=taskData;
 9             $scope.modal1.show();
10       };

3、界面调用modal,展示模板界面:通过选择拍照,调用takePhoto;选择从相册选择,调用taskPhoto1;

<button ng-click="show1('afterImg',taskData)" style="width:132px;height:173px;background:url('camera.png') no-repeat;"></button> 

4、调用摄像头

  1 //调用摄像头
  2   $scope.takePhoto = function (str,taskData) {
  3     $scope.modal1.hide();
  4     document.addEventListener("deviceready", function () {
  5            var options = {
  6                 quality: 100,                                            //相片质量0-100
  7                 destinationType: Camera.DestinationType.FILE_URI,        //返回类型:DATA_URL= 0,返回作为 base64 編碼字串。 FILE_URI=1,返回影像档的 URI。NATIVE_URI=2,返回图像本机URI 
  8                 sourceType: Camera.PictureSourceType.CAMERA,             //从哪里选择图片:PHOTOLIBRARY=0,相机拍照=1,SAVEDPHOTOALBUM=2。0和1其实都是本地图库
  9                 allowEdit: false,                                        //在选择之前允许修改截图
 10                 encodingType: Camera.EncodingType.JPEG,                   //保存的图片格式: JPEG = 0, PNG = 1
 11                 targetWidth: 375,                                        //照片宽度
 12                 targetHeight: 667,                                       //照片高度
 13                 mediaType: 2,                                             //可选媒体类型:圖片=0,只允许选择图片將返回指定DestinationType的参数。 視頻格式=1,允许选择视频,最终返回 FILE_URI。ALLMEDIA= 2,允许所有媒体类型的选择。
 14                 cameraDirection: 0,                                       //枪后摄像头类型:Back= 0,Front-facing = 1
 15                 popoverOptions: CameraPopoverOptions,
 16                 saveToPhotoAlbum: true,                                   //照片是否保存到相册
 17                 correctOrientation:true                                   //此项为true,照片于拍照方向一样(但个别图片依然会出现旋转90度问题);为false图片会选择90度;
 18               };
 19 
 20           $cordovaCamera.getPicture(options).then(function (imageData) {  //此处根据实际需求,对上传文件地址(imageData)进行相应的操作,本项目是将其放入数组当中,以便通过ng-reapeat进行循环展示
 21               if(str=="img"){
 22 /*                  $scope.isShow=false;*/
 23                   $scope.arrayObj.push(imageData);
 24                   $scope.id=taskData.id;
 25 /*                  $scope.imageSrc = imageData;*/
 26               }else{
 27 /*                  $scope.isShowAfter=false;*/
 28                   $scope.arrayObj1.push(imageData);
 29                   $scope.id1=taskData.id;
 30 /*                  $scope.imageSrcAfter = imageData;*/
 31               }
 32 /*            $scope.uploadPhoto(taskData.id);*/
 33           }, function (err) {
 34             // error
 35           });
 36 
 37     }, false);
 38   };
 39 //调用摄像头(从相册选择)
 40   $scope.takePhoto1 = function (str,taskData) {
 41     $scope.modal1.hide();
 42     document.addEventListener("deviceready", function () {
 43            var options = {
 44                 quality: 100,                                            //相片质量0-100
 45                 destinationType: Camera.DestinationType.FILE_URI,        //返回类型:DATA_URL= 0,返回作为 base64 編碼字串。 FILE_URI=1,返回影像档的 URI。NATIVE_URI=2,返回图像本机URI 
 46                 sourceType: Camera.PictureSourceType.PHOTOLIBRARY,             //从哪里选择图片:PHOTOLIBRARY=0,相机拍照=1,SAVEDPHOTOALBUM=2。0和1其实都是本地图库
 47                 allowEdit: false,                                        //在选择之前允许修改截图
 48                 encodingType: Camera.EncodingType.JPEG,                   //保存的图片格式: JPEG = 0, PNG = 1
 49                 targetWidth: 375,                                        //照片宽度
 50                 targetHeight: 667,                                       //照片高度
 51                 mediaType: 2,                                             //可选媒体类型:圖片=0,只允许选择图片將返回指定DestinationType的参数。 視頻格式=1,允许选择视频,最终返回 FILE_URI。ALLMEDIA= 2,允许所有媒体类型的选择。
 52                 cameraDirection: 0,                                       //枪后摄像头类型:Back= 0,Front-facing = 1
 53                 popoverOptions: CameraPopoverOptions,
 54                 saveToPhotoAlbum: true,
 55                 correctOrientation:true
 56               };
 57 
 58           $cordovaCamera.getPicture(options).then(function(imageData) {
 59               if(str=="img"){                                             //标记str中,如果从相册选择的文件是mp4格式,将其放入arrayVideo数组,进行循环显示
 60 /*                  $scope.isShow=false;*/      
 61                   var type=imageData.split('.');
 62                   var last=type.length-1;
 63                    if(type[last]=='mp4'){
 64                       $scope.arrayVideo.push(imageData);
 65                    }
 66                    if(type[last]=='jpg'||type[last]=='png'){
 67                       $scope.arrayObj.push(imageData);
 68                    }
 69                   $scope.id=taskData.id;
 70 /*                  $scope.imageSrc = imageData;*/
 71               }else{
 72 /*                  $scope.isShowAfter=false;*/
 73                   $scope.arrayObj1.push(imageData);
 74                   $scope.id1=taskData.id;
 75 /*                  $scope.imageSrcAfter = imageData;*/
 76               }
 77 /*            $scope.uploadPhoto(taskData.id);*/
 78           }, function (err) {
 79             // error
 80           });
 81 
 82     }, false);
 83   };
 84   $scope.uploadPhoto = function (id,array) {
 85       for(var i=0;i<array.length;i++){
 86           var str=array[i].substring(0,4); 
 87           
 88           if(str!='http'){                                                //判断是否已经上传到服务器,如果已经上传,则不再重复上传(服务器获取的以http开头,从相册选择或者拍照的地址以file开头)
 89                var url='http://www.xxx.com/uploadProcessFile';            //文件上传地址
 90                var options = new FileUploadOptions();
 91                   var params = {
 92                     id: id
 93                   };
 94                   options.params = params;
 95                   options.fileKey = "uploadFile";
 96                   options.fileName = array[i].substr(array[i].lastIndexOf('/') + 1);           //获取文件名字,此处如果不写,后台处理默认当图片,则造成选择的是视频,但是上传到服务器上则是无法打开的图片
 97 
 98                  $cordovaFileTransfer.upload(encodeURI(url),array[i], options)
 99                            .then(function (result) {
100                              console.log(JSON.stringify(result));
101                              console.log("success");
102                            }, function (err) {
103                              console.log(JSON.stringify(err));
104                              console.log("fail");
105                            }, function (progress) {                                            //上传图片进度条展示
106                               $timeout(function () {
107                                     var uploadProgress = (progress.loaded / progress.total) * 100;
108                                     $ionicLoading.show({
109                                         template: "已经上传:" + Math.floor(uploadProgress) + "%"
110                                     });
111                                     if (uploadProgress > 99) {
112                                         $ionicLoading.hide();
113                                     }
114                                 })
115                  });
116           }
117       }
118     };
119  

 ionic也是在初步的学习当中,如果有好的实现方法,欢迎交流讨论~

转载于:https://www.cnblogs.com/BetterMyself/p/7117133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫爬图片教程_python爬虫实战之爬取京东商城实例教程

前言 本文主要介绍的是利用python爬取京东商城的方法&#xff0c;文中介绍的非常详细&#xff0c;下面话不多说了&#xff0c;来看看详细的介绍吧。 主要工具 scrapy BeautifulSoup requests 分析步骤 1、打开京东首页&#xff0c;输入裤子将会看到页面跳转到了这里&#xff0c…

安卓camera总体框架

今天是周五了&#xff0c;时间过得真快&#xff0c;通常这个时候&#xff0c;我都还沉醉了上班的状态中&#xff0c;说到上班&#xff0c;我是认真的&#xff0c;我非常喜欢上班&#xff0c;特别是今天&#xff0c;我会听到一声优美的声音&#xff0c;我的银行卡会多出一些钱&a…

matlab可以连接阻抗分析仪么,阻抗分析仪的工作原理与测试方法

阻抗分析仪和LCR表是非常通用的测量器件的电子仪器。根据阻抗范围和频率范围的不同&#xff0c;有一系列不同原理的仪器来满足测试要求&#xff0c;图1是不同阻抗范围和不同频率范围的阻抗测量方法。图1 阻抗测量方法图2是自动平衡电桥法的原理框图。通过精确测量加载到被测件D…

分享几个有意思的视频

最近微信加我的好友有点多&#xff0c;然后问问题的也不少&#xff0c;有的问题我不知道&#xff0c;有的问题我觉得百度一下应该很多答案&#xff0c;有的问题我觉得我可以知道&#xff0c;但是需要自己去寻找答案&#xff0c;也需要花费我一些时间&#xff0c;我有时候非常不…

php+redis+设置前缀,spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)

标签&#xff1a;spring中自动加上 SimpleKey [] 解决方案一、自定义后缀名1、定义类实现KeyGenerator接口MyKeyGeneratorpackage com.wbg.springRedis.service.impl;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.stereotype.Compon…

北京的林书豪,像一把小李飞刀

从《我要打篮球》节目开始&#xff0c;就一直在关注书豪的比赛&#xff0c;我喜欢书豪&#xff0c;书豪选择来CBA打球&#xff0c;也满足了很多球迷的愿望&#xff0c;近距离感受球星的那种状态&#xff0c;今天晚上&#xff0c;北京跟青岛的比赛&#xff0c;我是一分钟没有拉下…

I2C和SPI注定要打一架

最近微信群里好几天聊到I2C&#xff0c;既然说到了I2C&#xff0c;那就有必要说SPI&#xff0c;那就一起说了算了&#xff0c;大家有更好见解的&#xff0c;留言回复下&#xff0c;让更多的人知道你的观点。整理与网络&#xff0c;侵删I2C和SPI应该要打一架&#xff1f;现今&am…

第1章 ssh命令和SSH服务详解

基础服务类系列文章&#xff1a;http://www.cnblogs.com/f-ck-need-u/p/7048359.html 本文对SSH连接验证机制进行了非常详细的分析&#xff0c;还详细介绍了ssh客户端工具的各种功能&#xff0c;相信能让各位对ssh有个全方位较透彻的了解&#xff0c;而不是仅仅只会用它来连接远…

漫画:什么是区块链?

两年前&#xff0c;小灰以前写过一期关于区块链的漫画&#xff0c;可能很多新来的小伙伴还没有看过。最近趁着区块链重新成为热门话题&#xff0c;小灰把这篇漫画稍作修改&#xff0c;再次推送给大家。什么是区块链&#xff1f;区块链&#xff0c;英文 Blockchain&#xff0c;本…

php外卖系统源码单店,网上订餐系统 v3.1 单店版

系统以简单实用为主&#xff0c;系统的每一个功能都是实用的&#xff0c;像以很多网站为了好看把页面填的满满的&#xff0c;用户进来不知从何处操作起&#xff0c;我们的系统&#xff0c;一切了为了用户&#xff0c;为了网站经营者。我们所做的不仅仅是一个店铺展示系统&#…

python爬酷狗音乐_良心推荐!一个Python高手必读的库,真香!

菜鸟进阶高手&#xff0c;需要内外的修炼&#xff0c;外练招式&#xff0c;内修心法。招式有很多比如基本的函数&#xff0c;类&#xff0c;文件&#xff0c;模块&#xff0c;到并发&#xff0c;数据库的使用&#xff0c;再到一些框架的使用无论是爬虫的西瓜皮框架&#xff0c;…

web容器(02):tomcat配置监控

1、tomcat的目录结构 tomcat一般给Java应用的&#xff0c;apache一般给php应用的 bin文件夹(启动文件)&#xff1a; 配置监听之类的内容是在catalina.sh中加 conf文件夹(配置文件)&#xff1a; 2、server.xml配置文件说明 <Server port"8005" shutdown"SHUTD…

一般一个前端项目完成需要多久_制作分销小程序最快要多久

小猪V5分销小程序小编了解到&#xff0c;微商城及微分销搭建成为当下热门话题&#xff0c;下面从多个方面来谈谈快速制作电商小程序最快要多久。微信为小程序开放了超过60多个入口&#xff0c;比如有微信群聊入口、微信聊天主界面下拉、App分享信息卡片、发现栏小程序主入口、发…

那些有趣的电子漫画合集

素材来源&#xff1a;芯片之家同事调电路连续通宵两个晚上&#xff0c;结果。。。坐着我的芯片靠椅&#xff0c;剪个帅帅的光头。更多电子漫画合集&#xff1a;转自&#xff1a;长按识别图中二维码关注—————END—————扫码或长按关注回复「加群」进入技术群聊

vim nerdtree 标签_7款vim插件

作者&#xff1a;QvQ链接&#xff1a;https://zhuanlan.zhihu.com/p/145793963来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09…

单片机怎么学?

—————END—————扫码或长按关注回复「 加群 」进入技术群聊

tableau linux无网络安装_四十二、Linux网络管理,软件安装,进程管理总结

「Author&#xff1a; Runsen」1、⽹络管理1.1 网络状态查看在Linux中经常使用ifconfig&#xff0c;route和netstat查看网络状态&#xff0c;它们就是. net-tools工具&#xff0c;下面我来使用下。我就说下ifconfig和route在我们的linux中有很多网卡接口&#xff0c;比如eth0第…

C语言,环形队列

什么是环形队列&#xff1f;环形缓冲区是一个非常典型的数据结构&#xff0c;这种数据结构符合生产者&#xff0c;消费者模型&#xff0c;可以理解它是一个水坑&#xff0c;生产者不断的往里面灌水&#xff0c;消费者就不断的从里面取出水。那就可能会有人问&#xff0c;既然需…

音频几个重要的参数

音频的采样率是什么&#xff1f;如果把音频当成一条曲线&#xff0c;那么采样率就是一秒钟从这个曲线里面提取样本的次数。8,000 Hz - 电话所用采样率, 对于人的说话已经足够11,025 Hz - AM调幅广播所用采样率22,050 Hz和24,000 Hz - FM调频广播所用采样率32,000 Hz - miniDV 数…

ps绿化工具_绿化消防车价位

绿化消防车价位绿化消防车价位 4吨东风消防洒水车&#xff0c;又称为多功能消防车&#xff0c;它是在东风原装二类底盘基础上加消防泵、消防炮、洒水炮及洒水车的前冲后洒、侧喷及水罐体组成&#xff0c;既能参加救火灭火功能&#xff0c;水炮的有效射程≥45米&#xff0c;每秒…