相机无法使用Mobile Vision API打开

时间:2016-10-21 07:48:20

标签: java android android-camera

我正在尝试开发一个简单的QR扫描仪应用程序。我已经按照教程here进行了操作,但它似乎无法正常工作。

以下是我的 build.gradle(应用级别)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "qrcode.auro.com.qrreaderexample"
        minSdkVersion 16
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.google.android.gms:play-services-vision:9.6.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])

    testCompile 'junit:junit:4.12'
}

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="qrcode.auro.com.qrreaderexample">

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-feature
        android:name="android.hardware.camera2"
        android:required="true"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="qrcode.auro.com.qrreaderexample.MainActivity">

    <TextView
        android:id="@+id/barcode_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentTop="true"
        android:text="READING BARCODE...."/>


    <SurfaceView
        android:id="@+id/surface_view"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerInParent="true"/>


    <Button
        android:id="@+id/scanner_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SCAN"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

MainActivity.java

package qrcode.auro.com.qrreaderexample;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Camera;
import android.support.v4.app.ActivityCompat;
import android.support.v4.util.SparseArrayCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.SparseArray;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.android.gms.vision.CameraSource;
import com.google.android.gms.vision.Detector;
import com.google.android.gms.vision.barcode.Barcode;
import com.google.android.gms.vision.barcode.BarcodeDetector;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private SurfaceView surfaceView;
    private Button button;
    private TextView barcodeText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        surfaceView = (SurfaceView) findViewById(R.id.surface_view);
        button = (Button) findViewById(R.id.scanner_button);
        barcodeText = (TextView) findViewById(R.id.barcode_text);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                createCameraSource();
            }
        });


    }

    private void createCameraSource() {

        BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this).build();
        final CameraSource cameraSource = new CameraSource.Builder(this, barcodeDetector)
                .setAutoFocusEnabled(true)
                .setRequestedPreviewSize(500, 500)
                .build();

        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return;
                }
                try {
                    cameraSource.start(surfaceView.getHolder());

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                cameraSource.stop();
            }
        });

        barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
            @Override
            public void release() {

            }

            @Override
            public void receiveDetections(Detector.Detections<Barcode> detections) {

                final SparseArray<Barcode> barcodes = detections.getDetectedItems();
                if (barcodes.size() > 0) {

                    barcodeText.setText(barcodes.valueAt(0).displayValue);

                } else
                    barcodeText.setText("NO BARCODES FOUND!!!!");

            }
        });

    }
}

我在这里有一个按钮(R.id.scanner_button)应该打开相机并开始阅读代码,但它没有。

每次点击按钮,我都会在 logcat 中获得以下内容:

10-21 13:16:55.370 25722-25722/qrcode.auro.com.qrreaderexample W/DynamiteModule: Local module descriptor class for com.google.android.gms.vision.dynamite not found.
10-21 13:16:55.373 25722-25722/qrcode.auro.com.qrreaderexample I/DynamiteModule: Considering local module com.google.android.gms.vision.dynamite:0 and remote module com.google.android.gms.vision.dynamite:8
10-21 13:16:55.374 25722-25722/qrcode.auro.com.qrreaderexample I/DynamiteModule: Selected remote version of com.google.android.gms.vision.dynamite, version >= 8

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

Google Play服务似乎存在相同的错误。例如,Firebase的类似错误 - link。您在logcat输出中看到的日志具有警告级别,而不是错误。

关于您的代码 - surfaceCreated()未调用,您应该正确初始化SurfaceViewHolder,例如创建MySurfaceView extends SurfaceView,像this一样。

此外,您可以查看包含使用BarcodeDetector课程的条形码阅读器的官方Google example。在该示例中,LogCat也有警告消息,如您的示例所示,但条形码阅读器现在正常工作。