2015-12-14 2 views
2

Я работаю над проектом с использованием устройства Android, на котором подключен Scan Engine. Я декомпилировал тестовое приложение, которое мы использовали, и взял для него код 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(); 
      } 
     } 


    } 
} 

EDIT :: В результате моего тестирования я обнаружил, что это не имеет значения, какое приложение я в на устройстве, если я сканировать и в поле ввода есть фокус, тогда он будет вводить сканирование в поле. например У меня открыт проводник файлов с полем ввода пути к файлу с фокусом, если я сканирую штрих-код, содержимое штрих-кода вводится в поле.

+0

Ну, декомпилированный приемник код в некоторых местах ошибочен; не знаю, как это произошло. Что касается 'mScanData', которому не присвоено значение, вы уверены, что у вас есть правильный ключ для этого дополнительного? То есть, вы уверены, что значение 'DATA_STRING_TAG' является правильным? Кроме того, вы уверены, что это String? Со всеми другими ошибками в декомпилированном коде это не удивительно, если это неправильно. –

+0

Пожалуйста, сообщите свой номер вещания – 7383

+0

@ 7383 У меня нет доступа к радиопередатку, к сожалению, – dbrad

ответ

1

что это?

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, который является тип контекста в строку и так paramIntent что тип Intent

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

Edit: Спасибо за комментарий ;-) был чаепитие

Второй

Не записывайте репитер в onCreate и onResume, делайте это только в onResume.

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

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

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

Проверить это действие ДЕКОДИРОВАТЬ действительно то, что должно быть получено

+0

Да, ОП упоминает это в вопросе. –

0

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

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

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

Код, указанный выше для моего BroadcastReceiver функционирует должным образом.

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

Смежные вопросы