java - Android BroadcastReceiver,似乎不像它应该的那样,我没有正确接收 Intent

标签 java android android-broadcastreceiver

我正在使用连接了扫描引擎的 Android 设备开展一个项目。 我已经反编译了我们使用的测试应用程序并为其获取了 BroadcastReceiver 代码并将其复制到我的代码中。

有一些显着差异,我不确定为什么,这是原始的 BroadcastReceiver 代码:

  private class BroadcastListener
    extends BroadcastReceiver
  {
    private BroadcastListener() {}

    public void onReceive(Context paramContext, Intent paramIntent)
    {
      if (paramIntent.getExtras() != null)
      {
        paramContext = paramIntent.getStringExtra(ScannerTestActivity.this.DATA_STRING_TAG);
        paramIntent = paramIntent.getStringExtra(ScannerTestActivity.this.LABEL_TYPE_TAG);
        ScannerTestActivity.this.mScanData.setText(paramContext);
        ScannerTestActivity.this.mSymbology.setText(paramIntent);
        if (paramContext.equals(ScannerTestActivity.this.TestScanCode))
        {
          paramContext = ScannerTestActivity.this;
          paramContext.SuccessfulScans += 1;
          ScannerTestActivity.this.mScanCount.setText("Scans: " + ScannerTestActivity.this.SuccessfulScans);
          if (ScannerTestActivity.this.SuccessfulScans >= 5)
          {
            ScannerTestActivity.this.mPassButton.setVisibility(0);
            ScannerTestActivity.this.mPassButton.setClickable(true);
          }
        }
      }
    }

但是当我在我的应用程序中尝试这段代码时,它不允许我将 paramContext 设置为 paramIntent.getStringExtra,这让我明白了不兼容类型的原因但是原始代码是如何做到这一点的。此上下文的重要性是什么?我应该使用它吗?

我在下面包含了我的代码以供引用。

private class BroadcastListener extends BroadcastReceiver {

  private BroadcastListener(){}

    @Override
    public void onReceive(Context context, Intent intent){
        if(intent.getExtras() != null) {

            TimePunch.this.mScanData = intent.getStringExtra(TimePunch.this.DATA_STRING_TAG);
           // MakePunch();
    }
  }
}

测试 BroadcastReceiver 功能,但 BroadcastReceiver 没有为 mScanData 赋值。我应该以不同的方式使用我的 onReceive 函数的上下文还是什么?

如有任何帮助,我们将不胜感激。

这是我的完整类(class):

   package com.zebra.depot_ar05.ctt;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimePunch extends AppCompatActivity {

    protected ConnectionClass connectionClass;
    protected String DATA_STRING_TAG="[Removed for Security]";
    protected String LABEL_TYPE_TAG="[Removed for Security]";
    protected String mScanData;
    TextView dateLabel;
    ProgressBar mProgBar;
    IntentFilter filter;
    protected Calendar c;
    protected Date punchTime;
    protected BroadcastListener mBroadcastListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_punch);
        this.mBroadcastListener = new BroadcastListener();
        this.filter = new IntentFilter();
        this.filter.addAction("DECODE");
        this.filter.addCategory("MAIN");
        registerReceiver(this.mBroadcastListener, this.filter);
        InitViews();
    }

    public void InitViews(){
        dateLabel = (TextView) findViewById(R.id.date_display_label);
        mProgBar = (ProgressBar) findViewById(R.id.progress_bar);
        mProgBar.setVisibility(View.GONE);
        setDate(dateLabel);
    }

    public void setDate(TextView v){
        DateFormat[] formats = new DateFormat[]{
                DateFormat.getDateInstance(),
        };
        for (DateFormat df : formats) {
            v.setText(df.format(new Date()));
        }
    }

    public void toastScan(View v){
        Toast.makeText(this,this.mScanData,Toast.LENGTH_SHORT).show();
    }
    public void MakePunch(){
        //DataWork worker = new DataWork();
        //worker.execute(this.mScanData,this.punchTime.toString());
        Toast.makeText(this, mScanData , Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_time_punch, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onPause(){
        super.onPause();
        unregisterReceiver(this.mBroadcastListener);

    }

    @Override
    public void onResume(){
        super.onResume();
        registerReceiver(this.mBroadcastListener,this.filter);
    }

    @Override
    public void onStop(){
        super.onStop();
    }

    private class BroadcastListener extends BroadcastReceiver {

        private BroadcastListener(){}

        @Override
        public void onReceive(Context context, Intent intent){
            if(intent.getExtras() != null) {

                TimePunch.this.mScanData = intent.getStringExtra(TimePunch.this.DATA_STRING_TAG);
                // MakePunch();
            }
        }
    }

    private class DataWork extends AsyncTask<String,String,String> {

        String con_name,id_num,x,punch_time;
        Boolean isSuccess = false;

        @Override
        protected String doInBackground(String... params){
            //check for valid scan
            id_num = params[0];
            punch_time = params[1];
            if(id_num.trim().equals("") || punch_time.trim().equals("")){
                x = "Scan Rejected, Please Try Again";
            }else{
                try {
                    Connection con = connectionClass.CONN();
                    if (con == null) {
                        x = "Error Connecting To SQL Server";
                    } else {
                        // I need a way to tell between in and out punches I'm assuming this is will be later gleamed from the sql setup
                        // I'm sure I will need to modify queries, they should be paramitized also.
                        String name_query = "select 'EMP_NAME' from EMPLOYEE_TABLE where EMP_ID='" + id_num + "'";
                        String punch_time_query = "update 'EMP_TIME_PUNCH' with ('" + punch_time + ")' where key='" + id_num + "'";
                        Statement stmt = con.createStatement();
                        ResultSet rs = stmt.executeQuery(punch_time_query);
                        ResultSet rs2 = stmt.executeQuery(name_query);
                        con_name = rs2.toString();
                        if (rs2.next()) {
                            x = con_name;
                            isSuccess = true;
                        } else {
                            x = "No Employee With That ID Found";
                            isSuccess = false;
                        }
                    }
                }catch (SQLException se) {
                    isSuccess = false;
                    Log.e("ERROR", se.getMessage());
                }catch (Exception e){
                    isSuccess = false;
                    Log.e("ERROR", e.getMessage());
                }

            }
            return x;
        }

        @Override
        protected void onPreExecute(){
            mProgBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onPostExecute(String r){
            mProgBar.setVisibility(View.GONE);
            Toast.makeText(TimePunch.this,r,Toast.LENGTH_SHORT).show();
            if(isSuccess){
                LayoutInflater inflater = getLayoutInflater();
                View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.custom_toast_layout));
                TextView con_name_display = (TextView) layout.findViewById(R.id.con_name_display);
                TextView time_punch_display = (TextView) layout.findViewById(R.id.punch_time_display);
                con_name_display.setText(con_name);
                time_punch_display.setText(punch_time);

                Toast toast = new Toast(TimePunch.this);
                toast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0);
                toast.setDuration(Toast.LENGTH_SHORT);
                toast.setView(layout);
                toast.show();
            }
        }


    }
}

