0

大家好,今天早上遇到这个奇怪的问题。使用摩托罗拉 TC55 (Android)

TC55 具有触发其内置扫描仪的 API。这是通过 Intents 完成的。这就是我一直在寻找的。

  1. 单击按钮以触发内置扫描仪 - 这会启动扫描条形码并将其返回给活动的意图。
  2. 返回数据后,将其存储到文本视图中并进行相应处理。

然而,问题是,当意图返回到活动时,onResume 会触发(如预期的那样),但这也会再次触发按钮的 onClick 事件,从而导致扫描仪重复触发。

实际上我的 LogCat 看起来像这样

09-03 12:09:08.089: I/System.out(1128): On resume
09-03 12:09:08.810: I/System.out(1128): Scan button clicked
09-03 12:09:08.820: I/System.out(1128): On resume
09-03 12:09:09.430: I/System.out(1128): Scan button clicked
09-03 12:09:09.440: I/System.out(1128): On resume
09-03 12:09:10.091: I/System.out(1128): Scan button clicked
09-03 12:09:10.111: I/System.out(1128): On resume .......

来到代码:非常感谢任何帮助。

public class ScanTagActivity extends Activity {
    // Tag used for logging errors
    private static final String TAG = ScanTagActivity.class.getSimpleName();
    Context ctx;
    ActionBar actionBar ;
    GlobalFunctions gF=new GlobalFunctions();
    private TextView textViewBarcode = null; 
    private Button btnImage=null;
    info.hoang8f.widget.FButton btnToggle;
    Button btnScan;
    private String profileName = "PatientTag";  //Normal 2D Scan
    private ProfileManager mProfileManager = null;
    private EMDKManager emdkManager = null;     
    ProfileConfig profileConfigObj = new ProfileConfig(); 
    Boolean isImageScanner=false;
     // Let's define the API intent strings for the soft scan trigger
    private static final String SCANNER_INPUT_PLUGIN = "com.motorolasolutions.emdk.datawedge.api.ACTION_SCANNERINPUTPLUGIN";
    private static final String ACTION_SOFTSCANTRIGGER = "com.motorolasolutions.emdk.datawedge.api.ACTION_SOFTSCANTRIGGER";
    private static final String ACTION_SETPROFILE = "com.motorolasolutions.emdk.datawedge.api.ACTION_SETDEFAULTPROFILE";
    private static final String EXTRA_PARAM = "com.motorolasolutions.emdk.datawedge.api.EXTRA_PARAMETER";
    private static final String EXTRA_DATA = "com.motorolasolutions.emdk.datawedge.api.EXTRA_PROFILENAME";
    private static final String DWAPI_START_SCANNING = "START_SCANNING";
    private static final String DWAPI_STOP_SCANNING = "STOP_SCANNING";
    private static final String DWAPI_TOGGLE_SCANNING = "TOGGLE_SCANNING";

    private static String ourIntentAction = "com.veeru.labtest.RECVR";
    private static final String SOURCE_TAG = "com.veeru.labtest.source";
    private static final String DATA_STRING_TAG = "com.motorolasolutions.emdk.datawedge.data_string";
    private static final String LABEL_TYPE_TAG = "com.veeru.labtest.label_type";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ctx=this;
        getActionBar().setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent)));
        SpannableString s = new SpannableString("Scan Patient Tag - 2D Code");      
        s.setSpan(new TypefaceSpan( this,"Helvetica-Bold.otf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        setTitle(s);  
        setContentView(R.layout.activity_scan_tag);
        textViewBarcode = (TextView) findViewById(R.id.txtOutput);
        btnToggle=(info.hoang8f.widget.FButton)findViewById(R.id.btnToggleScanner);
        btnToggle.setTypeface(gF.getHelvetica(ctx, true));
        btnScan=(Button)findViewById(R.id.btnScanB);
        btnScan.setOnClickListener(new View.OnClickListener() {         
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                System.out.println("Scan button clicked");
                int triggerDelay = 250; // delay in milliseconds
                Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                        public void run() {
                            Intent i = new Intent();
                            i.setAction(SCANNER_INPUT_PLUGIN);
                            i.putExtra(EXTRA_PARAM, "ENABLE_PLUGIN");
                            ScanTagActivity.this.sendBroadcast(i);
                            i.setAction(ACTION_SOFTSCANTRIGGER);                            
                            i.putExtra(EXTRA_PARAM, DWAPI_TOGGLE_SCANNING);
                            sendBroadcast(i);
                        }
                }, triggerDelay);

            }
        });
        //Intent i = getIntent();
        //handleDecodeData(i);


    }
    @Override
    public void onNewIntent(Intent i) {
        // set the action to perform
        handleDecodeData(i);
    }
    @Override 
    protected void onResume() {
        System.out.println("On resume");
        super.onResume();       
        Intent iResume = new Intent();
        // set the action to perform
        iResume.setAction(SCANNER_INPUT_PLUGIN);
        iResume.putExtra(EXTRA_PARAM, "DISABLE_PLUGIN");
        sendBroadcast(iResume);

    }



    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();      

    }   
    // This method is responsible for getting the data from the intent
    // formatting it and adding it to the end of the edit box
    private void handleDecodeData(Intent i) {
        // check the intent action is for us

        if ( i.getAction().contentEquals(ourIntentAction) ) {
            // define a string that will hold our output
            String out = "";
            // get the source of the data
            String source = i.getStringExtra(SOURCE_TAG);
            // save it to use later
            if (source == null) source = "scanner";
            // get the data from the intent
            String data = i.getStringExtra(DATA_STRING_TAG);
            // let's define a variable for the data length
            Integer data_len = 0;
            // and set it to the length of the data
            if (data != null) data_len = data.length();

            // check if the data has come from the barcode scanner
            if (source.equalsIgnoreCase("scanner")) {
                System.out.println("Intent triggered with data "+data);
                // check if there is anything in the data
                if (data != null && data.length() > 0) {
                    // we have some data, so let's get it's symbology
                    String sLabelType = i.getStringExtra(LABEL_TYPE_TAG);
                    // check if the string is empty
                    if (sLabelType != null && sLabelType.length() > 0) {
                        // format of the label type string is LABEL-TYPE-SYMBOLOGY
                        // so let's skip the LABEL-TYPE- portion to get just the symbology
                        sLabelType = sLabelType.substring(11);
                    }
                    else {
                        // the string was empty so let's set it to "Unknown"
                        sLabelType = "Unknown";
                    }
                    // let's construct the beginning of our output string
                    out = "Source: Scanner, " + "Symbology: " + sLabelType + ", Length: " + data_len.toString() + ", Data: ...\r\n";
                    // now let's update the text in the edit box
                    textViewBarcode.setText(data);

                    System.out.println(out);     
                }
            }

            // check if the data has come from the MSR
            if (source.equalsIgnoreCase("msr")) {
                // construct the beginning of our output string
                out = "Source: MSR, Length: " + data_len.toString() + ", Data: ...\r\n"; 
            }


        }

    }
}
4

2 回答 2

0

只需为按钮设置一个 onclicklistener。AS 应该负责其余的工作

于 2014-09-03T05:18:48.710 回答
0

我真的无法解决问题,但是帮助我的是使用 onTouch Listener 并使用 MotionEvent.ACTION_UP。

这并没有在恢复时反复触发 onClick 事件,并且解决了这个问题。

于 2014-09-03T05:42:21.237 回答