質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.72%

Android Studio で Multiple dex files define の解決方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,622

haseg

score 5

 Android Studio で Multiple dex files define の解決方法

Android にて QR-Code Decodeのアプリを作成しています。
github ZXing ("Zebra Crossing") barcode scanning library for Java, Android の組み込みを行うと以下のエラーメッセージが表示されます。

組み込み方法は、インターネットを参考に直接 com 以下に展開、build.gradle に必要な情報を記載しました。

本エラーコードの解決方法と、実際に重複を起こしているファイルの所在を教えて下さい。
DexMerger.java など

 発生している問題・エラーメッセージ

Information:Gradle tasks [:app:assembleDebug]
Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;
Error:com.android.dex.DexException: Multiple dex files define Lcom/google/zxing/BarcodeFormat;
Error:    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
Error:    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
Error:    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
Error:    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Error:    at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)

Error:    at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
Error:    at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)

Error:    at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
Error:    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
Error:    at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
Error:    at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
Error:    at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error:Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.

 組み込み方法

build.gradle に以下の 1行追加

dependencies {
    compile 'com.google.zxing:core:3.2.1'
}

 

 該当のソースコード

package com.xxx.camera;

import java.io.IOException;
import java.util.List;

import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.CameraInfo;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.Size;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Reader;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

public class SurfaceViewCallback implements SurfaceHolder.Callback {

    private Camera mCamera = null;
    private RelativeLayout mRelativeLayout;
    private SurfaceView mSurfaceView;
    private TextView mTextView;
    private Activity mActivity;

    public SurfaceViewCallback(Activity activity, SurfaceView surfaceView) {
        super();
        mActivity = activity;
        mSurfaceView = surfaceView;
        mCamera = Camera.open();
    }

    public void destroy() {
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (mCamera != null) {
            mCamera.stopPreview();
            mCamera.release();
            mCamera = null;
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mTextView = (TextView) (mActivity.findViewById(R.id.result_textview));
        mRelativeLayout = (RelativeLayout) (mActivity.findViewById(R.id.relative_layout));

        try {
            mCamera.setPreviewDisplay(holder);
        } catch (IOException e) {
            mCamera.release();
            mCamera = null;
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {
        if (mCamera != null) {
            mCamera.startPreview();
        }
    }

// カメラ部の機能は割愛

    Camera.PreviewCallback mPreviewCallback = new PreviewCallback() {

        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {
            TextView mTextView = (TextView) mActivity
                    .findViewById(R.id.result_textview);
            int previewWidth = camera.getParameters().getPreviewSize().width;
            int previewHeight = camera.getParameters().getPreviewSize().height;

            PlanarYUVLuminanceSource source = new PlanarYUVLuminanceSource(
                    data, previewWidth, previewHeight, 0, 0, previewWidth,
                    previewHeight, false);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            Reader reader = new MultiFormatReader();
            Result result = null;
            try {
                result = reader.decode(bitmap);
                String text = result.getText();
                mTextView.setText(text);
            } catch (Exception e) {
                mTextView.setText("reading...");
            }
        }
    };
}

 補足情報(FW/ツールのバージョンなど)

Android Studio:Ver.3.01
Android SDK:Ver.4.4 KitKat
Android SDK:Ver.5.1 Lollipop でも同様です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

build.gradleのdependenciesに記述追加するだけではなく、ソースファイルもダウンロードして自プロジェクト内に展開したということなのでしょうか?ライブラリーの機能を利用するにはdependenciesへの記述のみで良いはずです。ライブラリーのソースファイルまでも組み込んだことが逆効果になって「重複」が生じているものと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/22 01:54

    適切なアドバイス、ありがとうございます。
    コードの組み込みを取りやめることでエラー回避できました。
    これからもよろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.72%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる