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 по-другому или как?

Любая помощь будет принята с благодарностью.

Вот мой полный класс:

   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();
            }
        }


    }
}

РЕДАКТИРОВАТЬ :: В результате моего тестирования я обнаружил, что не имеет значения, в каком приложении я нахожусь на устройстве, если я сканирую, а поле ввода имеет фокус, тогда оно будет вводить сканирование в поле. например У меня открыт проводник с полем ввода пути к файлу, имеющим фокус, если я сканирую штрих-код, содержимое штрих-кода вводится в поле.


person nulltron    schedule 14.12.2015    source источник
comment
Ну, декомпилированный код Receiver просто неверен в нескольких местах; не уверен, как это произошло. Что касается mScanData, которому не присваивается значение, вы уверены, что у вас есть правильный ключ для этого дополнительного? То есть вы уверены, что значение DATA_STRING_TAG верное? Кроме того, вы уверены, что это дополнительная строка? Учитывая все остальные ошибки в декомпилированном коде, неудивительно, что это тоже неправильно.   -  person Mike M.    schedule 14.12.2015
comment
Пожалуйста, разместите код трансляции   -  person siva    schedule 14.12.2015
comment
@7383 К сожалению, у меня нет доступа к коду трансляции   -  person nulltron    schedule 14.12.2015
comment
Ваш вопрос не так ясен. Попробуй объяснить короче   -  person siva    schedule 14.12.2015
comment
Меня попросили сделать приложение timeclock. Это приложение работает на Android 4.1.1 с подключенным сканирующим устройством. Мы тестируем эти устройства с помощью apk. Внутри этого apk (после его декомпиляции) внутри ScannerTestActivity я нашел исходный код BroadcastReceiver. Я предположил, что это код, используемый для получения информации, которая была получена, и я предполагаю, что она передается приложением Scan Engine.   -  person nulltron    schedule 14.12.2015
comment
Первое, что я хотел бы сделать, это выгрузить все дополнения к Intent в Receiver и посмотрите, что вам там передают.   -  person Mike M.    schedule 14.12.2015
comment
@МайкМ. В настоящее время я делаю дамп намерений, извините за медленную работу, я обновлю после того, как сделаю это.   -  person nulltron    schedule 14.12.2015
comment
Спасибо всем, кто пытался мне помочь, надеюсь, я получу доступ к коду вещания, который поможет мне обнаружить мою настоящую проблему.   -  person nulltron    schedule 14.12.2015


Ответы (2)


это что?

    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);

Ваш компилятор позволяет вам это делать? Вы пытаетесь перезаписать paramContext, который является типом Context для String, а также paramIntent, который является типом Intent

Это наверное первая проблема

Редактировать: спасибо за комментарий ;-) был перерыв на чай

Второй

Не регистрируйте ресивер в onCreate и onResume, делайте это только в onResume.

И есть ли какие-либо другие действия, которые должны отправлять широковещательную рассылку в течение всей вашей деятельности. Я не вижу в вашем коде никаких sendBroadcast и т. д., которые должны запускать ваш BroadcastReceiver

так что, вероятно, ваша проблема здесь

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

Проверка - это действие DECODE действительно то, что должно быть получено

person wojciech_maciejewski    schedule 14.12.2015
comment
Да, ОП упоминает об этом в вопросе. - person Mike M.; 14.12.2015

Моя проблема возникла из-за того, что я не знал, как работает приложение, управляющее модулем сканирования в устройстве. По плохо декомпилированному коду я мог убедиться, что намерение было передано и получено для передачи данных сканирования между DataWedge (механизм сканирования) и AndroidFullTest (приложение для тестирования).

Позже я декомпилировал приложение DataWedge и изучил его содержимое, показав, какие действия и категории применять к моему фильтру намерений, но на самом деле проблема была не в этом. Интересно, что когда я был в декомпилированном коде, я заметил предпочтения, которые можно было установить (я предположил, что это пользователь, но я не знал, что вы можете установить предпочтения в приложении DataWedge, поскольку интерфейс заставит вас поверить в обратное).

Мне просто пришлось изменить предпочтение с применения ввода в виде текста в текстовые поля на использование Intent Broadcast. Это также позволило мне указать пользовательских кошек и действия для моего фильтра намерений, если я этого пожелаю.

Код выше для моих BroadcastReceiver функций, как и ожидалось.

Что следует помнить при отслеживании трансляций: (включая ссылки на документы разработчиков)

person nulltron    schedule 16.12.2015