2013-01-07 34 views
7

Tôi đã tạo một ứng dụng kiểm tra tải trọng của thẻ NFC và khi ứng dụng khớp với ứng dụng sẽ bật Bluetooth.Hoạt động vô hạn vòng khi bật tắt Bluetooth

Rất tiếc, ứng dụng dường như đang tham gia vòng lặp vô hạn, nơi yêu cầu người dùng cho phép thao tác Bluetooth, bỏ qua lựa chọn và khởi chạy lại (hỏi cùng một câu hỏi/Hoạt động). onActivityResult dường như không được gọi.

Output từ giao diện điều khiển các cuộc gọi đăng nhập của tôi là:

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

Nếu tôi tiếp tục nhấn 'Yes' trên Hoạt động cho phép sau đó Bluetooth Toggles indefnitely, và các bản ghi giao diện điều khiển (logcat) trông giống như:

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 

v.v.

AndroidManifest liệt kê các điều khoản chính xác, vui lòng xem bên dưới:

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

File CardActivity.java, đó là những gì mắt hỗn loạn Bluetooth này có thể được tìm thấy dưới đây:

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 

    } 
} 

Bạn có thể thấy rằng , theo logcat, onActivityResults và do đó closeApp không được gọi.

Tôi đang thử nghiệm trên Nexus 7. Thẻ là tốt, tôi đã thử nghiệm với nhiều trình đọc NFC khác nhau.

Có một số lỗi từ logcat khi thẻ được quét, nhưng chúng dường như không có ý nghĩa gì đối với tôi. Xem bên dưới:

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 

Cảm ơn bạn rất nhiều về sự trợ giúp này. Như bạn có thể tưởng tượng, điều đó khiến tôi phát điên :)

+0

Vì anh chàng @NFC đã chỉ ra đây là vấn đề về Bluetooth nhiều hơn NFC, nhưng vấn đề vẫn còn tồn tại – Mike

+0

closeApp() '? Tôi tưởng tượng đây là một phần của vấn đề của bạn. Chỉ cần gọi 'finish()' trên hoạt động và để Android đối phó với việc dọn dẹp quy trình của bạn khi nó muốn. Khi bạn giết quá trình của bạn, Android nghĩ rằng một cái gì đó xấu đã xảy ra và cố gắng phục hồi. Là một phần của sự phục hồi này, nó có thể được phân phối lại Intents mà có lẽ không phải là những gì bạn muốn. –

+0

Ok, tôi sẽ cho đi. Tôi gọi 'closeApp()' vì đó là cách duy nhất để làm cho ứng dụng dường như vô hình. Ý tưởng là để ứng dụng khởi chạy, chuyển đổi bluetooth và đóng cửa nhanh đến mức điều duy nhất đáng chú ý của người dùng là Bluetooth hiện đã bật/tắt. – Mike

Trả lời

1

Tại sao bạn lại giết quá trình trong số closeApp()? Tôi tưởng tượng đây là một phần của vấn đề của bạn. Chỉ cần gọi finish() về hoạt động và cho phép Android xử lý bằng cách xóa sạch quy trình của bạn khi muốn.

Khi bạn giết quá trình của mình, Android cho rằng có điều gì đó không ổn và đã cố khôi phục. Là một phần của quá trình khôi phục này, có thể mục đích phân phối lại mà có thể không phải là những gì bạn muốn

Các vấn đề liên quan