Как передавать данные с помощью bluetooth в другой деятельности?

Я новичок в программировании java, и у меня есть проблема. Im работая на регуляторе для автомобиля arduino используя bluetooth. Автомобиль имеет 3 режима runnig: тестовый, автоматический и ручной . Я сделал MainActivity, который имеет макет с 3 кнопками для каждого режима и кнопкой подключения для подключения bluetooth. В другом activity SecondActivity, который имеет другую компоновку с кнопками для управления направлением и скоростью автомобиля, но удивительно mBluetooth.написать не работает.

Это главное:

public class MainActivity extends AppCompatActivity {

ImageButton test, manual,connect;
Button back;

private BluetoothAdapter mbluetoothAdapter;
protected AlertDialog.Builder builder;
ConnectThread mBluetooth = new ConnectThread();
String mBluetoothName = "";
String mBluetoothAdress = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final Context context = this;
    //final LayoutInflater factory = getLayoutInflater();
    //final View textEntryView = factory.inflate(R.layout.activity_main);
    builder = new AlertDialog.Builder(this);
    mbluetoothAdapter = BluetoothAdapter.getDefaultAdapter();


    connect = (ImageButton) findViewById(R.id.connect);
    test = (ImageButton) findViewById(R.id.test);
    manual = (ImageButton) findViewById(R.id.manual);


    test.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context,SecondActivity.class );
            context.startActivity(intent);
        }

    });
    manual.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context,SecondActivity.class );
            context.startActivity(intent);
        }

    });
    connect.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!mbluetoothAdapter.isEnabled()) {
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivity(enableBtIntent);
            } else {
                if (!mBluetooth.mBluetoothAddress.equals("")) {//if another connection is already exits then close it first
                    stopAllActivities();
                } else {
                    try {
                        Intent serverIntent = new Intent(MainActivity.this, DeviceListActivity.class);
                        startActivityForResult(serverIntent, Helper.REQUEST_CONNECT_DEVICE);
                    } catch (Exception e) {
                        showToast(getString(R.string.errorOccured) + ": " + e.getMessage());
                        e.printStackTrace();
                    }
                }
            }
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case Helper.REQUEST_CONNECT_DEVICE:
            if (resultCode == Activity.RESULT_OK) {
                mBluetoothName = data.getExtras().getString(Helper.EXTRA_BLUETOOTH_NAME);
                mBluetoothAdress = data.getExtras().getString(Helper.EXTRA_BLUETOOTH_ADDRESS);

                // setBluetoothInfo();
                showToast(R.string.connectedDevice + mBluetoothName);

                if (!mBluetoothAdress.equals("")) {
                    if (!mBluetooth.connect(mBluetoothAdress)){


                    }
                }
            }
            break;
    }
}

private void showToast(String message) {
    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}

private void stopAllActivities() {
    mBluetooth.write("S"); //send Stop Signal before it closes the connection

    mBluetooth.mBluetoothAddress = ""; // reset address
    mBluetooth.close();//close Connection

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    //getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    return super.onOptionsItemSelected(item);
}

@Override
public void onPause() {
    if (mbluetoothAdapter != null) {
        if (mbluetoothAdapter.isDiscovering()) {
            mbluetoothAdapter.cancelDiscovery();
        }
    }
    super.onPause();
}}

И это уже второй случай.:

public class SecondActivity extends AppCompatActivity {
final Context context = this;
Button back;
ImageButton btnup, btndown, btnright, btnleft;
ConnectThread mBluetooth = new ConnectThread();//??????

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

    back = (Button) findViewById(R.id.back);
    back.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(context, MainActivity.class);
            context.startActivity(intent);
        }

    });

    btnup = (ImageButton) findViewById(R.id.btnup);
    btndown = (ImageButton) findViewById(R.id.btndown);
    btnleft = (ImageButton) findViewById(R.id.btnleft);
    btnright = (ImageButton) findViewById(R.id.btnright);
    final TextView direction = (TextView) findViewById(R.id.text_direction);
    final TextView steering = (TextView) findViewById(R.id.steering_direction);
    final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);

    btndown.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mBluetooth.write("2");
                direction.setText(R.string.Backwards);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                mBluetooth.write("x");
                direction.setText(R.string.blank);
            }


            return false;

        }
    });
    btnup.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mBluetooth.write("8");
                direction.setText(R.string.Forward);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                mBluetooth.write("z");
                direction.setText(R.string.blank);
            }


            return false;

        }
    });

    btnright.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mBluetooth.write("6");
                steering.setText(R.string.Right);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                mBluetooth.write("c");
                steering.setText(R.string.none);
            }


            return false;

        }
    });
    btnleft.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                mBluetooth.write("4");
                steering.setText(R.string.Left);
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                mBluetooth.write("v");
                steering.setText(R.string.none);
            }


            return false;

        }
    });


}}

Я протестировал код для подключения bluetooth и кнопок в одном действии и работал хорошо

