Как сканировать QRCode в Android

Я нашел руководство по сканированию штрих-кода. Но в моем приложении мне нужно отсканировать QR-код. Как я могу отсканировать QR-код на Android?


person Sunil Kumar Sahoo    schedule 12.01.2012    source источник
comment
Zxing также сканирует QR-код: см. их главную страницу здесь.   -  person Rasman    schedule 12.01.2012
comment
Есть аналогичный вопрос: stackoverflow .com/questions/2489048/ ZXing хорошо работает с QR-кодами.   -  person Davidsun    schedule 12.01.2012
comment
Спасибо за вашу помощь. Я пропустил чтение документа Zxing   -  person Sunil Kumar Sahoo    schedule 12.01.2012
comment
Вы также можете использовать NEO reader.   -  person Ishita Sinha    schedule 23.09.2016
comment
@IshitaSinha Сейчас я использую сканер zbar (zbar.sourceforge.net). Это круто   -  person Sunil Kumar Sahoo    schedule 26.09.2016
comment
См.: stackoverflow.com/questions/16080181 / Я думаю, это поможет вам   -  person Sibaditya Maiti    schedule 27.09.2016


Ответы (7)


try {
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes

    startActivityForResult(intent, 0);
} catch (Exception e) {    
    Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
    Intent marketIntent = new Intent(Intent.ACTION_VIEW,marketUri);
    startActivity(marketIntent);
}

и в onActivityResult():

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0) {
        if (resultCode == RESULT_OK) {
            String contents = data.getStringExtra("SCAN_RESULT");
        }
        if(resultCode == RESULT_CANCELLED){
            //handle cancel
        }
    }
}
person Seshu Vinay    schedule 12.01.2012
comment
мне нужно отсканировать qrcode из моего проекта без установки каких-либо других сканеров. возможно ли это? пожалуйста, дайте свое предложение. - person user1213202; 18.06.2012
comment
@sandhya.M да, есть способ. Вы должны скачать исходный код Zxing. Его открытый исходный код. Создайте файл core.jar и добавьте его как внешний jar. - person Seshu Vinay; 18.06.2012
comment
достаточно только файла core.jar или любых других исходных файлов, которые я также должен добавить - person user1213202; 18.06.2012
comment
Нет, его можно скомпилировать только с core.jar. - person Seshu Vinay; 18.06.2012
comment
Я сделал только это. Но я не могу отсканировать qrcode. - person user1213202; 18.06.2012
comment
Вы сгенерировали core.jar самостоятельно? - person Seshu Vinay; 18.06.2012
comment
нет, я загрузил Zxing-2.0 в эту папку из ядра, я скопировал core.jar и добавил в свой проект путь сборки configre - person user1213202; 18.06.2012
comment
Можете ли вы сказать, как сгенерировать that.plaese.iam, пытаясь это сделать, начиная с двух дней? - person user1213202; 18.06.2012
comment
вот шаги для создания core.jar. code.google.com/p/zxing/wiki/GettingStarted - person Seshu Vinay; 18.06.2012
comment
не могли бы вы объяснить пошаговую процедуру сканирования qrcode из моего приложения - person user1213202; 18.06.2012
comment
Сначала вам нужно установить apache ant - person Seshu Vinay; 18.06.2012
comment
а затем запустите его в основной папке - person Seshu Vinay; 18.06.2012
comment
k. Спасибо, я посмотрю на этот документ и попробую. Если у меня возникнут какие-либо сомнения, я спрошу. Пожалуйста, помогите. - person user1213202; 18.06.2012
comment
давайте продолжим это обсуждение в чате - person Seshu Vinay; 18.06.2012
comment
Код Zxing означает сканирование Intentintentintent=newIntent(com.google.zxing.client.android.SCAN); намерение.putExtra (SCAN_MODE, PRODUCT_MODE); startActivityForResult (намерение, 0); это только - person user1213202; 19.06.2012
comment
Привет, я пробовал с приведенным выше кодом, работает нормально, но реклама идет. Как отключить рекламу в Android? - person Naveen; 10.12.2018

обновление 2016 г.

В настоящее время рекомендуется использовать Android Barcode API, который работает локально (офлайн), без обращения к серверу:

API штрих-кодов обнаруживает штрих-коды в режиме реального времени на устройстве и в любой ориентации. Он также может обнаруживать несколько штрих-кодов одновременно.

Он считывает следующие форматы штрих-кодов:

  • Одномерные штрих-коды: EAN-13, EAN-8, UPC-A, UPC-E, Code-39, Code-93, Code-128, ITF, Codabar
  • 2D штрих-коды: QR-код, матрица данных, PDF-417, AZTEC