编辑: 作为我的测试结果,我发现如果我扫描并且 Inputfield 具有焦点,那么我在设备上使用哪个应用程序并不重要,然后它将扫描输入到该字段中。例如我打开文件资源管理器,文件路径输入字段具有焦点,如果我扫描条形码,条形码的内容将输入到该字段中。

最佳答案

那是什么?

    paramContext=paramIntent.getStringExtra(ScannerTestActivity.this.DATA_STRING_TAG);
    paramIntent=paramIntent.getStringExtra(ScannerTestActivity.this.LABEL_TYPE_TAG);
ScannerTestActivity.this.mScanData.setText(paramContext);
ScannerTestActivity.this.mSymbology.setText(paramIntent);

你的编译器甚至允许你这样做? 您尝试将类型为 Context 的 paramContext 覆盖为 String 以及类型为 Intent 的 paramIntent

这可能是第一个问题

编辑:感谢评论 ;-) 有茶歇

第二

不要在 onCreate 和 onResume 中注册你的接收者,只在 onResume 中注册。

在您的 Activity 生命周期内,是否有任何其他地方应该发送广播。我在您的代码中没有看到任何应该触发您的 BroadcastReceiver 的 sendBroadcast 等

可能是你的问题

 this.filter = new IntentFilter();
 this.filter.addAction("DECODE");
 this.filter.addCategory("MAIN");
 registerReceiver(this.mBroadcastListener, this.filter);

检查确实应该接收到的是 Action DECODE

关于java - Android BroadcastReceiver,似乎不像它应该的那样,我没有正确接收 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270638/

相关文章:

android - 在我设备的文件资源管理器中找不到我的应用程序数据

android - 在进程死亡时以编程方式处理取消注册 BroadcastReceiver

java - 在通知区域显示加载 Activity 进度条

java - 在 Java 中使用的 Groovy 中定义方法

android - 运行时异常、view.InflateException、reflection.InvocationTargetException 和 OutOfMemoryError

java - Android - 为什么人们反复引用内联静态上下文,而不是在 Method() 中传递一次?

android - Android中的设备屏幕锁定/解锁状态事件

android - 带有 boot_completed 的运行时异常 Android O

具有上界通配符的 Java 泛型

java - 合并多个 JavaRDD