基於angular6,使用第三方js調用手機相機、相冊應用遇到的坑

最近做的項目使用的是angular6開發的,做的是前後端分離的,本來自己是做後端的,卻被拉來搞前端了,並且之前也沒用過angular,可想在開發過程中肯定會遇到一個又一個的坑,沒辦法,遇到一個解決一個。

其中調用手機相冊和相機就是其中一個了,並且用的還是第三方合作單位的js,廢話不多說,直接講解遇到的問題;

一,首先就是angular工程如何引入外部JS文件

這個問題其實網上有一大堆的解決方法,主要就是把文件放在assert目錄下,angular.json中增加配置,這裏就不詳細說了;

二,調用外部js提供的方法,回調函數內無法獲取到該類中的變量

在選擇好照片或者拍完照片後,回調函數內會返回picture對象,裏面有一個值是base64編碼的pic屬性和文件名fileName屬性,所以我需要在回調中將base64編碼傳給img標籤,然而在傳遞的過程我發現,img綁定的值一直都是空,檢查了幾次base64值也傳給ts中的變量了,然而打印出來的話,這個值就是空,諮詢了別人之後,才知道是回調方法的原因,回調方法內的this.變量可能不是ts中的,方法會認爲是回調中的變量,所以最後在方法體的後邊增加了bind方法,來獲取類中的變量,代碼如下:

iPortal.getCamera().takePicture(function (picture) {
        // 調用拍照功能       
          this.pictures.push(picture.pic);
        // 將圖片對象放入另一個數組  上傳圖片使用
        this.pictBase64.push(picture);
        // 及時更新圖片數組,選擇後顯示在頁面
        this.zone.run(() => {
          setTimeout(() => this.pictures = this.pictures, this.pictBase64 = this.pictBase64, 10);
          // setTimeout(() => this.pictBase64 = this.pictBase64, 10);
        });
      }.bind(this),
        function (err) {
          this.toastTip(err);
        }.bind(this),
        1);

三、ios可以顯示base64編碼圖片,安卓卻無法顯示

回調中可以給綁定變量賦值後,卻發現蘋果手機能顯示圖拍,但是安卓卻沒法顯示,研究了很久,依然沒發現問題所在,最後只能打印一下兩種手機的顯示的base64編碼,看看有什麼區別,果然,蘋果手機顯示的編碼是很緊湊的,沒有空格,然而安卓的呢:

 

有換行或者是空格,所以只能把編碼內的這些給搞掉了,並且還得區分一下當前設備的類型,是蘋果?還是安卓

iPortal.getCamera().takePicture(function (picture) {
        // 調用拍照功能
        let u = navigator.userAgent;
        // 當前設備信息
        let device = '';
        if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {
          // 安卓手機
          device = 'Android';
          let codeArr = picture.pic;
          // 圖片不超過9張的情況下放入數組
          this.pictures.push(codeArr.replace(/\s*/g, ''));

        } else if (u.indexOf('iPhone') > -1) {
          // 蘋果手機
          device = 'iPhone';
          // 圖片不超過9張的情況下放入數組
          this.pictures.push(picture.pic);
        }
        // 將圖片對象放入另一個數組  上傳圖片使用
        this.pictBase64.push(picture);
        // 及時更新圖片數組,選擇後顯示在頁面
        this.zone.run(() => {
          setTimeout(() => this.pictures = this.pictures, this.pictBase64 = this.pictBase64, 10);
          // setTimeout(() => this.pictBase64 = this.pictBase64, 10);
        });
      }.bind(this),
        function (err) {
          this.toastTip(err);
        }.bind(this),
        1);

codeArr.replace(/\s*/g, '')就是要刪除編碼中的空格和換行;

四,數據更新強加載

照片選擇後,img標籤沒法立即顯示圖片,需要點擊一下其他空白地方,圖片纔出來,代碼中的這一段,就是解決這個問題的:

this.zone.run(() => {
          setTimeout(() => this.pictures = this.pictures, this.pictBase64 = this.pictBase64, 10);
          // setTimeout(() => this.pictBase64 = this.pictBase64, 10);
        });

給一個延時加載,及時更新變量內數據就解決了;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章