Watch開發(fā)的學(xué)習(xí)結(jié)構(gòu)

Watch開發(fā)的學(xué)習(xí)結(jié)構(gòu)

1. 創(chuàng)建Notification

2. 創(chuàng)建自定義的UI

3. 發(fā)送和同步數(shù)據(jù)

3.1訪問可穿戴數(shù)據(jù)層

調(diào)用數(shù)據(jù)層API,需創(chuàng)建如下實例:

mGoogleApiClient = new GoogleApiClient.Builder(this)
               .addApi(Wearable.API)
               .addOnConnectionFailedListener(this)
               .addConnectionCallbacks(this)
               .build(); 

第二步:建議在onResume方法中調(diào)用GoogleApiClient.connect()進行連接:

protected void onResume() {
       if (!mGoogleApiClient.isConnected()) {
            mGoogleApiClient.connect();
       }
       super.onResume();
  }

第三步:當我們退出當前界面扎狱,建議斷開連接:

@Override
 protected void onPause() {
     if (mGoogleApiClient.isConnected()) {
         mGoogleApiClient.disconnect();
     }
     super.onPause();
 }

完成上面三個步驟概耻,我們就完成了數(shù)據(jù)層客戶端的創(chuàng)建、連接和斷開哑芹。
客戶端連接時我們需要設(shè)置兩個監(jiān)聽器,一個是連接成功的監(jiān)聽,另一個是連接失敗的監(jiān)聽干茉。
實現(xiàn) GoogleApiClient.ConnectionCallbacks:

    #連接成功回調(diào)
    public void onConnected(@Nullable Bundle bundle) {
     }
     #連接暫停回調(diào)
     public void onConnectionSuspended(int i) {
        Log.e(TAG, "connect sucssed : "+i);
        mNode=null;
    }

實現(xiàn) GoogleApiClient.OnConnectionFailedListener:

    #連接失敗回調(diào)
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

當我們調(diào)用GoogleApiClient.connect()方法連接之后很泊,會調(diào)用以上回調(diào)角虫,反饋連接客戶端的結(jié)果沾谓,連接成功之后我們可以做一些操作,比如:獲取Node節(jié)點等戳鹅。

3.2 同步數(shù)據(jù)單元(Data Map 支持基本類型和String類型)

問題一:可穿戴設(shè)備作為發(fā)送方時響應(yīng)發(fā)送成功均驶,但是其實未成功。
發(fā)送數(shù)據(jù)(Data Map):

PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(COUNT_PATH);
                putDataMapRequest.getDataMap().putInt(COUNT_KEY, count++);

                PutDataRequest request = putDataMapRequest.asPutDataRequest();
                request.setUrgent();

                Log.i(TAG, "Generating DataItem: " + request);
                if (!mGoogleApiClient.isConnected()) {
                    return;
                }
                Wearable.DataApi.putDataItem(mGoogleApiClient, request)
                        .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                            @Override
                            public void onResult(DataApi.DataItemResult dataItemResult) {
                                if (!dataItemResult.getStatus().isSuccess()) {
                                    Log.e(TAG, "ERROR: failed to putDataItem, status code: "
                                            + dataItemResult.getStatus().getStatusCode());
                                }else{
                                    Log.e(TAG, "Success: "
                                            + dataItemResult.getStatus().getStatusCode());
                                }
                            }
                        });

接受數(shù)據(jù):
實現(xiàn)WearableListenerService服務(wù)的實現(xiàn)類

 public void onDataChanged(DataEventBuffer dataEvents) {
        Log.e(TAG, "onDataChanged: " + dataEvents);
        Log.d(TAG, "onDataChanged22: " + dataEvents+"--");
        // Loop through the events and send a message back to the node that created the data item.
        for (DataEvent event : dataEvents) {
            Uri uri = event.getDataItem().getUri();
            String path = uri.getPath();
            if (COUNT_PATH.equals(path)) {
                // Get the node id of the node that created the data item from the host portion of
                // the uri.
                String nodeId = uri.getHost();
                // Set the data of the message to be the bytes of the Uri.
                byte[] payload = uri.toString().getBytes();
                DataMap dataMap= DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
                Log.d(TAG, "updateCount: " +dataMap.getInt(COUNT_KEY));
                Log.d(TAG, "updateString: " +dataMap.getString(STRING_KEY));
            }
        }
    }