2 ответа

  1. Это может быть тренировка.
    Сделайте ConnectThreadэкземпляр mBluetoothстатическим в MainActivity. Теперь это будет действовать как поле класса и сохранит свой экземпляр до всего жизненного цикла приложения.

    Вот код:

    MainActivity.Ява

    public class MainActivity extends AppCompatActivity {
    
    ImageButton test, manual,connect;
    Button back;
    
    private BluetoothAdapter mbluetoothAdapter;
    protected AlertDialog.Builder builder;
    //Static instance declaration
    public static ConnectThread mBluetooth;
    String mBluetoothName = "";
    String mBluetoothAdress = "";
    
    //Static block to initialise static instance
    static{
        mBluetooth=new ConnectThread();
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Context context = this;
        //final LayoutInflater factory = getLayoutInflater();
        //final View textEntryView = factory.inflate(R.layout.activity_main);
        builder = new AlertDialog.Builder(this);
        mbluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    
    
        connect = (ImageButton) findViewById(R.id.connect);
        test = (ImageButton) findViewById(R.id.test);
        manual = (ImageButton) findViewById(R.id.manual);
    
    
        test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context,SecondActivity.class );
                context.startActivity(intent);
            }
    
        });
        manual.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context,SecondActivity.class );
                context.startActivity(intent);
            }
    
        });
        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mbluetoothAdapter.isEnabled()) {
                    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivity(enableBtIntent);
                } else {
                    if (!mBluetooth.mBluetoothAddress.equals("")) {//if another connection is already exits then close it first
                        stopAllActivities();
                    } else {
                        try {
                            Intent serverIntent = new Intent(MainActivity.this, DeviceListActivity.class);
                            startActivityForResult(serverIntent, Helper.REQUEST_CONNECT_DEVICE);
                        } catch (Exception e) {
                            showToast(getString(R.string.errorOccured) + ": " + e.getMessage());
                            e.printStackTrace();
                        }
                    }
                }
            }
        });
    }
    
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case Helper.REQUEST_CONNECT_DEVICE:
                if (resultCode == Activity.RESULT_OK) {
                    mBluetoothName = data.getExtras().getString(Helper.EXTRA_BLUETOOTH_NAME);
                    mBluetoothAdress = data.getExtras().getString(Helper.EXTRA_BLUETOOTH_ADDRESS);
    
                    // setBluetoothInfo();
                    showToast(R.string.connectedDevice + mBluetoothName);
    
                    if (!mBluetoothAdress.equals("")) {
                        if (!mBluetooth.connect(mBluetoothAdress)){
    
    
                        }
                    }
                }
                break;
        }
    }
    
    private void showToast(String message) {
        Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
    }
    
    private void stopAllActivities() {
        mBluetooth.write("S"); //send Stop Signal before it closes the connection
    
        mBluetooth.mBluetoothAddress = ""; // reset address
        mBluetooth.close();//close Connection
    
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
    
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void onPause() {
        if (mbluetoothAdapter != null) {
            if (mbluetoothAdapter.isDiscovering()) {
                mbluetoothAdapter.cancelDiscovery();
            }
        }
        super.onPause();
    }}
    

    Второе.Ява

    public class SecondActivity extends AppCompatActivity {
    final Context context = this;
    Button back;
    ImageButton btnup, btndown, btnright, btnleft;
    //Declare a static reference from MainActivity class
    ConnectThread mBluetooth = MainActivity.mBluetooth;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        back = (Button) findViewById(R.id.back);
        back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(context, MainActivity.class);
                context.startActivity(intent);
            }
    
        });
    
        btnup = (ImageButton) findViewById(R.id.btnup);
        btndown = (ImageButton) findViewById(R.id.btndown);
        btnleft = (ImageButton) findViewById(R.id.btnleft);
        btnright = (ImageButton) findViewById(R.id.btnright);
        final TextView direction = (TextView) findViewById(R.id.text_direction);
        final TextView steering = (TextView) findViewById(R.id.steering_direction);
        final Chronometer chronometer = (Chronometer) findViewById(R.id.chronometer);
    
        btndown.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mBluetooth.write("2");
                    direction.setText(R.string.Backwards);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mBluetooth.write("x");
                    direction.setText(R.string.blank);
                }
    
    
                return false;
    
            }
        });
        btnup.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mBluetooth.write("8");
                    direction.setText(R.string.Forward);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mBluetooth.write("z");
                    direction.setText(R.string.blank);
                }
    
    
                return false;
    
            }
        });
    
        btnright.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mBluetooth.write("6");
                    steering.setText(R.string.Right);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mBluetooth.write("c");
                    steering.setText(R.string.none);
                }
    
    
                return false;
    
            }
        });
        btnleft.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    mBluetooth.write("4");
                    steering.setText(R.string.Left);
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    mBluetooth.write("v");
                    steering.setText(R.string.none);
                }
    
    
                return false;
    
            }
        });
    
    
    }}
    

    Надеюсь, это поможет. Удачи!

  2. Чтение кода, найденного во втором действии:

    ConnectThread mBluetooth = new ConnectThread(); //??????
    

    Что значит вы создаете другой объект, который отличается от созданного в MainAvtivity, поэтому этот новый объект не подключили. Это объясняет, почему при использовании того же объекта в том же MainActivity работает метод write.

    Я предлагаю сделать этот объект статичным и использовать его в secondActivity. Так извлекайте

    ConnectThread mBluetooth = new ConnectThread(); //??????
    

    сделать статический объект mBluetooth в MainActivity

    Static ConnectThread mBluetooth = new ConnectThread();
    

    а нам нужно что-то написать в SecondActivity use

    MainAcivity.mBluetooth.write(data);
    

    Не рекомендуется вообще делать объект статическим, но если это не большое приложение, это хороший обходной путь.

    Надеюсь это поможет вам!