Он автоматически анализирует QR-коды, матрицу данных, PDF-417 и значения Aztec для следующих поддерживаемых форматов:

  • URL-адрес
  • Контактная информация (VCARD и т.д.)
  • Календарное событие
  • Электронное письмо
  • Телефон
  • смс
  • ISBN
  • Вай-фай
  • Геолокация (широта и долгота)
  • Водительское удостоверение / удостоверение личности AAMVA

Ознакомьтесь с лабораторией кода — Обнаружение штрих-кода с помощью Mobile Vision API.

person Dan Dascalescu    schedule 10.08.2016

Вы можете легко сканировать QR-код с помощью zxing, добавив следующие зависимости в свой градиент.

compile 'com.journeyapps:zxing-android-embedded:3.1.0@aar'
compile 'com.google.zxing:core:3.2.0'

Тогда в вашем Activity или на Fragment

   IntentIntegrator scanIntegrator = new IntentIntegrator(context);
                scanIntegrator.setPrompt("Scan");
                scanIntegrator.setBeepEnabled(true);
                //The following line if you want QR code
                scanIntegrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE_TYPES);
                scanIntegrator.setCaptureActivity(CaptureActivityAnyOrientation.class);
                scanIntegrator.setOrientationLocked(true);
                scanIntegrator.setBarcodeImageEnabled(true);
                scanIntegrator.initiateScan();

А затем зафиксируйте результат в onActivityResult

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if (scanningResult != null) {
            if (scanningResult.getContents() != null) {
                scanContent = scanningResult.getContents().toString();
                scanFormat = scanningResult.getFormatName().toString();
            }

            Toast.makeText(this,scanContent+"   type:"+scanFormat,Toast.LENGTH_SHORT).show();

        }else{
            Toast.makeText(this,"Nothing scanned",Toast.LENGTH_SHORT).show();
        }
    }

Взгляните на этот пример проекта, надеюсь, он вам поможет.

person Mithun Sarker Shuvro    schedule 29.09.2016
comment
что такое CaptureActivityAnyOrientation? - person roghayeh hosseini; 12.02.2021

Один из способов — использовать интерфейс AppCompatActivity и ZXingScannerView.ResultHandler.

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.hardware.Camera;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;;

import com.android.volley.VolleyError;
import com.example.team.merchant.functional.Request;
import com.example.team.merchant.functional.ResponseListener;
import com.google.zxing.Result;

import me.dm7.barcodescanner.zxing.ZXingScannerView;

/**
 * Created by Prakhar on 5/16/2016.
 */
public class MerchantScannerActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler {
    private ZXingScannerView mScannerView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        RelativeLayout relativeLayout = new RelativeLayout(this);

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(60, 60);
        params.setMargins(0, 50, 50, 0);
        params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);


        Button switchCamera = new Button(this); //declare a button in layout for camera change option
        switchCamera.setLayoutParams(params);
        switchCamera.setBackgroundResource(R.drawable.switch_camera);
        relativeLayout.addView(switchCamera);
        final int i = getFrontCameraId();
        if (i == -1) {
            switchCamera.setVisibility(View.GONE);
        }


        mScannerView = new ZXingScannerView(this);   // Programmatically initialize the scanner view
        relativeLayout.addView(mScannerView);

        setContentView(relativeLayout);
        final int[] id = {0};
        switchCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mScannerView.stopCamera();
                if (id[0] % 2 == 0) {
                    mScannerView.startCamera(i);
                } else {
                    mScannerView.startCamera();
                }
                id[0]++;
            }
        });

        mScannerView.setResultHandler(this);// Register ourselves as a handler for scan results.

        mScannerView.startCamera();         // Start camera


    }

    @SuppressLint("NewApi")
    int getFrontCameraId() {
        if (Build.VERSION.SDK_INT < 22) {
            Camera.CameraInfo ci = new Camera.CameraInfo();
            for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
                Camera.getCameraInfo(i, ci);
                if (ci.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) return i;
            }
        } else {
            try {
                CameraManager cManager = (CameraManager) getApplicationContext()
                        .getSystemService(Context.CAMERA_SERVICE);
                String[] cameraId = cManager.getCameraIdList();
                for (int j = 0; j < cameraId.length; j++) {
                    CameraCharacteristics characteristics = cManager.getCameraCharacteristics(cameraId[j]);
                    int cOrientation = characteristics.get(CameraCharacteristics.LENS_FACING);
                    if (cOrientation == CameraCharacteristics.LENS_FACING_FRONT)
                        return Integer.parseInt(cameraId[j]);
                }
            } catch (CameraAccessException e) {
                e.printStackTrace();
            }
        }
        return -1; // No front-facing camera found
    }

    @Override
    public void onPause() {
        super.onPause();
        mScannerView.stopCamera();           // Stop camera on pause
    }

    @Override
    public void handleResult(Result rawResult) {
       // rawResult.getText()
       // handle your result here
       // handle exceptions here
    }
}

Соответственно, другие могут использоваться фрагментами.

