我正在尝试使该应用扫描一本书的ISBC,然后发出http请求以获取该书的标题和其他详细信息。

我使用rootView.findViewById(R.id.scan_button).....启动相机方面的应用程序正常工作。现在,我想记录条形码和代码格式,以确保它可以在onActivityResult中工作,但不记录或吐司。相机专注于代码后,相机活动关闭,并返回到我具有启动扫描功能的按钮的视图,但未记录任何内容或进行任何烘烤。我以前曾使用本教程-http://code.tutsplus.com/tutorials/android-sdk-create-a-barcode-reader--mobile-17162-来了解zXing的工作原理和本教程的完美运行,现在我正在尝试实现一些代码。

        rootView.findViewById(R.id.scan_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity());
                scanIntegrator.setBeepEnabled(true);
                scanIntegrator.setBarcodeImageEnabled(true);
                scanIntegrator.setPrompt("Scan a barcode");
                scanIntegrator.initiateScan();
            }
        });



    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
//retrieve scan result
        IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
        if (scanningResult != null) {
//we have a result
            String scanContent = scanningResult.getContents();
            String scanFormat = scanningResult.getFormatName();
            formatTxt.setText("FORMAT: " + scanFormat);
            contentTxt.setText("CONTENT: " + scanContent);
            Log.i("FORMAT ", scanFormat);
            Log.i("CONTENT", scanContent);
            Log.i("xZing", "contents: "+scanContent+" format: "+scanFormat);

            Toast.makeText(getActivity(), "FORMAT " + scanFormat + " CONTENT " + scanContent, Toast.LENGTH_LONG).show();
        }else{
            Toast toast = Toast.makeText(getActivity(),
                    "No scan data received!", Toast.LENGTH_SHORT);
            toast.show();
        }
    }


完整的代码

public class AddBook extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {
        private static final String TAG = "INTENT_TO_SCAN_ACTIVITY";
        private EditText ean;
        private final int LOADER_ID = 1;
        private View rootView;
        private final String EAN_CONTENT="eanContent";
        private static final String SCAN_FORMAT = "scanFormat";
        private static final String SCAN_CONTENTS = "scanContents";

        private String mScanFormat = "Format:";
        private String mScanContents = "Contents:";


        private Button scanBtn;
        private TextView formatTxt, contentTxt;



        public AddBook(){
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            if(ean!=null) {
                outState.putString(EAN_CONTENT, ean.getText().toString());
            }
        }

        @Override
        public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            rootView = inflater.inflate(R.layout.fragment_add_book, container, false);
            ean = (EditText) rootView.findViewById(R.id.ean);
            formatTxt = (TextView)rootView.findViewById(R.id.scan_format);
            contentTxt = (TextView)rootView.findViewById(R.id.scan_content);

