1. 程式人生 > >ionic拍照,從相簿選擇功能

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,來確認呼叫結果成果或者失敗。

三、使用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也是在初步的學習當中,如果有好的實現方法,歡迎交流討論~

相關推薦

ionic拍照相簿選擇功能

在介紹外掛的使用之前,我們有必要先大致瞭解下外掛的原理 一、外掛工作原理分析 一個外掛是如何正確地在IONIC框架下執行的呢? 前臺的HTML/js程式碼又是如何與後面具體平臺做資料互動的呢? 這個就需要對外掛的工作原理及各個模組之間的流程關係有一個基本的瞭解。 為了讓外掛能夠訪問具體平臺系統的程式碼,Cor

ionic3 實現拍照相簿選擇功能

參考了很多網上的資料,但是每個人遇到的問題都不一樣,我這裡出現的問題,可能是node版本,還有外掛版本之類的問題,問題以及解決方式可以看這個圖。 一、外掛依賴引入  (1)配置相機 在控制行輸入命令: ionic cordova plugin add cordova-

拍照上傳相簿選擇上傳

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link href="css/mui.mi

Android呼叫系統相機拍照相簿選擇照片呼叫系統攝像機錄影

最近在Android Studio上折騰程式碼,昨天編譯器又很不給面子的報錯了: Error type 3 Error: Activity class {com.example.myapplication/com.example.myapplication

Android 二維碼生成掃描近距離識別優化相簿選擇二維碼識別

做了一個二維碼掃描圖片,主要是掃描不出來,看到一篇部落格,其中的第二種方法可以掃描到,在此做筆記,以備後用,前面的進入相簿,返回,到獲取圖片路徑方法都一樣; (1):二維碼生成的方法順便貼上: private Bitmap createQRImage(String url, final

呼叫Android系統攝像頭進行拍照以及相簿選擇圖片

很多時候我們需要呼叫系統攝像頭進行拍照或者從相簿選擇照片,然後對得到的圖片進行一些處理。比如微信設定頭像,就可以選擇呼叫裝置存在攝像頭APP進行拍照,然後對影象進行裁剪,最終設定為頭像。 下面來進行講解。 主要分為以下幾個部分: 1、獲得攝像頭Feature和寫檔案的許

呼叫Android系統自帶相機拍照相簿中獲取圖片(相容7.0系統)

一,前言: 在日常的手機應用開發過程中,經常會遇到上傳圖片的需求,像上傳頭像之類的,這就需要呼叫系統的相機,相簿獲取照片。但是在Android 系統7.0之後認為這種操作是不安全的,這篇文章主要就是記錄7.0獲取照片遇到的問題。 二,FileProvider介紹 都

呼叫系統相機拍照相簿選取圖片上傳

前不久在專案中再次遇到了這個問題,就是從系統相簿中選取圖片,呼叫系統的相機拍照並上傳的問題。由於之前比較懶沒能在做完之後對寫的程式碼進行整理儲存,以至於再次遇到的時候還是重新去研究了一下造成了開發過程中的時間浪費。 注意的點:1.呼叫系統的相機拍攝並取得原圖,並對角度進行處

android相簿選擇圖片和拍照選擇圖片

在android開發中選擇圖片的方式大致可以分類兩種,一種是從手機相簿獲取,另外一種則是通過呼叫手機拍照獲得 手機相簿中獲取,這種方式需要讀取儲存卡的許可權 <uses-permission android:name="android.permission.REA

Android實現相簿選擇或者直接拍照來設定圓形的頭像CircleImageView

本人第一次寫技術部落格,只是為了對自己平時遇到的一些問題進行一個總結,可以讓以後能更好的翻看學習,也可以讓更多的人借鑑。 廢話不多說,正題開始: 首先先說明如何進行從相簿選擇或者直接拍照來設定頭像,然後在進行圓形頭像的設定。具體的介面效果如下所示:            

iOS 修改頭像幾行程式碼實現相簿選擇照片

我的GitHub:點選開啟連結 SelectPhotoManager.h #import <Foundation/Foundation.h> #import <UIKi

Android拍照相簿選取圖片相容7.0

首先配置一下我們的專案(1)在build.gradle裡新增類庫:compile 'com.squareup.picasso:picasso:2.5.2'(2)2.1、在清單檔案裡面新增許可權<uses-permission android:name="android.

呼叫攝像頭和相簿(呼叫攝像頭拍照相簿選擇圖片)

public class MainActivity extends Activity { public static final int TAKE_PHOTO=1; public static final int CROP_PHOTO=0; public static

Android頭像上傳/拍照/相簿選擇Demo(個人資訊模組會用到)

個人資訊中一般都會帶有頭像設定功能,本Demo是從我專案中拿出來的,在做個模組時遇到了許多問題,最後百度一一堅決了,雖不說是最好的,但也能應付基本功能了。 也許新手會遇到一個問題,在其它手機均沒問題,但在小米3手機就是不行,後來發現利用繫結URI傳遞資料可以擷取很大的圖,

WebView中拍照相簿上傳圖片

WebView 上傳圖片, 想必很多人都碰到過這樣的場景. 而且 WebView 在4.4前後的區別非常大, 比如對URL跳轉的格式, 對JS的注入宣告等等, 4.4以後的WebView 已經是chromium核心, 有多強大就無需我贅述. 說這些, 其實也是

Android生成二維碼--拍照相簿選取圖片

private void handleImageOnKitKat(Intent data) { String imagePath = null; Uri uri = data.getData(); if (DocumentsContract.isDocumentUri(this, ur

Android 仿照微信發說說既能實現拍照相簿多圖案上傳 使用Retrofit2.0技術

package com.lidong.photopickersample; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import and

[Android] WebView中拍照相簿上傳圖片

  WebView 上傳圖片, 想必很多人都碰到過這樣的場景. 而且 WebView 在4.4前後的區別非常大, 比如對URL跳轉的格式, 對JS的注入宣告等等, 4.4以後的WebView 已經是chromium核心, 有多強大就無需我贅述. 說這些, 其實也

android 6.0許可權開發---拍照開啟相簿問題

android6.0的許可權機制改得跟ios類似,兩個系統之間互相模仿也是好事,取長補短。在某些許可權需要用到的時候,要先詢問使用者。 國內各大android系統對於許可權的設定機制都不大一樣,但大部分都是一些常用的許可權預設是開啟的,一些是預設關閉了,即使你在Andr

Android開發之呼叫相機拍照與本地相簿選擇圖片

使用者看到的介面如下,也是我的xml介面: demo中有一個按鈕,點選彈出對話方塊提示使用者選擇:拍照、相簿。如下圖: 點選拍照,會開啟手機相機開始拍照,拍攝完後可以裁剪,如下圖: 這時候你可以直接點選確定,也可