cordova二維碼掃碼插件

image.png

插件原地址如下:
barcode-scanner-plugin

BarcodeScanner

  • src
    • android
      • com
      • LibraryProject
      • com.google.zxing.client.android.capture.jar
      • readme.md
        ...

主要目錄如上缤言。
集成說明。
當添加插件后吓揪,會將com.google.zxing.client.android.capture.jar文件拷貝到安卓項目的libs下至耻,作為jar包使用若皱。是zxing的打包镊叁,原文件就在LibraryProject中。

當你不進過修改直接使用該插件時走触,其掃碼界面非常簡陋晦譬。我們如何自定義掃碼界面?

  • 修改原文件互广,在LibraryProject目錄中敛腌。

有兩個難點,一是如何修改惫皱,二是如何打包成jar像樊。

打包jar

我們先看怎么打包。
該目錄下旅敷,我們看到ant.properties這個文件和config.xml文件生棍。
如果你熟悉安卓開發(fā)就知道ant這個工具是做什么的,我猜測可能是打包工具扫皱,于是搜索了下ant足绅,果然是我想的那樣。


如何使用ant韩脑?

  1. 下載ant的安裝包氢妈,這里是地址,下完后解壓縮段多。
  2. 配置環(huán)境變量(目的是使用ant命令)首量,如何添加環(huán)境變量不多說,每個人的shell配置文件不同
vi ~/.zshrc
# ==> 添加下列代碼(注意修改自己的路徑)
# ant
export ANT_HOME=/Users/mrchen/Applications/apache-ant
export PATH=$PATH:$ANT_HOME/bin
  1. 打開新terminal窗口进苍,ant -version加缘,查看是否配置正確。

進入LibraryProject目錄下觉啊,使用ant命令打包jar文件拣宏。

cd LibraryProject
ant ij-release

生成的jar文件在:LibraryProject/bin/classes.jar
將該文件重命名并覆蓋com.google.zxing.client.android.capture.jar文件即可。

接下來將涉及源碼的修改杠人,當你知道怎么打包jar勋乾,源碼修改就好辦了。

圖片變形的問題

源碼修改主要是界面圖像和掃描界面嗡善。文件集中在src/com/google/zxing/client/android中辑莫,其他文件都是核心文件,如果了解zxing項目就會知道罩引,這個插件作者整理了下各吨,將核心和安卓代碼整合起來了。

主要做的改變是兩個袁铐。

  1. 固定為豎屏
  2. 修改camera的分辨率

文件:CameraConfigurationManager.java
initFromCameraParameters() => 這個方法主要是初始化camera的參數

第一步: 修改始終為豎屏(默認是橫屏)揭蜒,將下面的代碼插入到
cameraResolution = findBestPreviewSizeValue(parameters, screenResolution);
之前横浑,并將這一行改為
cameraResolution = findBestPreviewSizeValue(parameters, screenResolutionForCamera);

Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
// preview size is always something like 480*320, other 320*480
if (screenResolution.x < screenResolution.y) {
  screenResolutionForCamera.x = screenResolution.y;
  screenResolutionForCamera.y = screenResolution.x;
}

第二步: 修改camera默認參數
在方法findBestPreviewSizeValue中,會根據屏幕分辨率和攝像頭默認參數(比如支持的拍攝分辨率)屉更,進行計算得到合適的camera分辨率伪嫁。

修改 MAX_PREVIEW_PIXELS 參數的默認值,該值是指定拍攝的分辨率偶垮,默認的720p张咳。
private static final int MAX_PREVIEW_PIXELS = 1920 * 1080; // 最大支持1080p的圖片

這里只需要在initFromCameraParameters 和 findBestPreviewSizeValue方法中修改即可。

掃碼框尺寸和位置修改

代碼位置
CameraManager.java
方法:Rect getFramingRect() => 獲取掃碼框尺寸位置參數, return rect(left, top, left, bottom);

這里非常簡單似舵,看下源碼就懂了

修改掃碼框邊框和掃描線條

代碼位置
ViewfinderView.java
void onDraw() => 使用的是canvas畫的掃描框和激光線條脚猾。示例代碼如下:

