Reputation: 11
I am working on the project in which U have to connect with other device via bluetooth RFCOMM. I wrote some code (mostly based on Mitch Tabian tutorials on youtube), and I am stuck.
I am able to connect to laptop, but I can't send and receive any data. I am asking you guys to look at my code and tell me which part is incorrect
Second Activity
package com.example.mgr;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.UUID;
public class pulpit2kod extends AppCompatActivity {
private static final String TAG = "pulpit2kod";
BluetoothAdapter mBluetoothAdapter;
private Spinner spinnerlist;
private ArrayList<String> mDeviceList = new ArrayList<>();
private ArrayList<BluetoothDevice> bttDeviceList = new ArrayList<>();
private ImageView btton;
private ImageView bttoff;
BluetoothDevice mBTDevice;
Button btconnect;
Button btsearch;
Button btgoto1screen;
Button btONOFF;
Button btvisibility;
Button btsend;
Button btpair;
EditText etsend;
BluetoothConnectionService mBluetoothConnection;
private static final UUID MY_UUID_INSECURE = UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");//{0000110e-0000-1000-8000-00805f9b34fb}
StringBuilder messages;
TextView etreceive;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pulpit2);
spinnerlist = (Spinner) findViewById(R.id.spinner);
Log.d(TAG, "onCreate: Starting");
btconnect = (Button) findViewById(R.id.polacz);
btsearch = (Button) findViewById(R.id.search) ;
btgoto1screen = (Button) findViewById(R.id.goto1screen);
btONOFF = (Button) findViewById(R.id.ONOFF);
btvisibility = (Button) findViewById(R.id.widocznosc);
btsend = (Button) findViewById(R.id.btsend);
btpair = (Button) findViewById(R.id.pair);
btton = (ImageView) findViewById(R.id.btton);
bttoff = (ImageView) findViewById(R.id.bttoff);
etsend = (EditText) findViewById(R.id.etsend);
etreceive = (TextView) findViewById(R.id.etreceive);
messages = new StringBuilder();
LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver4, new IntentFilter("incomingMessage"));
//-------------------BT ON logo ---------------------------------------------------------------
int logobtton = getResources().getIdentifier("@drawable/btton", null, this.getPackageName());
btton.setImageResource(logobtton);
//-------------------BT OFF logo --------------------------------------------------------------
int logobttoff = getResources().getIdentifier("@drawable/bttoff", null, this.getPackageName());
bttoff.setImageResource(logobttoff);
//---------------------lista position click--------------------------------
spinnerlist.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, final int position, long id) {
btpair.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
registerReceiver(mBroadcastReceiver3,filter);
if (Build.VERSION.SDK_INT>Build.VERSION_CODES.JELLY_BEAN_MR2){
bttDeviceList.get(position).createBond();
mBTDevice = bttDeviceList.get(position);
mBluetoothConnection = new BluetoothConnectionService(pulpit2kod.this);
}
}
});
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
Toast.makeText(pulpit2kod.this,"Wybierz pozycję, aby polaczyc", Toast.LENGTH_SHORT).show();
}
});
btconnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startConnection();
}
});
btsend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
byte [] bytes = etsend.getText().toString().getBytes(Charset.defaultCharset());
mBluetoothConnection.write(bytes);
etsend.setText("");
}
});
//---------------------BT wyszikiwanie przycisk-----------------------------
btsearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wyszukiwanie();
}
});
//---------------------BT widocznosc przycisk-------------------------------
btvisibility.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Log.d(TAG, "onCreate: discoverability bt");
widocznosc();
}
});
//----------------------bluetooth przycisk----------------------------------
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
btONOFF.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: enabling/disabling bt");
enabledDisableBT();
}});
//--------------------- przycisk powrot do glownego menu----------------------
btgoto1screen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: Powrot do menu");
Intent intent = new Intent(pulpit2kod.this, MainActivity.class);
startActivity(intent);
}
});
logobt();
}
public void startConnection(){
startBTConnection(mBTDevice,MY_UUID_INSECURE);
}
public void startBTConnection(BluetoothDevice device, UUID uuid){
Log.d(TAG, "startBTConnection: Initializing RFCOM Bluetooth Connection.");
mBluetoothConnection.startClient(device,uuid);
}
private void logobt() {
if (!mBluetoothAdapter.isEnabled()){
bttoff.setVisibility(View.VISIBLE);
btton.setVisibility(View.INVISIBLE);
}
if (mBluetoothAdapter.isEnabled()){
bttoff.setVisibility(View.INVISIBLE);
btton.setVisibility(View.VISIBLE);
}
}
private void wyszukiwanie() {
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.startDiscovery();
if (mBluetoothAdapter.isDiscovering()){
mBluetoothAdapter.cancelDiscovery();
mBluetoothAdapter.startDiscovery();
}
if (!mBluetoothAdapter.isDiscovering()) {
mBluetoothAdapter.startDiscovery();
}
bttDeviceList.clear();
mDeviceList.clear();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver,filter);
}
//------------------------- metoda widocznosc ----------------------------------------
private void widocznosc() {
Log.d(TAG, "widocznosc: Making device discoverable for 120 seconds");
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
startActivity(discoverableIntent);
IntentFilter intentFilter = new IntentFilter(mBluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
registerReceiver(mBroadcastReceiver2,intentFilter);
}
//-------------------------kompatybilność z BT i ON/OFF-------------------------------------
private void enabledDisableBT() {
if(mBluetoothAdapter ==null){
Log.d(TAG, "enabledDisableBT: BT not supported");
}
if(!mBluetoothAdapter.isEnabled()){
Intent enableBTIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enableBTIntent);
IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver1, BTIntent);
bttDeviceList.clear();
mDeviceList.clear();
spinnerlist.setAdapter(null);
btton.setVisibility(View.VISIBLE);
bttoff.setVisibility(View.INVISIBLE);
}
if(mBluetoothAdapter.isEnabled()){
mBluetoothAdapter.disable();
IntentFilter BTInent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mBroadcastReceiver1, BTInent);
bttoff.setVisibility(View.VISIBLE);
btton.setVisibility(View.INVISIBLE);
}
}
//----------------------------------------------------------------------------------------------
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
bttDeviceList.add(device);
mDeviceList.add(device.getName()+": "+device.getAddress());
Log.d(TAG, "onReceive: Dodano"+device.getName()+": "+device.getAddress());
spinnerlist.setAdapter(new ArrayAdapter<String>(context,android.R.layout.simple_spinner_item,mDeviceList));
}
}
};
//---------------------------stan BT-------------------------------------------------------
private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(mBluetoothAdapter.ACTION_STATE_CHANGED)){
final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,mBluetoothAdapter.ERROR);
switch (state){
case BluetoothAdapter.STATE_OFF:
Log.d(TAG, "onReceive: STATE OFF");
Toast.makeText(pulpit2kod.this ,"Turned off",Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_TURNING_OFF:
Log.d(TAG, "onReceive: STATE TURNING OFF");
Toast.makeText(pulpit2kod.this ,"Turning off",Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_TURNING_ON:
Log.d(TAG, "onReceive:STATE TURNING ON");
Toast.makeText(pulpit2kod.this ,"Turning on",Toast.LENGTH_SHORT).show();
break;
case BluetoothAdapter.STATE_ON:
Log.d(TAG, "onReceive: STATE ON");
Toast.makeText(pulpit2kod.this ,"Turned on",Toast.LENGTH_SHORT).show();
break;
}
}
}
};
private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(mBluetoothAdapter.ACTION_SCAN_MODE_CHANGED)){
int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE,mBluetoothAdapter.ERROR);
switch (mode){
case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
Log.d(TAG, "onReceive: Discoverability Enabled");
break;
case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
Log.d(TAG, "onReceive: Discoverability Disabled. Able to recieve connections");
break;
case BluetoothAdapter.SCAN_MODE_NONE:
Log.d(TAG, "onReceive:Discoverability Disabled. Not able to recieve connections");
break;
case BluetoothAdapter.STATE_CONNECTING:
Log.d(TAG, "onReceive: Connecting");
break;
case BluetoothAdapter.STATE_CONNECTED:
Log.d(TAG, "onReceive: Connected");
break;
}
}
}
};
private final BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)){
BluetoothDevice mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (mDevice.getBondState()==BluetoothDevice.BOND_BONDED){
Toast.makeText(pulpit2kod.this,"Bonded",Toast.LENGTH_SHORT).show();
mBTDevice = mDevice;
}
if (mDevice.getBondState()==BluetoothDevice.BOND_BONDING){
Toast.makeText(pulpit2kod.this,"Bonding",Toast.LENGTH_SHORT).show();
}
if (mDevice.getBondState()==BluetoothDevice.BOND_NONE){
Toast.makeText(pulpit2kod.this,"Not bonded",Toast.LENGTH_SHORT).show();
}
}
}
};
BroadcastReceiver mBroadcastReceiver4 = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String text = intent.getStringExtra("theMessage");
messages.append(text +"\n");
etreceive.setText(messages);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mBroadcastReceiver1);
unregisterReceiver(mBroadcastReceiver2);
unregisterReceiver(mBroadcastReceiver3);
unregisterReceiver(mBroadcastReceiver4);
unregisterReceiver(mReceiver);
}}
BluetoothConnectionService
package com.example.mgr;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.UUID;
/**
* Created by User on 12/21/2016.
*/
public class BluetoothConnectionService {
private static final String TAG = "BluetoothConnectionServ";
private static final String appName = "MYAPP";
private static final UUID MY_UUID_INSECURE =
UUID.fromString("8ce255c0-200a-11e0-ac64-0800200c9a66");
private final BluetoothAdapter mBluetoothAdapter;
Context mContext;
private AcceptThread mInsecureAcceptThread;
private ConnectThread mConnectThread;
private BluetoothDevice mmDevice;
private UUID deviceUUID;
ProgressDialog mProgressDialog;
private ConnectedThread mConnectedThread;
public BluetoothConnectionService(Context context) {
mContext = context;
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
start();
}
/**
* This thread runs while listening for incoming connections. It behaves
* like a server-side client. It runs until a connection is accepted
* (or until cancelled).
*/
private class AcceptThread extends Thread {
// lokalny serwer
private final BluetoothServerSocket mmServerSocket;
public AcceptThread(){
BluetoothServerSocket tmp = null;
// nasluchiwanie
try{
tmp = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord(appName, MY_UUID_INSECURE);
Log.d(TAG, "AcceptThread: Setting up Server using: " + MY_UUID_INSECURE);
}catch (IOException e){
Log.e(TAG, "AcceptThread: IOException: " + e.getMessage() );
}
mmServerSocket = tmp;
}
public void run(){
Log.d(TAG, "run: AcceptThread Running.");
BluetoothSocket socket = null;
try{
Log.d(TAG, "run: RFCOM server socket start.....");
socket = mmServerSocket.accept();
Log.d(TAG, "run: RFCOM server socket accepted connection.");
}catch (IOException e){
Log.e(TAG, "AcceptThread: IOException: " + e.getMessage() );
}
if(socket != null){
connected(socket,mmDevice);
}
Log.i(TAG, "END mAcceptThread ");
}
public void cancel() {
Log.d(TAG, "cancel: Canceling AcceptThread.");
try {
mmServerSocket.close();
} catch (IOException e) {
Log.e(TAG, "cancel: Close of AcceptThread ServerSocket failed. " + e.getMessage() );
}
}
}
private class ConnectThread extends Thread {
private BluetoothSocket mmSocket;
public ConnectThread(BluetoothDevice device, UUID uuid) {
Log.d(TAG, "ConnectThread: started.");
mmDevice = device;
deviceUUID = uuid;
}
public void run(){
BluetoothSocket tmp = null;
Log.i(TAG, "RUN mConnectThread ");
// Get a BluetoothSocket for a connection with the
// given BluetoothDevice
try {
Log.d(TAG, "ConnectThread: Trying to create InsecureRfcommSocket using UUID: "
+MY_UUID_INSECURE );
tmp = mmDevice.createRfcommSocketToServiceRecord(deviceUUID);
} catch (IOException e) {
Log.e(TAG, "ConnectThread: Could not create InsecureRfcommSocket " + e.getMessage());
}
mmSocket = tmp;
mBluetoothAdapter.cancelDiscovery();
try {
mmSocket.connect();
Log.d(TAG, "run: ConnectThread connected.");
} catch (IOException e) {
try {
mmSocket.close();
Log.d(TAG, "run: Closed Socket.");
} catch (IOException e1) {
Log.e(TAG, "mConnectThread: run: Unable to close connection in socket " + e1.getMessage());
}
Log.d(TAG, "run: ConnectThread: Could not connect to UUID: " + MY_UUID_INSECURE );
}
connected(mmSocket,mmDevice);
}
public void cancel() {
try {
Log.d(TAG, "cancel: Closing Client Socket.");
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "cancel: close() of mmSocket in Connectthread failed. " + e.getMessage());
}
}
}
public synchronized void start() {
Log.d(TAG, "start");
if (mConnectThread != null) {
mConnectThread.cancel();
mConnectThread = null;
}
if (mInsecureAcceptThread == null) {
mInsecureAcceptThread = new AcceptThread();
mInsecureAcceptThread.start();
}
}
public void startClient(BluetoothDevice device,UUID uuid){
Log.d(TAG, "startClient: Started.");
mProgressDialog = ProgressDialog.show(mContext,"Connecting Bluetooth"
,"Please Wait...",true);
mConnectThread = new ConnectThread(device, uuid);
mConnectThread.start();
}
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
Log.d(TAG, "ConnectedThread: Starting.");
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
try{
mProgressDialog.dismiss();
}catch (NullPointerException e){
e.printStackTrace();
}
try {
tmpIn = mmSocket.getInputStream();
tmpOut = mmSocket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run(){
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
String incomingMessage = new String(buffer, 0, bytes);
Intent IncomingMessageIntent = new Intent("incomingMessage");
IncomingMessageIntent.putExtra("theMessage",incomingMessage);
LocalBroadcastManager.getInstance(mContext).sendBroadcast(IncomingMessageIntent);
} catch (IOException e) {
Log.e(TAG, "write: Error reading Input Stream. " + e.getMessage() );
break;
}
}
}
public void write(byte[] bytes) {
String text = new String(bytes, Charset.defaultCharset());
Log.d(TAG, "write: Writing to outputstream: " + text);
try {
mmOutStream.write(bytes);
} catch (IOException e) {
Log.e(TAG, "write: Error writing to output stream. " + e.getMessage() );
}
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
private void connected(BluetoothSocket mmSocket, BluetoothDevice mmDevice) {
Log.d(TAG, "connected: Starting.");
// Start the thread to manage the connection and perform transmissions
mConnectedThread = new ConnectedThread(mmSocket);
mConnectedThread.start();
}
/**
* Write to the ConnectedThread in an unsynchronized manner
*
* @param out The bytes to write
* @see ConnectedThread#write(byte[])
*/
public void write(byte[] out) {
// Create temporary object
ConnectedThread r;
// Synchronize a copy of the ConnectedThread
Log.d(TAG, "write: Write Called.");
//perform the write
mConnectedThread.write(out);
}
}
Upvotes: 0
Views: 789
Reputation:
Your code seems to be based on BluetoothChat sample, depending you're trying to send, your code could be correct or totally incorrect.
If you try to send text to laptop, you'll have to make a Windows application (UWP, .NET, Win32, MFC, whatever you want to use) for rfcomm connections.
If you try to send files , you have 2 options.
If you try to send custom data, you'll have to make a Windows application (UWP, .NET, Win32, MFC, whatever you want to use) for rfcomm connections.
Upvotes: 1