切换活动时如何保持蓝牙连接?

时间:2016-03-30 12:26:54

标签: java android bluetooth

我不能为我的生活找出如何在切换活动时使用服务来保持我的蓝牙连接处于活动状态。我试图将一些命令发送到OBD2适配器。所以我无法做到这一点,因为蓝牙连接已经消失。我在MainActivity中有BTHandler来处理Service的gui。我不知道这是否会干扰public class BTHandler { public static final int STATE_NONE = 0; // we're doing nothing public static final int STATE_CONNECTING = 2; // now initiating an outgoing connection public static final int STATE_CONNECTED = 3; // now connected to a remote device final ArrayList<String> devices = new ArrayList(); private final Handler mHandler; private BluetoothAdapter mAdapter; private BluetoothDevice device; private ConnectThread mConnectThread; private ConnectedThread mConnectedThread; private BluetoothSocket socket; private String status; private int mState; private boolean connectionStatus = false; public BTHandler(Context context, Handler handler) { // Konstruktor mAdapter = BluetoothAdapter.getDefaultAdapter(); mHandler = handler; } public void write(String s) { mConnectedThread.sendRawCommand(s); Log.v("write", "write"); } /* public void write(byte[] bytes) { try { mmOutStream.write(bytes); } catch (IOException e) { } } */ public void connect(String deviceAddress) { mConnectThread = new ConnectThread(deviceAddress); mConnectThread.start(); } private void guiHandler(int what, int arg1, String obj) { Message msg = mHandler.obtainMessage(); msg.what = what; msg.obj = obj; msg.arg1 = arg1; msg.sendToTarget(); } private class ConnectThread extends Thread { BluetoothSocket tmp = null; private BluetoothSocket mmSocket; public ConnectThread(String deviceAddress) { mAdapter = BluetoothAdapter.getDefaultAdapter(); device = mAdapter.getRemoteDevice(deviceAddress); BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter(); BluetoothDevice device = mAdapter.getRemoteDevice(deviceAddress); UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); try { tmp = device.createRfcommSocketToServiceRecord(uuid); //socket.connect(); //Log.v("connect", "connect"); } catch (IOException e) { //e.printStackTrace(); //Log.v("exception", "e"); } mmSocket = tmp; } public void run() { // Cancel discovery because it will slow down the connection mAdapter.cancelDiscovery(); byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; try { // Connect the device through the socket. This will block // until it succeeds or throws an exception mmSocket.connect(); Log.v("connect", "connect"); } catch (IOException connectException) { // Unable to connect; close the socket and get out try { mmSocket.close(); Log.v("close", "close"); } catch (IOException closeException) { } guiHandler(Constants.TOAST, Constants.SHORT, "Connection Failed"); return; } guiHandler(Constants.CONNECTION_STATUS, Constants.STATE_CONNECTED, ""); mConnectedThread = new ConnectedThread(mmSocket); mConnectedThread.start(); } } private class ConnectedThread extends Thread { private final BluetoothSocket mmSocket; private final InputStream mmInStream; private final OutputStream mmOutStream; private ObdMultiCommand multiCommand; public ConnectedThread(BluetoothSocket socket) { connectionStatus = true; mmSocket = socket; InputStream tmpIn = null; OutputStream tmpOut = null; try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { } mmInStream = tmpIn; mmOutStream = tmpOut; try { //RPMCommand engineRpmCommand = new RPMCommand(); //SpeedCommand speedCommand = new SpeedCommand(); ModuleVoltageCommand voltageCommand = new ModuleVoltageCommand(); while (!Thread.currentThread().isInterrupted()) { //engineRpmCommand.run(mmInStream, mmOutStream); //(socket.getInputStream(), socket.getOutputStream()); //speedCommand.run(mmInStream, mmOutStream); //(socket.getInputStream(), socket.getOutputStream()); voltageCommand.run(socket.getInputStream(), socket.getOutputStream()); // TODO handle commands result //Log.d("Log", "RPM: " + engineRpmCommand.getFormattedResult()); //Log.d("Log", "Speed: " + speedCommand.getFormattedResult()); Log.v("Log", "Voltage: " + voltageCommand.getFormattedResult()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run() { byte[] buffer = new byte[1024]; // buffer store for the stream int bytes; // bytes returned from read() OBDcmds(); // Keep listening to the InputStream until an exception occurs while (connectionStatus) { sendMultiCommand(); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } // CALL this to MainActivity public void sendRawCommand(String command) { try { new OdbRawCommand(command); } catch (Exception e) { Log.v("sendRawCommand", "e"); } } private void OBDcmds() { // execute commands try { new EchoOffCommand().run(socket.getInputStream(), socket.getOutputStream()); new LineFeedOffCommand().run(socket.getInputStream(), socket.getOutputStream()); new TimeoutCommand(100).run(socket.getInputStream(), socket.getOutputStream()); new SelectProtocolCommand(ObdProtocols.AUTO).run(socket.getInputStream(), socket.getOutputStream()); //ISO_15765_4_CAN } catch (Exception e) { Log.v("OBDcmds", "e"); // handle errors } } /* // Call this from the main activity to send data to the remote device public void write(byte[] bytes) { try { mmOutStream.write(bytes); } catch (IOException e) { } } */ /* Call this from the main activity to shutdown the connection */ public void cancel() { try { mmSocket.close(); } catch (IOException e) { } } public void sendMultiCommand() { try { // RUN some code here } catch (Exception e) { } } } } 如果创建了?

感谢任何帮助!

由于

BTHandler

public class SPA extends AppCompatActivity implements View.OnClickListener {
    Button b2;
    BTHandler btHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(this, MyService.class));
        setContentView(R.layout.activity_sp);
        b2 = (Button) findViewById(R.id.getValue);
        b2.setOnClickListener(this);
    }

    public void onClick(View v) {
        int id = v.getId();
        String voltage = ("AT RV");

        switch (id) {
            case R.id.getValue:
                btHandler.write(voltage);
                Log.v("Log", "getValue" + voltage);
                break;
        }
    }
}

SPA

public class MyService extends Service {

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        Toast.makeText(this, "The new Service was Created", Toast.LENGTH_SHORT).show();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // For time consuming an long tasks you can launch a new thread here...
        // Do your Bluetooth Work Here
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
        return Service.START_NOT_STICKY;
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();

    }
}

为MyService

private Handler mHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case Constants.MESSAGE_STATE_CHANGE:
                    switch (msg.arg1) {
                        case BTHandler.STATE_CONNECTED:
                            //setContentView(R.layout.activity_connected);
                            Intent intent = new Intent(MainActivity.this, Connected.class);
                            startActivity(intent);
                            Toast.makeText(getApplicationContext(), R.string.title_connected_to, Toast.LENGTH_SHORT).show();
                            Log.v("Log", "Connected");
                            break;
                        case BTHandler.STATE_NONE:
                            Toast.makeText(getApplicationContext(), R.string.title_not_connected, Toast.LENGTH_SHORT).show();
                            break;
                    }
            }
        }
    };

MainActivity中的处理程序

JTable

0 个答案:

没有答案