import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.zxing.ResultPoint;
import com.journeyapps.barcodescanner.BarcodeCallback;
import com.journeyapps.barcodescanner.BarcodeResult;
import com.journeyapps.barcodescanner.CompoundBarcodeView;


/**
 * Created by Prakhar on 3/8/2016.
 */
public class PayWithQrCodeScannerFragment extends Fragment {

    private static final int PERMISSION_REQUEST_CAMERA = 23;
    public static CompoundBarcodeView barcodeScannerView;
    public static BarcodeCallback callback;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.paywithqrcodescannerfragment, container, false);

        barcodeScannerView = (CompoundBarcodeView) view.findViewById(R.id.zxing_barcode_scanner);


        callback = new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                    // handle result and exceptions here
            }
        return view;
    }

    /**
     * Check if the device's camera has a Flashlight.
     *
     * @return true if there is Flashlight, otherwise false.
     */
    private boolean hasFlash() {
        return getActivity().getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    }


    @Override
    public void onResume() {
        super.onResume();
        if (android.os.Build.VERSION.SDK_INT < 23) {
            barcodeScannerView.resume();
        }
    }


    @Override
    public void onPause() {
        super.onPause();
        if (android.os.Build.VERSION.SDK_INT < 23) {
            barcodeScannerView.pause();
        }
    }

}

Используйте приведенный ниже XML-файл макета для заполнителя сканера.

<com.journeyapps.barcodescanner.CompoundBarcodeView
            android:id="@+id/zxing_barcode_scanner"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:zxing_preview_scaling_strategy="centerCrop"
            app:zxing_use_texture_view="false" />

Build.gradle

compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'
person Prakhar1001    schedule 28.09.2016

Я использую barcodescanner. Я использую zxing для сканирования штрих-кодов и QR-кодов. Версия 1.9 библиотеки использует zxing v3.2.1. Это оболочка для zxing, поэтому использование проще.

Для этого:

  1. Добавить зависимость в градле

    compile 'me.dm7.barcodescanner:zxing:1.9'
    
  2. Добавить разрешение камеры в манифест

    <uses-permission android:name="android.permission.CAMERA"/>
    
  3. Создайте активность, которая будет обрабатывать сканирование

    Манифест:

    <activity
        android:name=".view.component.ScannerActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/AppThemeTransparent"/>
    

    styles.xml:

    <style name="AppThemeTransparent" parent="@style/Theme.AppCompat.Light">
        <item name="windowNoTitle">true</item>
        <item name="windowActionBar">false</item>
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
    

    Создать действие сканера:

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.WindowManager;
    
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.Result;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    
    import me.dm7.barcodescanner.zxing.ZXingScannerView;
    
    public class ScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
    
        public static final String EXCLUDED_FORMAT = "ExcludedFormat";
        private static final String TAG = ScannerActivity.class.getSimpleName();
        private ZXingScannerView mScannerView;
    
        @Override
        public void onCreate(Bundle state) {
            setStatusBarTranslucent(true);
            super.onCreate(state);
            mScannerView = new ZXingScannerView(this);
            setContentView(mScannerView);
        }
    
        protected void setStatusBarTranslucent(boolean makeTranslucent) {
            if (makeTranslucent) {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            } else {
                getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }
    
        @Override
        public void onResume() {
            super.onResume();
            mScannerView.setResultHandler(this);
            mScannerView.startCamera();
        }
    
        @Override
        public void onPause() {
            super.onPause();
            mScannerView.stopCamera();
        }
    
        @Override
        public void handleResult(Result rawResult) {
            String result = rawResult.getText();
            BarcodeFormat format = rawResult.getBarcodeFormat();
    
            Log.v(TAG, "Scanned code: " + rawResult.getText());
            Log.v(TAG, "Scanend code type: " + rawResult.getBarcodeFormat().toString());
    
            //Return error
            if (result == null) {
                setResult(RESULT_CANCELED, returnErrorCode(result, format));
                finish();
            }
    
            if (result.isEmpty()) {
                setResult(RESULT_CANCELED, returnErrorCode(result, format));
                finish();
            }
    
            //Return correct code
            setResult(RESULT_OK, returnCorrectCode(result, format));
            finish();
        }
    
        private Intent returnErrorCode(String result, BarcodeFormat format) {
            Intent returnIntent = new Intent();
            returnIntent.putExtra(ScannerConstants.ERROR_INFO, getResources().getString(R.string.scanner_error_message));
            return returnIntent;
        }
    
        private Intent returnCorrectCode(String result, BarcodeFormat format) {
            Intent returnIntent = new Intent();
            returnIntent.putExtra(ScannerConstants.SCAN_RESULT, result);
    
            if (format.equals(BarcodeFormat.QR_CODE)) {
                returnIntent.putExtra(ScannerConstants.SCAN_RESULT_TYPE, ScannerConstants.QR_SCAN);
            } else {
                returnIntent.putExtra(ScannerConstants.SCAN_RESULT_TYPE, ScannerConstants.BAR_SCAN);
            }
    
            return returnIntent;
        }
    
        public void excludeFormats(BarcodeFormat item) {
            Collection<BarcodeFormat> defaultFormats = mScannerView.getFormats();
            List<BarcodeFormat> formats = new ArrayList<>();
            for (BarcodeFormat format : defaultFormats) {
                if (!format.equals(item)) {
                    formats.add(format);
                }
            }
            mScannerView.setFormats(formats);
        }
    
        public interface ScannerConstants {
            public static final String SCAN_MODES = "SCAN_MODES";
            public static final String SCAN_RESULT = "SCAN_RESULT";
            public static final String SCAN_RESULT_TYPE = "SCAN_RESULT_TYPE";
            public static final String ERROR_INFO = "ERROR_INFO";
            public static final int BAR_SCAN = 0;
            public static final int QR_SCAN = 1;
        }
    }
    

    Просто убедитесь, что на устройствах с API 23+ приложению предоставлено разрешение на использование камеры.

    Откройте Activity, как обычно, с ожиданием результата:

    Intent intent = new Intent(AddEquipmentActivity.this, ScannerActivity.class);
    startActivityForResult(intent, SCAN_SERIAL_REQUEST);
    
