Arduino Uno Communicatorというサードパーティアプリを使って、USBシリアル通信でAndroidタブレットからArduinoボードにデータを送るアプリを作っています。View を拡張する DrawView という Java ファイルがあります。このクラスを使用すると、基本的にパスを描画し、パスからポイントを収集し、それらのポイントを文字列に配置してから、MainActivity で静的メソッドを呼び出し、文字列をそのメソッドに渡すことができます。この部分の私のコードは次のようになります。
public class DrawView extends View
{
MainActivity mActivity = new MainActivity();
private String waypoints;
//declare variables here...
public DrawView(Contex context, AttributeSet attrs)
{
super(context, attrs);
//setup my paint, canvas and path here...
}
@Override
public onDraw(Canvas canvas)
{
//draw canvas here...
}
public boolean onTouchEvent(MotionEvent event)
{
//declare variables...
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
//start adding to waypoints string...
return true;
case MotionEvent.ACTION_MOVE:
//add to waypoints
break;
case MotionEvent.ACTION_UP:
//pass string to static method called main in MainActivity
mActivity.main(waypoints);
break;
default:
return false;
}
return true;
}
}
文字列を MainActivity のメイン メソッドに渡した後、メイン メソッドは MainActivity 内の send という別のメソッドを呼び出します。以前はメインメソッドから送信できると思っていましたが、静的メソッドでなければならないのでできません。したがって、次のように MainActivity のインスタンスを作成して、非静的メソッドを呼び出します。
public class MainActivity extends Activity {
private final static String DATA_RECEIVED_INTENT = "primavera.arduino.intent.action.DATA_RECEIVED";
private final static String SEND_DATA_INTENT = "primavera.arduino.intent.action.SEND_DATA";
private final static String DATA_EXTRA = "primavera.arduino.intent.extra.DATA";
DrawView drawView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
drawView = new DrawView(this, null);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}
public static void main(String in) {
MainActivity d = new MainActivity();
d.send(in);
}
private void send(String in) {
byte[] data = in.getBytes();
Intent intent = new Intent(SEND_DATA_INTENT);
intent.putExtra(DATA_EXTRA, data);
sendBroadcast(intent);
}
}
すべてのメソッドが正しく呼び出されていることを確認しました。ウェイポイント文字列は正しいです。機能していないように見える唯一のことは、意図をブロードキャストすることです。DrawView ファイルでメイン メソッドが呼び出される部分にコメントを付けて、画面にボタンを配置し、ボタンに次のコードを配置すると、次のようになります。
public void buttonSend (View view) {
byte[] data = "Hello".getBytes();
Intent intent = new Intent(SEND_DATA_INTENT);
intent.putExtra(DATA_EXTRA, data);
sendBroadcast(intent);
}
文字列は問題なく送信されます。