@Override
public void onDraw(Canvas canvas) {
    if (cameraManager == null) {
      return; // not ready yet, early draw before done configuring
    }
    Rect frame = cameraManager.getFramingRect();
    if (frame == null) {
      return;
    }
    int width = canvas.getWidth();
    int height = canvas.getHeight();

    // Draw the exterior (i.e. outside the framing rect) darkened
    paint.setColor(resultBitmap != null ? resultColor : maskColor);
    canvas.drawRect(0, 0, width, frame.top, paint);
    canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
    canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
    canvas.drawRect(0, frame.bottom + 1, width, height, paint);

    // change.cf
    paint.setColor(frameAngleColor);

    canvas.drawRect(frame.left, frame.top, frame.left + 60, frame.top + 20, paint);
    canvas.drawRect(frame.left, frame.top, frame.left + 20, frame.top + 60, paint);

    canvas.drawRect(frame.right - 60, frame.top, frame.right, frame.top + 20, paint);
    canvas.drawRect(frame.right - 20, frame.top, frame.right, frame.top + 60, paint);

    canvas.drawRect(frame.left, frame.bottom - 60, frame.left + 20, frame.bottom, paint);
    canvas.drawRect(frame.left, frame.bottom - 20, frame.left + 60, frame.bottom, paint);

    canvas.drawRect(frame.right - 20, frame.bottom - 60, frame.right, frame.bottom, paint);
    canvas.drawRect(frame.right - 60, frame.bottom - 20, frame.right, frame.bottom, paint);

    Log.i("ViewfinderView", "**** draw rect angle ****");

    // change.end

    if (resultBitmap != null) {
      // Draw the opaque result bitmap over the scanning rectangle
      paint.setAlpha(CURRENT_POINT_OPACITY);
      canvas.drawBitmap(resultBitmap, null, frame, paint);

    } else {

      // Draw a red "laser scanner" line through the middle to show decoding is active
      paint.setColor(laserColor);
      paint.setAlpha(SCANNER_ALPHA[scannerAlpha]);
      scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;
      // int middle = frame.height() / 2 + frame.top;
      // canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);

      canvas.drawRect(frame.left + 2, frame.top + laserPosition - 4, frame.right + 2, frame.top + laserPosition + 4, paint);

      laserPosition += laserSpeed;
      if (laserPosition > frame.height()) {
        laserSpeed = -20;
        laserPosition = frame.height();
      }

      if (laserPosition < 0) {
        laserSpeed = 20;
        laserPosition = 0;
      }

      /*Rect previewFrame = cameraManager.getFramingRectInPreview();
      float scaleX = frame.width() / (float) previewFrame.width();
      float scaleY = frame.height() / (float) previewFrame.height();

      List<ResultPoint> currentPossible = possibleResultPoints;
      List<ResultPoint> currentLast = lastPossibleResultPoints;
      int frameLeft = frame.left;
      int frameTop = frame.top;
      if (currentPossible.isEmpty()) {
        lastPossibleResultPoints = null;
      } else {
        possibleResultPoints = new ArrayList<ResultPoint>(5);
        lastPossibleResultPoints = currentPossible;
        paint.setAlpha(CURRENT_POINT_OPACITY);
        paint.setColor(resultPointColor);
        synchronized (currentPossible) {
          for (ResultPoint point : currentPossible) {
            canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX),
              frameTop + (int) (point.getY() * scaleY),
              POINT_SIZE, paint);
          }
        }
      }
      if (currentLast != null) {
        paint.setAlpha(CURRENT_POINT_OPACITY / 2);
        paint.setColor(resultPointColor);
        synchronized (currentLast) {
          float radius = POINT_SIZE / 2.0f;
          for (ResultPoint point : currentLast) {
            canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX),
              frameTop + (int) (point.getY() * scaleY),
              radius, paint);
          }
        }
      }*/

      // Request another update at the animation interval, but only repaint the laser line,
      // not the entire viewfinder mask.
      postInvalidateDelayed(ANIMATION_DELAY,
        frame.left - POINT_SIZE,
        frame.top - POINT_SIZE,
        frame.right + POINT_SIZE,
        frame.bottom + POINT_SIZE);
    }
}

很簡單,可以自己隨便發(fā)揮畫砚哗。注意上面代碼我增加了幾個變量龙助。

private int laserPosition = 0;
private int laserSpeed = 20;
private int frameAngleColor = resources.getColor(fakeR.getId("color", "frame_angle"));

并且在res文件夾下的colors.xml中新增一條。

    <color name="frame_angle">#feee00</color>

說明

修改后的源代碼地址 =>
百度云

使用方法蛛芥,解壓縮后提鸟,添加到cordova插件中

cordova plugin add <your_barcode_scanner_path>

$(function() {
  $('.scan-btn').click(function() {

   cordova.plugins.barcodeScanner.scan(
    function (result) {
      alert("We got a barcode\n" +
        "Result: " + result.text + "\n" +
        "Format: " + result.format + "\n" +
        "Cancelled: " + result.cancelled);
    },
    function (error) {
      alert("Scanning failed: " + error);
    },
    {
      preferFrontCamera : false, // iOS and Android
      showFlipCameraButton : false, // iOS and Android
      showTorchButton : false, // iOS and Android
      torchOn: false, // Android, launch with the torch switched on (if available)
      prompt : "Place a barcode inside the scan area", // Android
      resultDisplayDuration: 0, // Android, display scanned text for X ms. 0 suppresses it entirely, default 1500
      formats : "QR_CODE,PDF_417", // default: all but PDF_417 and RSS_EXPANDED
      orientation : "portrait", // Android only (portrait|landscape), default unset so it rotates with the device
      disableAnimations : true, // iOS
      disableSuccessBeep: false // iOS
    }
    );
 });
});

示例項目地址 =>
coding.cordova_test
項目比較小,測試用仅淑,不是很完整称勋,ignore文件什么都沒有配,所以插件所有文件都上傳上去了的涯竟。

示例apk下載 =>
cordova_test.apk
可以試試哦??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赡鲜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庐船,更是在濱河造成了極大的恐慌银酬,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筐钟,死亡現(xiàn)場離奇詭異揩瞪,居然都是意外死亡,警方通過查閱死者的電腦和手機篓冲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門李破,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纹因,你說我怎么就攤上這事喷屋×詹Γ” “怎么了瞭恰?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狱庇。 經常有香客問我惊畏,道長恶耽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任颜启,我火速辦了婚禮偷俭,結果婚禮上,老公的妹妹穿的比我還像新娘缰盏。我一直安慰自己涌萤,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布口猜。 她就那樣靜靜地躺著负溪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪济炎。 梳的紋絲不亂的頭發(fā)上川抡,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音须尚,去河邊找鬼崖堤。 笑死,一個胖子當著我的面吹牛耐床,可吹牛的內容都是我干的密幔。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼撩轰,長吁一口氣:“原來是場噩夢啊……” “哼老玛!你這毒婦竟也來了?” 一聲冷哼從身側響起钧敞,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蜡豹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后溉苛,有當地人在樹林里發(fā)現(xiàn)了一具尸體镜廉,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年愚战,在試婚紗的時候發(fā)現(xiàn)自己被綠了娇唯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡寂玲,死狀恐怖塔插,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情拓哟,我是刑警寧澤想许,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響流纹,放射性物質發(fā)生泄漏糜烹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一漱凝、第九天 我趴在偏房一處隱蔽的房頂上張望疮蹦。 院中可真熱鬧,春花似錦茸炒、人聲如沸愕乎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妆毕。三九已至,卻和暖如春贮尖,著一層夾襖步出監(jiān)牢的瞬間笛粘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工湿硝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薪前,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓关斜,卻偏偏與公主長得像示括,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子痢畜,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,843評論 25 707
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,778評論 6 342
  • 2017年1月18日 今天回劇組去看了一眼丁稀,然后布布說我昨天下午沒在他都覺得工作不順了吼拥。哈哈哈哈,看來我也是不可或...
    一字記之曰沉閱讀 145評論 0 0
  • 你給予我 是城墻給予城門 是深海給予孤島 是暗夜給予繁星 是天地給予巨像 是草木給予詩歌 是眾神給予朝圣 新雨給予...
    戒涼閱讀 447評論 2 5
  • 第一輪評課上完了,感謝大家的厚愛授账,有背后曹老師和孩子們的支持枯跑,有現(xiàn)場評課老師給出的寶貴建議,方感要細細研磨白热,...
    如水的日記閱讀 172評論 0 0