2013-01-07 14 views
7

Ho creato un'applicazione che controlla un carico utile di un tag NFC e quando corrisponde all'app attiva/disattiva il Bluetooth.Ciclo di attività infinito quando si attiva il Bluetooth

Sfortunatamente l'applicazione sembra entrare in un ciclo infinito, dove chiede all'utente il permesso di manipolare il Bluetooth, ignora la scelta e si avvia di nuovo (chiedendo di nuovo la stessa domanda/Attività). onActivityResult sembra non essere chiamato.

uscita dalle mie chiamate log della console è:

Payload: 'quicktags-togglebluetooth' 
Bluetooth should now be on 

Se continuo a colpire 'Sì' sul permesso Activity poi Bluetooth alterna indefnitely, e il log della console (logcat) assomiglia:

Payload: quicktags-togglebluetooth 
Bluetooth should now be on 
Bluetooth should now be off 
Bluetooth should now be on 
Bluetooth should now be off 
Bluetooth should now be on 
Bluetooth should now be off 

e così via.

AndroidManifest elenca le autorizzazioni corrette, vedere qui sotto:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.getquicktags.qt" 
    android:versionCode="1" 
    android:versionName="1.0" android:installLocation="auto"> 

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="14" /> 

    <uses-permission android:name="android.permission.NFC" /> 
    <uses-permission android:name="android.permission.BLUETOOTH" /> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-feature android:name="android.hardware.nfc" android:required="true" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 

     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <activity 
      android:name=".CardActivity" 
      android:label="@string/app_name" > 

      <!-- Handle a collectable card NDEF record --> 
      <intent-filter> 
       <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
       <data android:mimeType="application/vnd.getquicktags.qt"/> 
       <category android:name="android.intent.category.DEFAULT"/> 
      </intent-filter> 
     </activity> 

    </application> 

</manifest> 

Il file CardActivity.java, che è quello che lancia questo caos Bluetooth può essere trovata qui sotto:

package com.getquicktags.qt; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.content.Intent; 
import android.nfc.NdefMessage; 
import android.nfc.NdefRecord; 
import android.nfc.NfcAdapter; 
import android.os.Bundle; 
import android.os.Parcelable; 
import android.util.Log; 
import android.bluetooth.*; 

public class CardActivity extends Activity implements OnClickListener { 

    private static final String TAG = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.card_activity); 

     // see if app was started from a tag and show game console 
     Intent intent = getIntent(); 

     if(intent.getType() != null && intent.getType().equals(MimeType.NFC_DEMO)) { 
      Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
      NdefMessage msg = (NdefMessage) rawMsgs[0]; 
      NdefRecord cardRecord = msg.getRecords()[0]; 
      String payload = new String(cardRecord.getPayload()); 

      Log.d(TAG, "Payload: '"+ payload +"'"); 

      if(payload.equals("quicktags-togglebluetooth")) { 
       toggleBluetooth(); 
      } 
     } 
    } 

    private void toggleBluetooth() { 

     BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
     if (mBluetoothAdapter == null) { 
      // Device does not support Bluetooth 
      Log.d(TAG, "No Bluetooth on device"); 
      closeApp(); 
     } 
     if (!mBluetoothAdapter.isEnabled()) { 
      Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); 
      startActivityForResult(enableBtIntent, 1); 
      Log.d(TAG, "Bluetooth should now be on"); 
     } else { 
      // Turn it off 
      mBluetoothAdapter.disable(); 
      Log.d(TAG, "Bluetooth should now be off"); 
      closeApp(); 
     } 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     // Close the app 
     Log.d(TAG, "Close the app call"); 
     closeApp(); 
    } 


    private void closeApp() { 
     Log.d(TAG, "And... close it. This is inside closeApp()"); 
     android.os.Process.killProcess(android.os.Process.myPid()); 
    } 

    public void onClick(DialogInterface dialog, int which) { 
     // TODO Auto-generated method stub 

    } 
} 

Si può vedere che , secondo logcat, onActivityResults e quindi closeApp non viene chiamato.

Sto testando su un Nexus 7. Tag va bene, ho provato con vari lettori NFC.

Ci sono alcuni errori da logcat quando il tag è scansionato, ma non sembrano avere molto senso per me. Vedi sotto:

01-07 00:18:41.595: E/bt-btif(5830): btif_enable_service: current services:0x100020 
01-07 00:18:41.605: E/bt-btif(5830): btif_enable_service: current services:0x140020 
01-07 00:18:41.605: E/bt-btif(5830): btif_enable_service: current services:0x140020 
01-07 00:18:42.415: E/bt-btif(5830): Calling BTA_HhEnable 
01-07 00:18:42.415: E/btif_config.c(5830): ## btif_config_get assert section && *section && key && *key && name && *name && bytes && type failed at line:186 ## 
01-07 00:18:42.415: E/bt-btif(5830): btif_storage_get_adapter_property service_mask:0x140020 
01-07 00:18:42.435: E/btif_config.c(5830): ## btif_config_get assert section && *section && key && *key && name && *name && bytes && type failed at line:186 ## 
01-07 00:18:42.445: E/bt_h4(5830): vendor lib postload completed 
01-07 00:18:42.545: E/BluetoothServiceJni(5830): SOCK FLAG = 1 *********************** 
01-07 00:18:42.605: E/BluetoothServiceJni(5830): SOCK FLAG = 0 *********************** 
01-07 00:18:42.715: E/BtOppRfcommListener(5830): Error accept connection java.io.IOException: read failed, socket might closed, read ret: -1 
01-07 00:18:42.915: E/bt-btif(5830): BTA AG is already disabled, ignoring ... 
01-07 00:18:42.935: E/bt-btif(5830): btif_disable_service: Current Services:0x140020 
01-07 00:18:42.945: E/bt-btif(5830): btif_disable_service: Current Services:0x100020 
01-07 00:18:42.945: E/bt-btif(5830): btif_disable_service: Current Services:0x100020 

Un grazie enorme per qualsiasi aiuto su questo. Come puoi immaginare, mi fa impazzire :)

+0

Come ha notato @NFC questo è più un problema Bluetooth di NFC, ma il problema persiste ancora – Mike

+0

Perché stai uccidendo il processo in ' CloseApp() '? Immagino che questo faccia parte del tuo problema. Basta chiamare 'finish()' sull'attività e lasciare che Android gestisca la pulizia del processo quando lo desidera. Quando uccidi il tuo processo, Android pensa che sia successo qualcosa di brutto e cerca di recuperare. Come parte di questo recupero potrebbe essere la riconsegna di Intenti che probabilmente non è ciò che desideri. –

+0

Ok, ci provo. Sto chiamando 'closeApp()' in quanto era l'unico modo per rendere l'app invisibile. L'idea era che l'app si avviasse, attivasse il bluetooth e si chiudesse così velocemente che l'unica cosa che notava l'utente era che Bluetooth era ora acceso/spento. – Mike

risposta

1

Perché stai uccidendo il processo in closeApp()? Immagino che questo faccia parte del tuo problema. Basta chiamare lo finish() sull'attività e lasciare che Android gestisca la pulizia del processo quando lo desidera.

Quando si uccide il processo, Android pensa che sia successo qualcosa di brutto e tenta di recuperare. Come parte di questo recupero potrebbe essere la riconsegna di Intenti che probabilmente non è quello che desideri

Problemi correlati