或者activity中實現(xiàn)DataApi.DataListener枫虏,客戶端連接成功后使用Wearable.DataApi.addListener(mGoogleApiClient, this);添加監(jiān)聽器妇穴。

3.3傳輸資源

本地資源轉(zhuǎn)化為Bitmap:

Bitmap bmp= BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);

Bitmap轉(zhuǎn)成Asset:

private static Asset toAsset(Bitmap bitmap) {
        ByteArrayOutputStream byteStream = null;
        try {
            byteStream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
            return Asset.createFromBytes(byteStream.toByteArray());
        } finally {
            if (null != byteStream) {
                try {
                    byteStream.close();
                } catch (IOException e) {
                    // ignore
                }
            }
        }
    }

然后使用Data Map 發(fā)送 Asset:

PutDataMapRequest dataMap = PutDataMapRequest.create(IMAGE_PATH);
        dataMap.getDataMap().putAsset(IMAGE_KEY, asset);
        dataMap.getDataMap().putLong("time", new Date().getTime());
        PutDataRequest request = dataMap.asPutDataRequest();
        request.setUrgent();

        Wearable.DataApi.putDataItem(mGoogleApiClient, request)
                .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(DataApi.DataItemResult dataItemResult) {
                        Log.e(TAG, "Sending image was successful: " + dataItemResult.getStatus()
                                .isSuccess());
                    }
                });

發(fā)送成功后處理回調(diào):

   public void onDataChanged(DataEventBuffer dataEventBuffer) {
        for (DataEvent event:dataEventBuffer){
            if (event.getType()==DataEvent.TYPE_CHANGED&&event.getDataItem().getUri().getPath().equals("/image")){
                DataMapItem dataMapItem=DataMapItem.fromDataItem(event.getDataItem());
                final Asset profileAsset=dataMapItem.getDataMap().getAsset("image");
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        final Bitmap bitmap=loadBitmapFromAsset(profileAsset);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (bitmap!=null&&mImageView!=null){
                                    mImageView.setImageBitmap(bitmap);
                                }
                            }
                        });
                    }
                }).start();

            }
        }
    }

loadBitmapFromAsset方法如下,并且必須在子線程中運行:

 public Bitmap loadBitmapFromAsset(Asset asset) {
        if (asset == null) {
            throw new IllegalArgumentException("Asset must be non-null");
        }
        ConnectionResult result =
                mGoogleApiClient.blockingConnect(5, TimeUnit.MILLISECONDS);
        if (!result.isSuccess()) {
            return null;
        }
        // convert asset into a file descriptor and block until it's ready
        InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
                mGoogleApiClient, asset).await().getInputStream();
        mGoogleApiClient.disconnect();

        if (assetInputStream == null) {
            Log.w(TAG, "Requested an unknown Asset.");
            return null;
        }
        // decode the stream into a bitmap
        return BitmapFactory.decodeStream(assetInputStream);
    }

以上步驟就能完成一個圖片的傳輸了模软。

3.4發(fā)送與接收消息

使用 MessageApi 發(fā)送消息伟骨,不像數(shù)據(jù)元的同步,Messages是單向交流機制燃异,這有利于遠程進程調(diào)用(RPC)携狭,比如:發(fā)送消息到可穿戴設(shè)備以開啟activity。
發(fā)送消息之前回俐,我們得先確定發(fā)送通知的節(jié)點逛腿,可通過兩種方法獲取:
方法一:

 private Collection<String> getNodes() {
        HashSet<String> results = new HashSet<>();
        NodeApi.GetConnectedNodesResult nodes =
                Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();

        for (Node node : nodes.getNodes()) {
            results.add(node.getId());
        }

        return results;
    }

通過廣播獲取節(jié)點:

 Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
            @Override
            public void onResult(NodeApi.GetConnectedNodesResult nodes) {
                for (Node node : nodes.getNodes()) {
                    mNode = node;
                }
            }
        });

