2017-02-20 80 views
0

我正在開發使用UART的傳感器工作的移動應用程序。從official github page的例子工作完美,但從代碼提取沒有工作。唯一改變的是設備搜索,但是此代碼與Polar H7設備完美配合(只發現設備名稱和設備地址併發送到下一個活動)。在這個活動我試圖連接到UART設備,這裏是代碼:無法在Android上初始化UART服務

公共類UartRecordingActivity擴展AppCompatActivity {

private final static String TAG = UartRecordingActivity.class.getSimpleName(); 

// BLE stuff 
public static final String EXTRAS_DEVICE_NAME = "DEVICE_NAME"; 
public static final String EXTRAS_DEVICE_ADDRESS = "DEVICE_ADDRESS"; 


//private BleService bleService; 

private String deviceName; 
private String deviceAddress; 

//private BleServicesAdapter gattServiceAdapter; 

private boolean isConnected = false; 



private static final int REQUEST_SELECT_DEVICE = 1; 
private static final int REQUEST_ENABLE_BT = 2; 
private static final int UART_PROFILE_READY = 10; 
private static final int UART_PROFILE_CONNECTED = 20; 
private static final int UART_PROFILE_DISCONNECTED = 21; 
private static final int STATE_OFF = 10; 
private int mState = UART_PROFILE_DISCONNECTED; 

private UartService mService = null; 
private BluetoothDevice mDevice = null; 
private BluetoothAdapter mBtAdapter = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_recording_uart); 

    Log.i(TAG, "onCreate"); 

    final Intent intent = getIntent(); 
    deviceName = intent.getStringExtra(EXTRAS_DEVICE_NAME); 
    deviceAddress = intent.getStringExtra(EXTRAS_DEVICE_ADDRESS); 

    final Intent gattServiceIntent = new Intent(this, UartService.class); 
    bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 

    mBtAdapter = BluetoothAdapter.getDefaultAdapter(); 
    service_init(); 

    mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress); 
    mService.connect(deviceAddress); 
} 

private void service_init() { 
    Intent bindIntent = new Intent(this, UartService.class); 
    bindService(bindIntent, mServiceConnection, BIND_AUTO_CREATE); 

    LocalBroadcastManager.getInstance(this).registerReceiver(UARTStatusChangeReceiver, 
      makeGattUpdateIntentFilter()); 
} 

//UART service connected/disconnected 
private ServiceConnection mServiceConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder rawBinder) { 
     mService = ((UartService.LocalBinder) rawBinder).getService(); 
     Log.d(TAG, "onServiceConnected mService= " + mService); 
     if (!mService.initialize()) { 
      Log.e(TAG, "Unable to initialize Bluetooth"); 
      finish(); 
     } 

    } 


    public void onServiceDisconnected(ComponentName classname) { 
     mService = null; 
    } 
}; 


@Override 
public boolean onOptionsItemSelected(MenuItem menuItem) { 
    if (menuItem.getItemId() == android.R.id.home) { 
     Intent intent = new Intent(this, HomeActivity.class); 
     startActivity(intent); 
    } 
    return super.onOptionsItemSelected(menuItem);} 

私人最終的BroadcastReceiver UARTStatusChangeReceiver =新的廣播接收器(){ @覆蓋 公共無效的onReceive (上下文上下文,意圖意圖){String action = intent.getAction();

final Intent mIntent = intent; 
    //*********************// 
    if (action.equals(UartService.ACTION_GATT_CONNECTED)) { 
     runOnUiThread(new Runnable() { 
      public void run() { 
       String currentDateTimeString = DateFormat.getTimeInstance().format(new Date()); 
       Log.d(TAG, "UART_CONNECT_MSG"); 

       mState = UART_PROFILE_CONNECTED; 
      } 
     }); 
    } 

    //*********************// 
    if (action.equals(UartService.ACTION_GATT_DISCONNECTED)) { 

     runOnUiThread(new Runnable() { 
      public void run() { 
       String currentDateTimeString = DateFormat.getTimeInstance().format(new Date()); 
       Log.d(TAG, "UART_DISCONNECT_MSG"); 
       mState = UART_PROFILE_DISCONNECTED; 
       mService.close(); 
      } 
     }); 
    } 

    //*********************// 
    if (action.equals(UartService.ACTION_GATT_SERVICES_DISCOVERED)) { 
     mService.enableTXNotification(); 
    } 
    //*********************// 
    if (action.equals(UartService.ACTION_DATA_AVAILABLE)) { 
     Log.i("data","received"); 
     final byte[] txValue = intent.getByteArrayExtra(UartService.EXTRA_DATA); 
     //handle data 
    } 
    //*********************// 
    if (action.equals(UartService.DEVICE_DOES_NOT_SUPPORT_UART)) { 
    } 

} 

};

private static IntentFilter makeGattUpdateIntentFilter() { 
    final IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(UartService.ACTION_GATT_CONNECTED); 
    intentFilter.addAction(UartService.ACTION_GATT_DISCONNECTED); 
    intentFilter.addAction(UartService.ACTION_GATT_SERVICES_DISCOVERED); 
    intentFilter.addAction(UartService.ACTION_DATA_AVAILABLE); 
    intentFilter.addAction(UartService.DEVICE_DOES_NOT_SUPPORT_UART); 
    return intentFilter; 
}} 

錯誤是由這一行造成的(MSERVICE導致NullPointerException異常:你已經連接通過結合服務

mService.connect(deviceAddress); 

回答

1

方法OnServiceConnected是保證在OnStart中回調你有空指針,因爲當你調用bindService ,需要一點時間才能建立連接,只要讓你的代碼如下所示:

public void onServiceConnected(ComponentName className, IBinder rawBinder) { 
    mService = ((UartService.LocalBinder) rawBinder).getService(); 
    Log.d(TAG, "onServiceConnected mService= " + mService); 
    if (!mService.initialize()) { 
     Log.e(TAG, "Unable to initialize Bluetooth"); 
     finish(); 
    } 
    mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(deviceAddress); 
    mService.connect(deviceAddress); 
} 
相關問題