2013-01-07 1 views
7

Ich habe eine App erstellt, die eine Nutzlast eines NFC-Tags überprüft, und wenn es mit der App übereinstimmt, schaltet Bluetooth um.Infinite Activity Loop beim Umschalten von Bluetooth

Leider scheint die App in eine Endlosschleife einzutreten, wo sie den Benutzer um Erlaubnis bittet, Bluetooth zu manipulieren, die Wahl ignoriert und erneut startet (die gleiche Frage/Aktivität erneut stellen). onActivityResult scheint nicht aufgerufen zu werden.

Ausgabe von meiner Konsolenprotokoll Anrufe ist:

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

Wenn ich weiterhin mit ‚Ja‘ auf die Berechtigung Aktivität treffen dann Bluetooth indefnitely schaltet, und das Konsolenprotokoll (logcat) wie folgt aussieht:

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 

und so weiter.

AndroidManifest listet die richtigen Berechtigungen, finden Sie unter:

<?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> 

Die CardActivity.java Datei, das ist, was das Bluetooth Chaos startet gefunden unten werden können:

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 

    } 
} 

Sie können sehen, dass , nach Logcat, onActivityResults und damit closeApp nicht aufgerufen werden.

Ich teste auf einem Nexus 7. Tag ist in Ordnung, ich habe mit verschiedenen NFC-Lesegeräten getestet.

Es gibt einige Fehler von Logcat, wenn das Tag gescannt wird, aber sie scheinen nicht viel Sinn für mich. Siehe unten:

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 

Massiver Dank für jede Hilfe zu diesem Thema. Wie Sie sich wahrscheinlich vorstellen können, macht es mich verrückt :)

+0

Als @NFC Kerl wies darauf hin, das ist eher ein Bluetooth-Problem als NFC, aber das Problem besteht immer noch – Mike

+0

Warum töten Sie den Prozess in ' closeApp() '? Ich stelle mir vor, das ist Teil deines Problems. Rufen Sie einfach 'finish()' für die Aktivität auf und lassen Sie sich von Android damit befassen, Ihren Prozess zu bereinigen, wenn er es möchte. Wenn Sie Ihren Prozess beenden, denkt Android, dass etwas Schlimmes passiert ist und versucht sich zu erholen. Als Teil dieser Wiederherstellung kann es sein, dass Intents erneut geliefert werden, was wahrscheinlich nicht das ist, was Sie wollen. –

+0

Ok, ich werde es versuchen. Ich rufe 'closeApp()', da es die einzige Möglichkeit ist, die App unsichtbar zu machen. Die Idee war, dass die App startet, Bluetooth schaltet und so schnell schließt, dass das einzige, was vom Benutzer bemerkt wird, ist, dass Bluetooth jetzt an/aus ist. – Mike

Antwort

1

Warum töten Sie den Prozess in closeApp()? Ich stelle mir vor, das ist Teil deines Problems. Rufen Sie einfach die Aktivität finish() an und lassen Sie sich von Android damit befassen, Ihren Prozess aufzuräumen, wenn er es möchte.

Wenn Sie Ihren Prozess beenden, denkt Android, dass etwas Schlimmes passiert ist und versucht sich zu erholen. Als Teil dieser Wiederherstellung kann es sein, dass eingehende Intents, die wahrscheinlich nicht das ist, was Sie wollen