모바일에서 웨어로 데이터를 전송하기 위해선 데이터 맵을 생성해 그 안에 데이터를 넣고 웨어로 전송하고 웨어에서 다시 데이터맵을 받으면 된다. Google에서 이와 관련된 API를 제공하고 있다.
#모바일
//wear Initialize
// Build a new GoogleApiClient for the Wearable API
GoogleApiClient googleClient;
googleClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
------------------------------------------------------------------------------------------------
// 시계로 전송할 데이터 묶음인 데이터 맵을 생성한다. 여기서 설정하는 PATH값을 웨어에서 확인해서 데이터를 받는다.
PutDataMapRequest dataMap = PutDataMapRequest.create("/STRING_DATA_PATH");
for(int i =0; i<이미지 갯수;i++){
dataMap.getDataMap().putByteArray("key"+i,바이트로 변환한 bitmap 데이터);
}
dataMap.getDataMap().putInt("stepCount",이미지 갯수); // step의 수를 dataMap에 삽입.
// 데이터 맵으로 전송할 요청 객체를 생성한다.
PutDataRequest request = dataMap.asPutDataRequest();
// 데이터 전송 및 전송 후 실행 될 콜백 함수 지정
Wearable.DataApi.putDataItem(googleClient, request).setResultCallback(resultCallback);
-------------------------------------------------------------------------------------------
// 시계로 데이터 및 메시지를 전송 후 실행되는 메소드
private ResultCallback resultCallback = new ResultCallback() {
@Override
public void onResult(Result result) {
String resultString = "Sending Result : " + result.getStatus();
//Toast.makeText(getApplication(), resultString, Toast.LENGTH_SHORT).show();
}
};
-------------------------------------------------------------------------------------------
#웨어
리스너 서비스를 이용해서 웨어 앱이 실행돼 있지 않더라도 앱이 동작하도록 해줬다. 받은 데이터를 intent로 웨어의 MainActivity로 넘겨준다.
//wear Initialize
private GoogleApiClient mGoogleApiClient; // 구글 플레이 서비스 API 객체
//웨어러블리스너 서비스는 앱이 실행되 있지 않더라도 데이터가 변경되거나 메시지를 수신할 때 이를 감지할 수 있는것.
public class ListenerService extends WearableListenerService {
String[] receiveString;
int receiveCount;
int currentPage;
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
// 데이터 이벤트 횟수별로 동작한다.
for (DataEvent event : dataEvents) {
// 데이터 변경 이벤트일 때 실행된다.
if (event.getType() == DataEvent.TYPE_CHANGED) {
// 동작을 구분할 패스를 가져온다.
String path = event.getDataItem().getUri().getPath();
// 패스가 문자 데이터 일 때
if (path.equals("/STRING_DATA_PATH")) {
//앱을 실행시킨다.
Intent startIntent = new Intent(this, MainActivity.class);
// 이벤트 객체로부터 데이터 맵을 가져온다.
DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
// 데이터맵으로부터 수신한 데이터를 가져온다.
receiveCount = dataMapItem.getDataMap().getInt("stepCount");
for(int i=0;i<receiveCount;i++){
receiveByte = dataMapItem.getDataMap().getByteArray("stepImage"+i);
startIntent.putExtra("receiveImage"+i,receiveByte);
}
startIntent.putExtra("receiveCount",receiveCount);
startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startIntent);
}
// 데이터 삭제 이벤트일 때 실행된다.
} else if (event.getType() == DataEvent.TYPE_DELETED) {
// 데이터가 삭제됐을 때 수행할 동작
}
}
}
}
---------------------------------------------------------------------------------------------
일어날 수 있는 문제들 !
NetworkOnMainThreadException 에러!
//URL로부터 이미지를 불러오는 코드가 안먹히는 이유는 네트워크 작업이 UI 쓰레드(메인스레드)에서 동작하기 때문이다.
// 안드로이드 3.0 이후버젼부터는 UI쓰레드에 부담이 가는 것을 막기 위해 별도의 쓰레드에서 처리하도록 원천적으로 막아놨다.
// 해결방법은 아래 내용을 추가해주면 된다.
// if(android.os.Build.VERSION.SDK_INT > 9) { |
error code 4003
WearableStatusCodes: public static final int DATA_ITEM_TOO_LARGE
Indicates that the data item was too large to set.
데이터맵에 들어간 데이터들의 용량이 너무 커서 발생하는 문제입니다. 이미지 품질을 줄여서 용량을 줄여보세요