공부/Android

[Wearable DataLayer]모바일에서 안드로이드웨어로 이미지 여러장 전송하기!

JangGiraffe 2015. 6. 5. 11:08

모바일에서 웨어로 데이터를 전송하기 위해선 데이터 맵을 생성해 그 안에 데이터를 넣고 웨어로 전송하고 웨어에서 다시 데이터맵을 받으면 된다. 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) {
//
//                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
//
//                StrictMode.setThreadPolicy(policy);
//
//                }

 

error code 4003

WearableStatusCodes:  public static final int DATA_ITEM_TOO_LARGE

Indicates that the data item was too large to set.

데이터맵에 들어간 데이터들의 용량이 너무 커서 발생하는 문제입니다. 이미지 품질을 줄여서 용량을 줄여보세요

 

 

반응형