Stworzyłem aplikację, która sprawdza zawartość znacznika NFC, a gdy pasuje do aplikacji, przełącza Bluetooth.Infinite Activity Loop przy przełączaniu Bluetooth
Niestety, aplikacja wydaje się wchodzić w nieskończoną pętlę, w której prosi użytkownika o pozwolenie na manipulowanie Bluetooth, ignoruje wybór i uruchamia się ponownie (ponownie zadając to samo pytanie/działanie). onActivityResult
wydaje się nie być wywoływana.
Wyjście z moich konsoli rozmów dziennika to:
Payload: 'quicktags-togglebluetooth'
Bluetooth should now be on
Gdybym nadal hit 'Tak' na aktywność zgody następnie Bluetooth przełącza indefnitely, a dziennik konsoli (logcat) wygląda następująco:
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
i tak dalej.
AndroidManifest wymienia odpowiednie uprawnienia, można znaleźć poniżej:
<?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>
Plik CardActivity.java, co jest, co uruchamia ten chaos Bluetooth można znaleźć poniżej:
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
}
}
Widać, że , zgodnie z logcat, onActivityResults
, a tym samym closeApp
nie są wywoływane.
Testuję na Nexusie 7. Tag jest w porządku, testowałem z różnymi czytnikami NFC.
Występują błędy z logcat po zeskanowaniu znacznika, ale nie wydają mi się zbyt sensowne. Zobacz poniżej:
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
Ogromne dzięki za pomoc w tej sprawie. Jak możesz sobie wyobrazić, doprowadza mnie to do szału :)
Jak zauważył facet @NFC, jest to bardziej problem z Bluetooth niż NFC, ale problem nadal występuje – Mike
Dlaczego zabijasz proces w closeApp() '? Wyobrażam sobie, że to część twojego problemu. Po prostu wywołaj 'finish()' w działaniu i pozwól Androidowi uporać się z czyszczeniem twojego procesu, kiedy tylko zechce. Kiedy zabijesz swój proces, Android myśli, że stało się coś złego i próbuje odzyskać. W ramach tego powrotu do zdrowia może pojawić się zamiar, który prawdopodobnie nie jest tym, czego potrzebujesz. –
Ok, dam ci szansę. Nazywam 'closeApp()', ponieważ był to jedyny sposób, aby aplikacja była niewidoczna. Chodziło o to, aby aplikacja uruchamiała się, przełącza bluetooth i zamyka się tak szybko, że jedyną rzeczą zauważalną przez użytkownika jest to, że Bluetooth był teraz włączony/wyłączony. – Mike