2016-12-29 9 views
0

私はJavaプログラミングには新しく、問題があります。イムは、ブルートゥースを使用してarduino車のコントローラで働いています。車は3つの走行モード:テスト,自動マニュアルを持っています。私はMainActivityを作成し、すべてのモードとボタンに3つのボタンがあるレイアウトを持っています。をBluetooth接続用に接続します。別のアクティビティ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; 

     } 
    }); 


}} 

私は1つの活動でBluetooth接続とボタンのコードをテストし、このかもしれ細かい

答えて

0

を働きました運動であること。 ConnectThreadインスタンスmBluetoothをMainActivityに静的にします。今これはクラスフィールドとして動作し、アプリケーションのライフサイクル全体までそのインスタンスを保持します。ここで

はコードです:

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

私は2番目の活動で見つけ、あなたのコードを読む:あなたがMainAvtivityで作成と異なる別のオブジェクトを作成していることを意味するので、この新しいオブジェクトが接続されていない何

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

。これは、同じMainActivityで同じオブジェクトを使用すると、メソッドの書き込みが機能する理由を説明します。

このオブジェクトを静的にして、secondActivityで使用することをお勧めします。だから、

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

MainActivity

Static ConnectThread mBluetooth = new ConnectThread(); 

に静的mBluetoothオブジェクトを作成し、我々はあなたがそれがすべてでは推奨されません

MainAcivity.mBluetooth.write(data); 

を使用SecondActivityで何かを書くために必要なオブジェクトが静的作る除去するが、それは大きなアプリではない場合、良い回避策です。

希望があなたを助けよう!

関連する問題