person R. Zagórski    schedule 23.09.2016

Вот function, который сканирует QR-код.

public void scanQR(View v)
{
    try
    {
        Intent intent = new Intent(ACTION_SCAN);
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, 0);
    }
    catch (ActivityNotFoundException anfe)
    {
        showDialog(ActivityUserDetails.this, "No Scanner Found",
                "Download a scanner code activity?", "Yes", "No").show();
    }
}

В приведенном выше фрагменте кода я вызвал метод showDialog() из блока catch, который покажет AlertDialog для запроса на установку приложения «Сканер штрих-кода» из Google Play. Ниже приведен код для метода showDialog.

private static AlertDialog showDialog(final Activity act,
                                      CharSequence title, CharSequence message, CharSequence buttonYes,
                                      CharSequence buttonNo)
{
    AlertDialog.Builder downloadDialog = new AlertDialog.Builder(act);
    downloadDialog.setTitle(title);
    downloadDialog.setMessage(message);
    downloadDialog.setPositiveButton(buttonYes,
            new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialogInterface, int i)
                {
                    Uri uri = Uri.parse("market://search?q=pname:"
                            + "com.google.zxing.client.android");
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    try
                    {
                        act.startActivity(intent);
                    }
                    catch (ActivityNotFoundException anfe)
                    {

                    }
                }
            });
            downloadDialog.setNegativeButton(buttonNo,
            new DialogInterface.OnClickListener()
            {
                public void onClick(DialogInterface dialogInterface, int i)
                {
                }
            });
            return downloadDialog.show();
}

Я использовал эту функцию в событии клика Button. Поэтому код для Button приведен ниже (файл xml).

                    <Button
                    android:id="@+id/button_wr_scan"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:background="@drawable/button_shadow"
                    android:onClick="scanQR"
                    android:paddingRight="4dp"
                    android:paddingTop="4dp"
                    android:text="ScanQR" />

ПРИМЕЧАНИЕ. Условием использования этой функции является то, что на вашем устройстве должно быть предварительно установлено приложение «Сканер штрих-кода».

Надеюсь, поможет.

Спасибо :)

person Swanand    schedule 27.09.2016

Пошаговая инструкция по настройке zxing 3.2.1 в eclipse

  1. Загрузите zxing-master.zip с "https://github.com/zxing/zxing"
  2. Разархивируйте zxing-master.zip, используйте eclipse для импорта проекта «android» в zxing-master.
  3. Загрузите core-3.2.1.jar со страницы "http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/"
  4. Создайте папку «libs» в проекте «android» и вставьте cor-3.2.1.jar в папку libs.
  5. Нажмите на проект: выберите «Свойства» -> «Компилятор Java», чтобы изменить уровень на 1.7. Затем нажмите «Android», измените «Цель сборки проекта» на Android 4.4.2+, поскольку для использования 1.7 требуется компиляция с Android 4.4.
  6. Если «CameraConfigurationUtils.java» не существует в «zxing-master/android/app/src/main/java/com/google/zxing/client/android/camera/». Вы можете скопировать его из "zxing-master/android-core/src/main/java/com/google/zxing/client/android/camera/" и вставить в свой проект.
  7. Очистить и построить проект. Если ваш проект показывает ошибку о «переключателе — регистре», вы должны изменить их на «если — иначе».
  8. Завершенный. Очистить и собрать проект >
person Anh Duy    schedule 05.11.2015