こんにちは、これは私の最初の質問です。 私はミスをするのであれば申し訳ありません。(私はトラブルコードブロック内の私のbluetoothclassからコードを取得したのです。どのように私は20分を費やすことなく、これを修正するか貼り付けをコピー?)Bluetooth Androidアプリケーションに関する問題。初心者
私が午前問題は、5月のアンドロイドであります応用。
これは私の学校のプロジェクトです。私は2ヶ月前にアンドロイドを学び始めました。
私は自分のクラスを作成しました。これは、Bluetoothのシェルの一種です。 (基本的に私はブルートゥースの仕組みを学びます)。
私は1つのテスト用のアクティビティ、1クラスのbluetooh(私のシェル)を持っています。 アンドロイドデベロッパーの例に続いて3つのスレッドがあります。 android bluetooth basics
サーバーとして機能するAcceptedthreadがあります。 AcceptThreadと接続できるConnectThreadです。 接続すると、bluetoohsocketを取得します。 このBluetoothソケットでは、両方のデバイスがこのソケットでConnectedthreadを開始します。 AccapthreadとConnectThreadを閉じる。
私はいくつか問題があります。
- 私は接続してテストメッセージを送信できます。 1台のデバイスからはバグが出る前に3回しか送信できません。他のデバイスは、必要な数のメッセージを受け入れることができます(動作します)。
2.If iデバイスaからb /にメッセージを送信し、bからa /に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) { }
}
TestActivity:
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();
}
私のBluetoothクラス:
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;}
}