大家好,这是我的第一个问题。 很抱歉,如果我犯了任何错误。(我在代码块中从蓝牙类中获取代码时遇到问题。如何在不花费20分钟复制粘贴的情况下解决这个问题?)
我遇到的问题可能是Android应用程序。
这是我学校的一个项目。我刚刚开始学习2个月前的安卓。
我创建了自己的类,它是一种蓝牙的外壳。 (基本上我都在学习蓝牙是如何工作的。)
我有1个测试活动,1个名为bluetooh(我的shell)。 以下是android开发人员的一个例子。 android bluetooth basics
我们有一个Acceptedthread作为服务器。 可以与AcceptedThread建立连接的ConnectThread。 如果他们连接,他们会得到一个bluetoohsocket。 使用这个bluetoothsocket,两个设备都可以通过此套接字启动Connectedthread。 关闭Accapthread和ConnectThread。
我遇到了一些问题。
2.如果我从设备a发送消息到b /然后从b发送1到/它通常有时不起作用。在它出错并退出申请之前。
3.欢迎提出如何做得更好的建议。不要退缩如果我做了一些非常愚蠢的事情,请叫我白痴。我对这种编程很新。
以下是代码。
AcceptThread:
public class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;
private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
private Handler mHandler;
private Bleutooth BT;
public AcceptThread(BluetoothAdapter Adapter,Handler handler,Bleutooth bt) {
// Use a temporary object that is later assigned to mmServerSocket,
// because mmServerSocket is final
mHandler = handler;
BT = bt;
BluetoothServerSocket tmp = null;
try {
// MY_UUID is the app's UUID string, also used by the client code
tmp = Adapter.listenUsingRfcommWithServiceRecord("menno/ruben/app",MY_UUID);
} catch (IOException e) { }
mmServerSocket = tmp;
}
public void run() {
Log.d("AcceptThreadlog","Accepthread Run Gestart");
BluetoothSocket socket = null;
// Keep listening until exception occurs or a socket is returned
while (true) {
try {
socket = mmServerSocket.accept();
} catch (IOException e) {
break;
}
// If a connection was accepted
if (socket != null) {
Log.d("AcceptThreadlog","ConnectedThread Gestart");
ConnectedThread mConnectedThread = new ConnectedThread(socket,mHandler);
mConnectedThread.start();
BT.HoldConnectThread(mConnectedThread);
try {
mmServerSocket.close();
} catch (IOException e) {
Log.d("AcceptThreadlog","ServerSocket close throwed IOexception");
}
break;
}
}
}
/** Will cancel the listening socket, and cause the thread to finish */
public void cancel() {
try {
mmServerSocket.close();
} catch (IOException e) { }
}
ConnectThread:
public class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
BluetoothAdapter adapter;
private Handler mHandler;
private Bleutooth BT;
private static final UUID MY_UUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
public ConnectThread(BluetoothDevice device,BluetoothAdapter adapter,Handler handler,Bleutooth bt) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BT = bt;
mHandler = handler;
BluetoothSocket tmp = null;
mmDevice = device;
// Get a BluetoothSocket to connect with the given BluetoothDevice
try {
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
} catch (IOException e) { }
mmSocket = tmp;
}
public void run() {
Log.d("ConnectThread","Run gestart");
// Cancel discovery because it will slow down the connection.
if (adapter != null) { adapter.cancelDiscovery();};
try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { Log.d("ConnectThread","IOexception opgetreden socket.close"); }
}
// Do work to manage the connection (in a separate thread)
Log.d("ConnectThread","ConnectedThread Gestart");
ConnectedThread mConnectedThread = new ConnectedThread(mmSocket,mHandler);
mConnectedThread.start();
BT.HoldConnectThread(mConnectedThread);
}
/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
ConnectedThread:
public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private Handler mHandler;
public ConnectedThread(BluetoothSocket socket,Handler handler)
{
mHandler = handler;
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
Message message = Message.obtain(mHandler);
// Keep listening to the InputStream until an exception occurs
// Bevestiging verbinding
Log.d("ConnectedThread","YES !!!!!!!!!");
message.what = 1;
message.arg1 = 1;
mHandler.sendMessage(message);
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
message.what = 1;
message.arg1 = 2;
String Test = new String(buffer);
Bundle bundle = new Bundle();
bundle.putString("test",Test);
message.setData(bundle);
mHandler.sendMessage(message);
} catch (IOException e) {
break;
}
}
}
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
测试活动:
public class BleutoothProftaakActivity extends Activity {
/** Called when the activity is first created. */
private Bleutooth BT;
private Handler mHandler;
ConnectedThread Connection = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mHandler = new Handler() {
@Override
synchronized public void handleMessage(Message msg)
{
if (msg.arg1 == 1 && msg.what == 1)
{
Toast T = Toast.makeText(getBaseContext(),"Verbinding gemaakt",10000);
T.show();
return;
}
if (msg.arg1 == 2 && msg.what == 1)
{
Bundle b = msg.getData();
String message = b.getString("test");
Toast T = Toast.makeText(getBaseContext(),message,10000);
T.show();
return;
}
}
};
BT = new Bleutooth(this);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Toast T = Toast.makeText(getBaseContext(),BT.CheckBleutoothStatus(),10000);
T.show();
}
});
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener(){
public void onClick(View v){
BT.TurnBleutoothOn();
}
});
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new OnClickListener(){
public void onClick(View v)
{
BT.DiscoverDevices();
} });
Button button9 = (Button) findViewById(R.id.button9);
button9.setOnClickListener(new OnClickListener(){
public void onClick(View v){
ArrayList<String> devicesfound = BT.GetFoundDevices();
if (devicesfound.isEmpty())
{
Toast T = Toast.makeText(getBaseContext(),"Geen Devices Gevonden",10000);
T.show();
}
else
{
for (int i = 0 ;i<devicesfound.size();i++)
{
Toast T = Toast.makeText(getBaseContext(),devicesfound.get(i),10000);
T.show();
}
}
}
});
Button button5 = (Button) findViewById(R.id.button5);
button5.setOnClickListener(new OnClickListener(){
public void onClick(View v){
ArrayList<String> devicesfound = BT.ReturnBondedDevices();
if (devicesfound.isEmpty())
{
Toast T = Toast.makeText(getBaseContext(),"Er zijn geen bonded devices",10000);
T.show();
}
else
{
for (int i = 0 ;i<devicesfound.size();i++)
{
Toast T = Toast.makeText(getBaseContext(),devicesfound.get(i),10000);
T.show();
}
}
}
});
Button button6 = (Button) findViewById(R.id.button6);
button6.setOnClickListener(new OnClickListener(){
public void onClick(View v){
BT.SetDiscoverable();
}
});
Button button7 = (Button) findViewById(R.id.button7);
button7.setOnClickListener(new OnClickListener(){
public void onClick(View v){
BT.StartServerSideConnection(mHandler);
}
});
Button button8 = (Button) findViewById(R.id.button8);
button8.setOnClickListener(new OnClickListener(){
public void onClick(View v){
BluetoothAdapter adapter = BT.GetAdapter();
ArrayList<String>devices = BT.ReturnBondedDevices();
BluetoothDevice adress = adapter.getRemoteDevice(devices.get(0));
BT.StartClientSideConnection(adress,mHandler);
}
});
Button button4 = (Button) findViewById(R.id.button4);
button4.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Connection = BT.ReturnConnectedThread();
if (Connection == null)
{
Toast T = Toast.makeText(getBaseContext(),"Er is geen verbinding",10000);
T.show();
}
else
{
String Test = "TESTESTTEST JIppie!!!!!";
byte[] bytearray = Test.getBytes();
Connection.write(bytearray);
}
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
BT.CleanUp();
}
我的蓝牙课程:
public class Bleutooth
{
BluetoothAdapter adapter;
Activity main;
BroadcastReceiver receiver;
ArrayList<String> founddevices;
boolean receiverRegistered;
AcceptThread mAcceptThread= null;
ConnectThread mConnectThread = null;
ConnectedThread mConnectedThread = null;
public Bleutooth(Activity Main)
{
adapter = BluetoothAdapter.getDefaultAdapter();
main = Main;
receiverRegistered = false;
founddevices = new ArrayList<String>();
}
public BluetoothAdapter GetAdapter(){
return adapter;
}
public void StartServerSideConnection(Handler handler){
// Cancel any thread attempting to make a connection
if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
// Start the thread to listen on a BluetoothServerSocket
if (mAcceptThread == null) {
mAcceptThread = new AcceptThread(adapter,handler,this);
mAcceptThread.start();
}
}
public void StartClientSideConnection(BluetoothDevice device,Handler handler){
//Cancel any thread attempting to make a connection
if (mConnectThread != null) {mConnectThread.cancel(); mConnectThread = null;}
// Cancel any thread currently running a connection
if (mConnectedThread != null) {mConnectedThread.cancel(); mConnectedThread = null;}
// Start the thread to listen on a BluetoothServerSocket
if (mConnectThread == null) {
mConnectThread = new ConnectThread(device,adapter,handler,this);
mConnectThread.start();
}
}
public void SetDiscoverable(){
Intent discoverableIntent =
new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
main.startActivity(discoverableIntent);
}
public String CheckBleutoothStatus(){
String returnString;
if (adapter == null)
{
returnString = "Geen bleutooth ondersteund";
}
else if(adapter.isEnabled())
{
returnString = "Bleutooth staat aan";
}
else
{
returnString = "Bleutooth staat uit";
}
return returnString;
}
public void TurnBleutoothOn(){
int REQUEST_ENABLE_BT = 1;
if (!adapter.isEnabled())
{
Intent enableBtIntent = new Intent(adapter.ACTION_REQUEST_ENABLE);
main.startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);
}
}
public ArrayList<String> ReturnBondedDevices() {
ArrayList<String> BondedDevices = new ArrayList<String>();
Set<BluetoothDevice> pairedDevices = adapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
BondedDevices.add(device.getAddress());
}
}
return BondedDevices;
}
public void DiscoverDevices(){
adapter.startDiscovery();
// Create a BroadcastReceiver for ACTION_FOUND
receiver = new BroadcastReceiver()
{
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action))
{
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
founddevices.add(device.getName() + "\n" + device.getAddress());
Toast T = Toast.makeText(main.getBaseContext(),"BleutoothDevice Gevonden",10000);
T.show();
}
}
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
main.registerReceiver(receiver, filter);
receiverRegistered = true;
}
public ArrayList<String> GetFoundDevices(){
return founddevices;
}
public void CleanUp(){ System.gc();
if (receiverRegistered)
{
main.unregisterReceiver(receiver);
}
if (mConnectedThread != null)
{
mConnectedThread.cancel();
}
adapter.cancelDiscovery();
System.gc();
}
public void HoldConnectThread(ConnectedThread mConnectedThread){
this.mConnectedThread = mConnectedThread;
}
public ConnectedThread ReturnConnectedThread(){
if (this.mConnectedThread != null)
{
return mConnectedThread;
}
else {return null;}
}
答案 0 :(得分:0)
我已经找到了答案。
我一遍又一遍地使用同样的信息。而且消息不喜欢那样。
通过现在像魅力一样创建新消息来解决问题。
感觉像白痴......