            ean.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                    //no need
                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    //no need
                }

                @Override
                public void afterTextChanged(Editable s) {

                    String ean = s.toString();
                    //catch isbn10 numbers
                    if (ean.length() == 10 && !ean.startsWith("978")) {
                        ean = "978" + ean;
                    }
                    if (ean.length() < 13) {
                        clearFields();
                        return;
                    }
                    //Once we have an ISBN, start a book intent
                    Intent bookIntent = new Intent(getActivity(), BookService.class);
                    bookIntent.putExtra(BookService.EAN, ean);
                    bookIntent.setAction(BookService.FETCH_BOOK);
                    getActivity().startService(bookIntent);
                    AddBook.this.restartLoader();


                }
            });

            rootView.findViewById(R.id.scan_button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity());
                    scanIntegrator.setBeepEnabled(true);
                    scanIntegrator.setBarcodeImageEnabled(true);
                    scanIntegrator.setPrompt("Scan a barcode");
                    scanIntegrator.initiateScan();
                }
            });

            rootView.findViewById(R.id.save_button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    ean.setText("");
                }
            });

            rootView.findViewById(R.id.delete_button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent bookIntent = new Intent(getActivity(), BookService.class);
                    bookIntent.putExtra(BookService.EAN, ean.getText().toString());
                    bookIntent.setAction(BookService.DELETE_BOOK);
                    getActivity().startService(bookIntent);
                    ean.setText("");
                }
            });

            if(savedInstanceState!=null){
                ean.setText(savedInstanceState.getString(EAN_CONTENT));
                ean.setHint("");
            }

            return rootView;
        }

        public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    //retrieve scan result
            IntentResult scanningResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
            if (scanningResult != null) {
    //we have a result
                String scanContent = scanningResult.getContents();
                String scanFormat = scanningResult.getFormatName();
                formatTxt.setText("FORMAT: " + scanFormat);
                contentTxt.setText("CONTENT: " + scanContent);
                Log.i("FORMAT ", scanFormat);
                Log.i("CONTENT", scanContent);
                Log.i("xZing", "contents: "+scanContent+" format: "+scanFormat);

                Toast.makeText(getActivity(), "FORMAT " + scanFormat + " CONTENT " + scanContent, Toast.LENGTH_LONG).show();
            }else{
                Toast toast = Toast.makeText(getActivity(),
                        "No scan data received!", Toast.LENGTH_SHORT);
                toast.show();
            }
        }





        // Checks for network connection
        public boolean checkNetworkConnection(){
            ConnectivityManager cm =
                    (ConnectivityManager)getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
            boolean isConnected = activeNetwork != null &&
                    activeNetwork.isConnectedOrConnecting();

            return isConnected;
        }

        private void restartLoader(){
            getLoaderManager().restartLoader(LOADER_ID, null, this);
        }


        @Override
        public android.support.v4.content.Loader<Cursor> onCreateLoader(int id, Bundle args) {
            if(ean.getText().length()==0){
                return null;
            }
            String eanStr= ean.getText().toString();
            if(eanStr.length()==10 && !eanStr.startsWith("978")){
                eanStr="978"+eanStr;
            }
            return new CursorLoader(
                    getActivity(),
                    AlexandriaContract.BookEntry.buildFullBookUri(Long.parseLong(eanStr)),
                    null,
                    null,
                    null,
                    null
            );
        }

        @Override
        public void onLoadFinished(android.support.v4.content.Loader<Cursor> loader, Cursor data) {
            if (!data.moveToFirst()) {
                return;
            }

            String bookTitle = data.getString(data.getColumnIndex(AlexandriaContract.BookEntry.TITLE));
            ((TextView) rootView.findViewById(R.id.bookTitle)).setText(bookTitle);

            String bookSubTitle = data.getString(data.getColumnIndex(AlexandriaContract.BookEntry.SUBTITLE));
            ((TextView) rootView.findViewById(R.id.bookSubTitle)).setText(bookSubTitle);

            String authors = data.getString(data.getColumnIndex(AlexandriaContract.AuthorEntry.AUTHOR));
            String[] authorsArr = authors.split(",");
            ((TextView) rootView.findViewById(R.id.authors)).setLines(authorsArr.length);
            ((TextView) rootView.findViewById(R.id.authors)).setText(authors.replace(",","\n"));
            String imgUrl = data.getString(data.getColumnIndex(AlexandriaContract.BookEntry.IMAGE_URL));
            if(Patterns.WEB_URL.matcher(imgUrl).matches()){
                new DownloadImage((ImageView) rootView.findViewById(R.id.bookCover)).execute(imgUrl);
                rootView.findViewById(R.id.bookCover).setVisibility(View.VISIBLE);
            }

            String categories = data.getString(data.getColumnIndex(AlexandriaContract.CategoryEntry.CATEGORY));
            ((TextView) rootView.findViewById(R.id.categories)).setText(categories);

            rootView.findViewById(R.id.save_button).setVisibility(View.VISIBLE);
            rootView.findViewById(R.id.delete_button).setVisibility(View.VISIBLE);
        }

        @Override
        public void onLoaderReset(android.support.v4.content.Loader<Cursor> loader) {

        }

        private void clearFields(){
            ((TextView) rootView.findViewById(R.id.bookTitle)).setText("");
            ((TextView) rootView.findViewById(R.id.bookSubTitle)).setText("");
            ((TextView) rootView.findViewById(R.id.authors)).setText("");
            ((TextView) rootView.findViewById(R.id.categories)).setText("");
            rootView.findViewById(R.id.bookCover).setVisibility(View.INVISIBLE);
            rootView.findViewById(R.id.save_button).setVisibility(View.INVISIBLE);
            rootView.findViewById(R.id.delete_button).setVisibility(View.INVISIBLE);
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            activity.setTitle(R.string.scan);
        }
    }

        enter code here

最佳答案

问题是我正在使用IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity()),这影响了在活动/父级上调用onActivityResult。而且由于onActivityResult不执行任何操作,因此没有任何反应。由于我使用的是片段,因此未调用子片段/片段的onActivityResult。

要解决此问题,我将InClick中的IntentIntegrator scanIntegrator = new IntentIntegrator(getActivity())替换为IntentIntegrator.forSupportFragment(AddBook.this),并使用“ AddBook.this”引用该片段,因此该片段中的onActivityResult被调用,而不是活动中的一项。 。

:)

干杯!

关于java - zxing条码扫描器未返回结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35323915/

10-11 01:28