利用Python實現Android掃碼功能的技巧

一、QR碼技術簡介

QR碼是Quick Response Code的縮寫,是由日本Denso Wave公司於1994年發明的二維碼。其與一維條形碼不同,能夠存儲更多的信息,如網址、聯繫信息、地理位置、電子名片等。

QR碼的編碼方式有多種,最常見的是版本1~40的7種,每個版本的模塊數不同,能夠存儲的字符數也不同。通常,QR碼的容錯率越高,可存儲的字符數就越少。

二、Python如何生成QR碼

Python生成QR碼可以使用第三方庫qrcode。使用pip安裝即可。

pip install qrcode

然後使用如下代碼即可生成QR碼圖片:


import qrcode

qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)
qr.add_data('https://www.baidu.com')
qr.make(fit=True)

img = qr.make_image(fill_color='black', back_color='white')
img.save('qrcode.png')

這段代碼的功能是生成一個版本為1的QR碼,容錯率為L,每個模塊大小為10個像素,邊框為4個模塊,並儲存網址https://www.baidu.com。最後將QR碼填充黑色,背景白色,儲存為PNG格式的圖片。

三、Python如何解碼QR碼

Python解碼QR碼同樣可以使用qrcode庫。使用如下代碼即可解碼QR碼圖片:


import zbarlight
from PIL import Image

with open('qrcode.png', 'rb') as f:
    img = Image.open(f)
    img.load()

codes = zbarlight.scan_codes('qrcode', img)
if codes is not None:
    print('QR code:', codes[0].decode('utf-8'))

這段代碼的功能是打開之前生成的QR碼圖片,讀取圖片中的信息並解碼,將結果打印輸出。在解碼時,我們使用zbarlight庫,這是一個基於C語言的開源庫,能夠識別多種條形碼和二維碼。

四、將Python和Android結合實現掃碼功能

Python和Android結合使用的方法很多,此處我們使用Python的HTTP服務器來實現。Python開啟一個HTTP服務器,安卓端使用開源庫ZXing來識別二維碼並向Python服務器發送數據,Python服務器處理數據並返回結果給安卓端。

以下是Python開啟HTTP服務器的代碼:


import http.server
import socketserver

class MyHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path.startswith('/qrcode?data='):
            data = self.path.replace('/qrcode?data=', '')
            self.send_response(200)
            self.end_headers()
            self.wfile.write(('QR code: ' + data).encode('utf-8'))
            return

        return http.server.SimpleHTTPRequestHandler.do_GET(self)

PORT = 8000
Handler = MyHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()

這段代碼的功能是開啟一個HTTP服務器,監聽8000端口。如果收到請求路徑為/qrcode?data=的請求,那麼將URL中的數據作為解碼結果返回。這是一個非常簡單的服務器示例,可以根據實際需求進行更改。

接下來,在安卓端集成ZXing庫,處理二維碼,將數據發送給Python服務器。以下是Android端調用ZXing庫的示例代碼:


IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE);
integrator.setCameraId(0);
integrator.setBeepEnabled(false);
integrator.setOrientationLocked(false);
integrator.initiateScan();

這段代碼的功能是在MainActivity中調用ZXing庫的IntentIntegrator類,啟動掃碼界面,然後監聽掃碼結果。

掃碼結果的處理代碼如下:


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if (result != null) {
        final String qrCode = result.getContents();
        if (qrCode != null) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        String url = "http://your-python-server:8000/qrcode?data=" + URLEncoder.encode(qrCode, "UTF-8");
                        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
                        InputStream in = conn.getInputStream();

                        ByteArrayOutputStream out = new ByteArrayOutputStream();
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = in.read(buffer)) != -1) {
                            out.write(buffer, 0, length);
                        }
                        final String response = out.toString("UTF-8");

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this, response, Toast.LENGTH_LONG).show();
                            }
                        });
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

這段代碼的功能是將掃碼結果作為URL的參數,向Python的HTTP服務器發送請求。獲取服務器返回的結果,並在UI線程中顯示toast提示。

五、總結

使用Python實現Android掃碼功能,一個重要的技巧是使用HTTP服務器來傳輸數據。Python的qrcode和zbarlight庫能夠方便地生成和解碼QR碼,大大簡化了二維碼的處理過程。Android端集成ZXing庫並監聽掃碼結果,然後再將掃碼結果發送給Python服務器,最後Python服務器返回結果給Android端。這是一個簡單的掃碼示例,開發者可以根據需求進行更改。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257158.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:44
下一篇 2024-12-15 12:44

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29

發表回復

登錄後才能評論