MessageAPIでhandleからwearに値を送りたい
解決済
回答 1
投稿
- 評価
- クリップ 1
- VIEW 1,526
前提・実現したいこと
MessageAPIを利用して送信する方法が分からなくて詰まっています。
mobile\SubActivity.java内のIntsumKidoの値をwearに送るにはどうすればいいでしょうか。
先日SmartWatchを購入したばかりで勉強中です。
データの送受信について触れてみようと思っているのですが難しい…
Webでも調べたんですがpathやnodeの理解が浅いせいか、試行錯誤しても上手くいきませんでした。
mobile\SubActivity.java
package com.example.taka.wtf;
import android.app.Activity;
import android.os.Bundle;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.SurfaceTexture;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;
import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.MessageApi;
import com.google.android.gms.wearable.Node;
import com.google.android.gms.wearable.NodeApi;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
public class SubActivity extends Activity {
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CameraView view = new CameraView(this);
setContentView(view);
this.client = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Log.d("MyFragment", "onConnected");
}
@Override
public void onConnectionSuspended(int i) {
Log.d("MyFragment", "onConnectionSuspended");
}
})
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d("MyFragment", "onConnectionFailed");
}
})
.addApi(Wearable.API)
.build();
this.client.connect();
}
public class CameraView extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {
private Camera mCamera = null;
private SurfaceTexture mSurfaceTexture = null;
private static final int Width = 640;
private static final int Height = 480;
private int Buffer;
private float[] Kido;
private int str;
private static final int Width2 = 50;
private static final int Scope = 200;
private int strstr;
private int Start;
private Paint ShindenzuLine = new Paint();
private SurfaceHolder Holder = null;
private float sumKido = 0.0f;
private int frame = 0;
private int IntsumKido;
public CameraView(Context context) {
super(context);
ShindenzuLine.setColor(Color.rgb(0, 255, 0));
ShindenzuLine.setStrokeWidth(3);
ShindenzuLine.setStyle(Style.STROKE);
Holder = getHolder();
Holder.addCallback(this);
}
public void surfaceCreated(SurfaceHolder holder) {
Buffer = getWidth();
Kido = new float[Buffer];
str = (Buffer - Width2 * 2) / Scope;
mCamera = Camera.open();
try {
mSurfaceTexture = new SurfaceTexture(0);
mCamera.setPreviewTexture(mSurfaceTexture);
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
stopPreview();
Camera.Parameters params = mCamera.getParameters();
params.setPreviewSize(Width, Height);
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
Start = 0;
strstr = 0;
startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
stopPreview();
mCamera.release();
mCamera = null;
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
Kido[strstr % Buffer] = KidoKeisan(data);
strstr++;
Shindenzu();
}
private void startPreview() {
mCamera.setPreviewCallback(this);
mCamera.startPreview();
}
private void stopPreview() {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
}
private float KidoKeisan(byte[] data) {
for (int y = Height / 4; y < Height * 3 / 4; y++) {
for (int x = Width / 4; x < Width * 3 / 4; x++) {
sumKido += (float) (data[y * Width + x] & 0xff);
frame++;
}
}
sumKido /= frame;
IntsumKido = (int)sumKido;
return sumKido;
}
private void Shindenzu() {
int idx, idx_1;
Canvas canvas = Holder.lockCanvas();
if (canvas != null) {
canvas.drawColor(0, Mode.CLEAR);
if (strstr >= Scope) {
Start++;
}
for (int i = Start, x = 0; i < strstr - 1; i++, x++) {
idx = i % Buffer;
idx_1 = (i + 1) % Buffer;
canvas.drawLine(x * str + Width2, (Kido[idx] - 80) * 20, (x + 1) * str + Width2, (Kido[idx_1] - 80) * 20, ShindenzuLine);
}
Holder.unlockCanvasAndPost(canvas);
}
}
}
}
wear\MainActivity.java
package com.example.taka.wtf;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.wearable.DataApi;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
public class MainActivity extends Activity
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{
int gamenID = R.layout.rect_activity_main;
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rect_activity_main);
mGoogleApiClient = new GoogleApiClient
.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Wearable.API)
.build();
}
@Override
protected void onResume() {
super.onResume();
mGoogleApiClient.connect();
}
@Override
protected void onPause() {
super.onPause();
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
@Override
public void onConnected(Bundle bundle) {
Log.d("TAG", "onConnected");
}
@Override
public void onConnectionSuspended(int i) {
Log.d("TAG", "onConnectionSuspended");
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.e("TAG", "onConnectionFailed: " + connectionResult);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_MOVE){
if(gamenID == R.layout.rect_activity_main){
setContentView(R.layout.lill);
gamenID = R.layout.lill;
}
else if(gamenID == R.layout.lill){
setContentView(R.layout.resonance);
gamenID = R.layout.resonance;
}
else if(gamenID == R.layout.resonance){
setContentView(R.layout.stress);
gamenID = R.layout.stress;
}
else if(gamenID == R.layout.stress){
setContentView(R.layout.hi_stress);
gamenID = R.layout.hi_stress;
}
}
return super.onTouchEvent(event);
}
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
GoogleApiClientでコネクションは生成していますが
Messageを送る
受け取る
実装が無いですね
分からないので記述できないというのであれば、こちらに例がありますが
https://akira-watson.com/android/wear_messageapi.html
Message 送信ではThreadを立てて
public void run() {
NodeApi.GetConnectedNodesResult nodeResult = Wearable.NodeApi.getConnectedNodes(googleApiClient).await();
for (Node node : nodeResult.getNodes()) {
SendMessageResult result =
Wearable.MessageApi.sendMessage(googleApiClient, node.getId(), path, handheldMessage.getBytes()).await();
if (result.getStatus().isSuccess()) {
Log.d(TAG, "To: " + node.getDisplayName());
Log.d(TAG, "Message = " + handheldMessage );
}
else {
Log.d(TAG, "Send error");
}
}
}
初期のころはなかなかメッセージが送られず再送信なども必要でしたが、最近はバージョンアップされて多少良くなった感があります。
Wear側は
WearableListenerServiceを継承したクラスを作成して
onMessageReceived()でメッセージを受け取ります
そのメッセージはLocalBroadcastManagerを使って反映させるのがポイントでしょうか
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.21%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/07/11 15:55
回答をありがとうございました。