2014-10-16 6 views
0

Когда я поставил НФК тег близко к моему мобильному телефону я хочу, чтобы мое приложение, чтобы начать так что я добавил это в моем манифесте:Android NFC Перенаправление намерение

<intent-filter> 
    <action android:name="android.nfc.action.TECH_DISCOVERED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
<meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> 

Это прекрасно работает.

Если пользователь не вошел в систему я хочу, чтобы пользователь войти в систему, прежде чем он может передавать данные из тега, так что я добавил это в моем OnCreate моей мерой активности:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    this.sessionManager = new SessionManager(this); 
    this.sessionManager.login(); 

    this.setContentView(R.layout.activity_measure); 
    this.nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    this.pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); 

    this.filters = new IntentFilter[] { ndef, }; 
    this.techLists = new String[][] { new String[] { android.nfc.tech.NfcV.class.getName() } }; 

    this.textViewYear = (TextView) findViewById(R.id.measure_textview_year); 
    this.textViewMonthDay = (TextView) findViewById(R.id.measure_textview_month_day); 
    this.textViewTime = (TextView) findViewById(R.id.measure_textview_time); 
    this.textViewGlucose = (TextView) findViewById(R.id.measure_textview_glucose); 

    new StartReadTask().execute(); 
} 

Но после того, как пользователь вошел в систему, он перенаправляется к моему главному меню из-за этого реализации:

/** 
* 
* @param v 
*/ 
@Override 
public void onClick(View view) { 
    String username = this.textEditUsername.getText().toString(); 
    String password = this.textEditPassword.getText().toString(); 

    if(username.trim().length() > 0 && password.trim().length() > 0){ 
     if(username.equals("test") && password.equals("test")){ 
      this.sessionManager.createLoginSession("Test-Name", "Test-Email"); 

      Intent intent = new Intent(this.getApplicationContext(), MainActivity.class); 

      this.startActivity(intent); 
      this.finish(); 
     } else { 
      this.dialogAlertManager.showAlertDialog(LoginActivity.this, "Login failed..", "Username or Password is incorrect", false); 
     }    
    } else { 
     this.dialogAlertManager.showAlertDialog(LoginActivity.this, "Login failed..", "Please enter username and password", false); 
    } 
} 

«MainActivity» упоминается здесь мое главное меню. но я хочу, чтобы активность перенаправляла мою активность, но я не знаю, как я могу это сделать. после «нормальный» вход, без намерения nfc, мне нужно приложение для перенаправления в главное меню , но с намерением nfc я хочу, чтобы он перенаправлял активность меры.

Также, когда пользователь уже зарегистрирован, я хочу, чтобы данные тега были переданы немедленно. теперь, если я хочу передать данные, я должен держать тег близко к телефону , чтобы начать мероприятие с мерой, а затем отложить его и снова вернуться к передаче данных.

Как я могу сделать обе вещи?

ответ

0

Вы делаете много разных вещей в одном коде: чтение nfc, обращение к полям ui, управление потоками действий. (Да, код примера для Android часто дает плохие примеры)

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

Убедительная вещь: вам нужно хранить информацию при чтении тега. Таким образом, вы можете реагировать по-разному и, наконец, отображать его, когда пользователь вошел в систему. Когда задействованы различные действия, вам, вероятно, нужно будет хранить данные в каком-то центральном объекте, таком как одиночный. (Альтернатива заключается в том, чтобы всегда отправлять информацию вместе с намерением при переходе из одной операции в другую)

Для чтения NFC есть пример приложения «NFC-HUNT» из google, который я нашел полезным. имеет некоторые особенности:

  1. он использует специальную деятельность без пользовательского интерфейса, который считывает NFC-метку. Таким образом, NFC-чтение инкапсулируется, а остальная часть вашего приложения вообще не имеет NFC-кода. Эта Activity (называемая NFCShimActivity) только что готовила Информацию, а затем создает намерение для запуска вашего обычного пользовательского интерфейса.

  2. Обычно, когда вид активности и видится новое действие для этого действия (поскольку NFC-тег был прочитан), открывается другой экземпляр Actiity. Только то, чего вы не хотите.

Решение заключается в установлении android:launchMode="singleTask" в манифесте, и реализовать этот метод в деятельности:

public void onNewIntent(Intent intent) {...} 

я написал в блоге запись о НФК кода чтения структуры, может быть, это поможет вам сделать это легче понять

http://meier-online.com/en/2014/09/nfc-hunt-analysed/

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