2016-12-29 79 views
0

我是新来的Java编程,我有一个问题。我在使用蓝牙的arduino汽车的控制器工作。该车有3个runnig模式:测试,汽车手册。我做了一个MainActivity,它有一个布局,每个模式有3个按钮,一个按钮连接用于蓝牙连接。在另一个活动SecondActivity,有另一种布局与控制汽车的方向和速度的按钮,但出人意料地mBluetooth.write不起作用。如何在其他活动中使用蓝牙传输数据?

这是在MainActivity:

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(); 
}} 

这是SecondActivity:

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; 

     } 
    }); 


}} 

我测试了蓝牙连接和代码按钮在一个活动和工作的罚款

回答

0

这可能做一个锻炼。 在MainActivity中使ConnectThread实例mBluetooth为静态。现在,它将充当类字段,并将保留其实例直到应用程序的整个生命周期。

下面是代码:

MainActivity.java

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(); 
}} 

SecondActivity.java

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; 

     } 
    }); 


}} 

希望这有助于。祝你好运!

0

读你的代码,我在第二个活动中发现:

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

什么意味着你正在创建另一个对象是中MainAvtivity创建不同的,所以这个新对象未连接。这就解释了为什么如果你在同一个MainActivity中使用同一个对象,那么这个方法的写入就会起作用

我建议你让这个对象静态并在secondActivity中使用它。所以去除

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

使静态mBluetooth对象MainActivity

Static ConnectThread mBluetooth = new ConnectThread(); 

,我们需要写的东西在SecondActivity使用

MainAcivity.mBluetooth.write(data); 

不建议在所有使物体静止的,而是如果它不是一个大应用程序是一个很好的解决方法。

希望这对你有所帮助!