2016-12-29 2 views
0

Ich bin neu in Java Programmierung und ich habe ein Problem. Ich arbeite an einem Controller für arduino Auto mit Bluetooth. Das Auto hat 3 Runnig-Modi: Test, Auto und Handbuch. Ich machte eine MainActivity, die ein Layout mit 3 Tasten für jeden Modus hat und eine Taste Connect für Bluetooth-Verbindung. In einer anderen Aktivität SecondActivity, die ein anderes Layout mit Tasten zur Steuerung der Richtung und Geschwindigkeit des Autos hat, aber überraschend mBluetooth.write funktioniert nicht.Wie übertragen Daten mit Bluetooth in einer anderen Aktivität?

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

Und das ist die 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; 

     } 
    }); 


}} 

ich den Code für Bluetooth-Verbindung und Tasten in einer Aktivität getestet und funktionierte gut

Antwort

0

Dies kann ein Training sein. Machen Sie die ConnectThread Instanz mBluetooth statisch in MainActivity. Jetzt wird dies als Klassenfeld fungieren und behält seine Instanz bis zum gesamten Lebenszyklus der App bei. Hier

ist der Code:

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; 

     } 
    }); 


}} 

Hoffnung, das hilft. Viel Glück!

0

Lesen Sie den Code ich in der zweiten Tätigkeit gefunden:

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

Was bedeutet, dass Sie ein anderes Objekt erstellen, die auf den in der MainAvtivity erstellt unterschiedlich ist, so dass dieses neue Objekt nicht verbunden. Dies erklärt, warum, wenn Sie dasselbe Objekt in derselben MainActivity verwenden, die Methode write funktioniert.

Ich schlage vor, Sie machen dieses Objekt statisch und verwenden Sie es in der secondActivity. So entfernen Sie die

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

in MainActivity statischen mBluetooth Objekt machen

Static ConnectThread mBluetooth = new ConnectThread(); 

und wir brauchen Sie etwas in SecondActivity schreiben verwenden

MainAcivity.mBluetooth.write(data); 

Es haupt nicht zu empfehlen ist, machen Objekt statisch, sondern Wenn es keine große App ist, ist das ein guter Workaround.

Hoffe, das hilft Ihnen!

Verwandte Themen