發(fā)送消息如下:
發(fā)送消息之前先判斷是否有節(jié)點仅颇,或者是否客戶端連接

if(null!=mGoogleApiClient&&null!=mNode){
                    Wearable.MessageApi.sendMessage(mGoogleApiClient,mNode.getId(),START_ACTIVITY_PATH,new
                            byte[0]).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {


                        @Override
                        public void onResult(@NonNull MessageApi.SendMessageResult sendMessageResult) {
                            if (!sendMessageResult.getStatus().isSuccess()) {
                                Log.e("TAG", "Failed to send message with status code: "
                                        + sendMessageResult.getStatus().getStatusCode());

                            }else{
                                Log.i("TAG", " send message  成功");

                            }
                        }
                    });
                }

下面我們來說一下接收消息的兩種方法:
方法一:通過Activity實現(xiàn)MessageListener ,通過 MessageApi.addListener()添加和MessageApi.removeListener()刪除監(jiān)聽器单默。
方法二:通過繼承WearableListenerService的服務(wù)。
回調(diào)都是如下方法:

public void onMessageReceived(MessageEvent messageEvent) {
        LOGD(TAG, "onMessageReceived: " + messageEvent);
        Log.d(TAG, "onDataChanged22: " + messageEvent.getData());
        // Check to see if the message is to start an activity
        if (messageEvent.getPath().equals(START_ACTIVITY_PATH)) {
            Intent startIntent = new Intent(this, MainTestActivity.class);
            startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startIntent);
        }
    }

由此可知忘瓦,我們可以通過path來判斷我們的行為搁廓,通過可穿戴設(shè)備啟動手執(zhí)設(shè)備的界面。
messageEvent.getData()可以獲取我們傳輸?shù)臄?shù)據(jù)耕皮,記得byte[]數(shù)組轉(zhuǎn)化境蜕。

4. 創(chuàng)建表盤

5. 檢測位置

6. 請求權(quán)限

7. 使用語音

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凌停,隨后出現(xiàn)的幾起案子粱年,更是在濱河造成了極大的恐慌,老刑警劉巖罚拟,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件台诗,死亡現(xiàn)場離奇詭異,居然都是意外死亡赐俗,警方通過查閱死者的電腦和手機拉队,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阻逮,“玉大人氏仗,你說我怎么就攤上這事。” “怎么了皆尔?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長币励。 經(jīng)常有香客問我慷蠕,道長,這世上最難降的妖魔是什么食呻? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任流炕,我火速辦了婚禮,結(jié)果婚禮上仅胞,老公的妹妹穿的比我還像新娘每辟。我一直安慰自己,他們只是感情好干旧,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布渠欺。 她就那樣靜靜地躺著,像睡著了一般椎眯。 火紅的嫁衣襯著肌膚如雪挠将。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天编整,我揣著相機與錄音舔稀,去河邊找鬼。 笑死掌测,一個胖子當著我的面吹牛内贮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汞斧,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼夜郁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了断箫?” 一聲冷哼從身側(cè)響起拂酣,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仲义,沒想到半個月后婶熬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡埃撵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年赵颅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暂刘。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡饺谬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情募寨,我是刑警寧澤族展,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站拔鹰,受9級特大地震影響仪缸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜列肢,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一恰画、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓷马,春花似錦拴还、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至树瞭,卻和暖如春拇厢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晒喷。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工孝偎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凉敲。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓衣盾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爷抓。 傳聞我的和親對象是個殘疾皇子势决,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)蓝撇,斷路器果复,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 13,758評論 0 15
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,327評論 0 6
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司渤昌,掛了不少虽抄,但最終還是拿到小米、百度独柑、阿里迈窟、京東、新浪忌栅、CVTE车酣、樂視家的研發(fā)崗...
    時芥藍閱讀 42,239評論 11 349
  • 姓名:周小蓬 16019110037 轉(zhuǎn)載自:http://blog.csdn.net/YChenFeng/art...
    aeytifiw閱讀 34,721評論 13 425