#実現させたいこと
androidから獲得したジャイロセンサーの値をnetcatを使いマックに連続して表示させたい。
#該当のコード
java
1 2import android.app.Activity; 3import android.content.Context; 4import android.hardware.Sensor; 5import android.hardware.SensorEvent; 6import android.hardware.SensorEventListener; 7import android.hardware.SensorManager; 8import android.os.AsyncTask; 9import android.os.Bundle; 10import android.view.SurfaceHolder; 11import java.io.BufferedWriter; 12import java.io.IOException; 13import java.io.OutputStream; 14import java.io.OutputStreamWriter; 15import java.net.Socket; 16import java.util.List; 17 18 19public class MainActivity extends Activity 20 implements SensorEventListener, SurfaceHolder.Callback{ 21 22 SensorManager mSensorManager; 23 Sensor mAccSensor; 24 25 float mVX; 26 float mVY; 27 28 29 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 36 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 37 mAccSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE); 38 39 40 /* Button btn = (Button) findViewById(R.id.Button01); 41 btn.setOnClickListener(new View.OnClickListener() { 42 @Override 43 public void onClick(View v) { 44 connect("koko"); 45 } 46 });*/ 47 48 } 49 50 @Override 51 protected void onStop() { 52 super.onStop(); 53 mSensorManager.unregisterListener(this); 54 } 55 56 @Override 57 protected void onResume() { 58 super.onResume(); 59 List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE); 60 if(sensors.size() > 0) { 61 Sensor s = sensors.get(0); 62 mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_UI); 63 } 64 } 65 66 public void connect(final String str) { 67 new AsyncTask<Void, Void, String>() { 68 69 70 @Override 71 protected String doInBackground(Void... voids) { 72 try { 73 74 Socket socket = new Socket("10.0.33.13",4000); 75 OutputStream os = socket.getOutputStream(); 76 77 BufferedWriter bufwriter 78 = new BufferedWriter(new OutputStreamWriter( os ) ); 79 bufwriter.write(str); 80 //bufwriter.newLine(); 81 bufwriter.flush(); 82 bufwriter.close(); 83 socket.close(); 84 85 86 87 } catch (IOException e) { 88 e.printStackTrace(); 89 } 90 return null; 91 } 92 }.execute(); 93 } 94 95 @Override 96 public void onSensorChanged(SensorEvent event) { 97 if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { 98 99 100 float y = event.values[1]; 101 float x = event.values[2]; 102 103 mVX = mVX + x; 104 mVY = mVY + y; 105 106 107 String str = "X:" + mVX +"\n" 108 + "Y:" + mVY +"\n"; 109 110 connect(str); 111 } 112 } 113 114 @Override 115 public void onAccuracyChanged(Sensor sensor, int accuracy) {//使わない 116 } 117 118 @Override 119 public void surfaceCreated(SurfaceHolder holder) { 120 registerSensor(); 121 } 122 123 public void registerSensor() { 124 mSensorManager.registerListener(this, mAccSensor, SensorManager.SENSOR_DELAY_GAME); 125 } 126 127 @Override 128 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 129 130 mVX = 0; 131 mVY = 0; 132 } 133 134 @Override 135 public void surfaceDestroyed(SurfaceHolder holder) { 136 mSensorManager.unregisterListener(this); 137 } 138} 139
onSensorChanged()でセンサーが獲得する値が変わるたびにconnect()は呼ばれるので連続に表示されると思いましたが一度だけ表示されるだけでうまくいきませんでした。
connect()の bufwriter.flush();が終了させているのでしょうか?
そもそもこの通信方法で連続して文字列を返すのはできませんか?
ご存知の方がいましたらご教授ください
#Server.java
java
1 2 3 4import java.io.BufferedReader; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.PrintWriter; 8 import java.net.InetSocketAddress; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 12public class Server { 13 public static void main(String[] args) { 14 // サーバーソケットを生成&待機 15 try { 16 ServerSocket server = new ServerSocket(); 17 server.bind(new InetSocketAddress("アドレス", ポート番号)); 18 try { 19 Socket socket = server.accept(); 20 BufferedReader reader = new BufferedReader( 21 new InputStreamReader(socket.getInputStream())); 22 PrintWriter writer = new PrintWriter( 23 socket.getOutputStream(), true); 24 // 入力を受け取ったら、大文字に変換の上で応答 25 while (true) { 26 String line = reader.readLine(); 27 if (line == "q") { 28 break; 29 } 30 31 writer.println(line.toUpperCase()); 32 System.out.println(line); 33 } 34 } catch (IOException e) { 35 e.printStackTrace(); 36 } 37 } catch (IOException e) { 38 e.printStackTrace(); 39 } 40 } 41}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/11/28 01:00
2017/11/28 06:41
退会済みユーザー
2017/11/28 07:26
退会済みユーザー
2017/11/28 07:30
2017/11/28 09:48 編集
2017/11/28 09:52
退会済みユーザー
2017/11/28 13:22