Android蓝牙应用程序进程被杀死

时间:2012-11-03 15:24:26

标签: android bluetooth connection

我对android的编程非常新。我有两个类:main和btmanager。当我尝试在手机上测试我的应用程序时,我得到的是一个过程被杀死的信息。我究竟做错了什么 ?

代码实施:

主要课程:

public class MainActivity extends Activity {

BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

Btmanager manager;


@Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (bluetooth == null)
    {
        Toast.makeText(this, "Bluetooth is not enabled on this device", Toast.LENGTH_LONG).show();
        System.exit(0);
    }


}

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

    if (!bluetooth.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, 2);
    }

    manager.run();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}




public void closeApp (View view)
{
    System.exit(0);
}
}

Btmanager课程:

public class Btmanager extends Thread {

private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice;
public static final UUID myUUID = UUID.fromString("0x1101");
BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();

public Btmanager(BluetoothDevice device) {
    // Use a temporary object that is later assigned to mmSocket,
    // because mmSocket is final
    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(myUUID);
    } catch (IOException e) { }
    mmSocket = tmp;
}

public void run() {
    // Cancel discovery because it will slow down the connection
    bluetooth.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) { }
        return;
    }

}

/** Will cancel an in-progress connection, and close the socket */
public void cancel() {
    try {
        mmSocket.close();
    } catch (IOException e) { }
}

2 个答案:

答案 0 :(得分:2)

我在您的代码中看到的2个问题:

  1. 您没有实例化Btmanager对象,当您拨打null时,它仍为run。 (会导致NullPointerException - 您的应用会崩溃)。
  2. 您调用run方法而不是start的{​​{1}}方法。如果您希望Btmanager方法中的代码在新线程中运行,则必须调用run。调用start会使其在相同的主题中运行。这会阻止您的UI线程,如果它阻塞太久,可能会导致您的应用崩溃。

答案 1 :(得分:0)

对于测试purporses,我不使用BTmanager类 - 在onStart()方法中我添加了带有连接实现的新线程,但仍然没有任何结果 - 应用程序崩溃。

public void onStart()
{
    super.onStart();

    if (!bluetooth.isEnabled()) {
        Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBtIntent, 2);
    }


    new Thread(new Runnable() 
    {
        public void run() 
        {
            try {
                //Create a Socket connection: need the server's UUID number of registered
                socket = device.createRfcommSocketToServiceRecord(myUUID);

                socket.connect();
                Log.d("EF-BTBee", "Connectted");
            }
            catch (IOException e)
            {
                Log.e("EF-BTBee", "Error : ", e);
            }
        }
    }).start();


}