【问题标题】:Data is not Synced between Watch Emulator and Android PhoneWatch Emulator 和 Android 手机之间的数据不同步
【发布时间】:2016-12-09 12:53:44
【问题描述】:

我正在尝试将手表与模拟器同步我已正确执行步骤并将手机与手表连接。到目前为止,我可以通过手机更改表盘并处理一些通知。我已经创建了我的应用程序的表盘,我不会在我的手表上显示温度。

这是我将数据与手表同步的代码:

private void connectToWatchFace() {
        Log.d(LOG_TAG, "connectToWatchFace()");
        mGoogleApiClient = new GoogleApiClient.Builder(getContext())
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        mGoogleApiClient.connect();
    }

    private void sendDataToWatchFace(double highTemperature, double lowTemperature, int weatherConditionId) {
        Log.d(LOG_TAG, "sendDataToWatchFace()");
        PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/sunshine").setUrgent();

        putDataMapRequest.getDataMap().putDouble("high_temperature", highTemperature);
        putDataMapRequest.getDataMap().putDouble("low_temperature", lowTemperature);
        putDataMapRequest.getDataMap().putLong("timestamp", new Date().getTime());
        Log.d(LOG_TAG, "High Temperature: " + highTemperature + " " + "Low Temperature: " + lowTemperature);

        int drawableResourceId = Utility.getIconResourceForWeatherCondition(weatherConditionId);
        Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), drawableResourceId);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 80, byteArrayOutputStream);
        Asset asset = Asset.createFromBytes(byteArrayOutputStream.toByteArray());
        putDataMapRequest.getDataMap().putAsset("icon", asset);

        PutDataRequest putDataRequest = putDataMapRequest.asPutDataRequest();
        Wearable.DataApi.putDataItem(mGoogleApiClient, putDataRequest)
                .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                    @Override
                    public void onResult(@NonNull DataApi.DataItemResult dataItemResult) {
                        if (dataItemResult.getStatus().isSuccess()) {
                            Log.d(LOG_TAG, "dataItemResult.getStatus().isSuccess()");
                        } else {
                            Log.d(LOG_TAG, "NOT dataItemResult.getStatus().isSuccess()");
                        }
                    }
                });
    }

这是我从手机接收数据的代码。

 @Override
        public void onDataChanged(DataEventBuffer dataEventBuffer) {
            Log.d(TAG, "onDataChanged()");
            for (DataEvent dataEvent : dataEventBuffer) {
                DataItem dataItem = dataEvent.getDataItem();

                String path = dataItem.getUri().getPath();
                Log.d(TAG, "path: " + path);
                if (path.equals("/sunshine")) {
                    DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();

                    mHighTemperature = dataMap.getDouble("high_temperature");
                    mLowTemperature = dataMap.getDouble("low_temperature");
                    Log.d(TAG, "high temperature: " + mHighTemperature + ", low temperature: " + mLowTemperature);
                    Asset iconAsset = dataMap.getAsset("icon");
                    if (iconAsset != null) {
                        new SunshineWatch.Engine.LoadBitmapAsyncTask().execute(iconAsset);
                    }
                    // Force UI update
                    invalidate();
                }
            }
        }

        private class LoadBitmapAsyncTask extends AsyncTask<Asset, Void, Bitmap> {

            @Override
            protected Bitmap doInBackground(Asset... params) {
                if (params.length > 0 && params[0] != null) {
                    Asset asset = params[0];
                    InputStream assetInputStream = Wearable.DataApi.getFdForAsset(
                            mGoogleApiClient, asset).await().getInputStream();

                    if (assetInputStream == null) {
                        Log.w(TAG, "Requested an unknown Asset.");
                        return null;
                    }
                    return BitmapFactory.decodeStream(assetInputStream);
                } else {
                    Log.e(TAG, "Asset must be non-null");
                    return null;
                }
            }

            @Override
            protected void onPostExecute(Bitmap bitmap) {
                if (bitmap != null) {
                    Log.d(TAG, "onPostExecute bitmap is NOT null");
                    mIconBitmap = Bitmap.createScaledBitmap(
                            bitmap,
                            getResources().getDimensionPixelSize(R.dimen.icon_width_height),
                            getResources().getDimensionPixelSize(R.dimen.icon_width_height),
                            false
                    );
                    invalidate();
                } else {
                    Log.d(TAG, "onPostExecute bitmap is NULL");
                }
            }
        }

    }

我也没有在 LOGCAT 中找到任何结果。我正在使用播放服务版本 10.0.0

【问题讨论】:

    标签: android android-emulator wear-os android-wear-data-api


    【解决方案1】:

    请检查并确保您已经拥有最新版本的Google Play services

    including the correct libraries 中所述,作为项目向导的一部分,正确的依赖项会为您导入到相应模块的build.gradle 文件中。

    要使用 Wea​​rable Data Layer API 在可穿戴设备和手持设备之间同步和发送数据,您需要最新版本的 Google Play 服务。如果您不使用这些 API,请从两个模块中删除依赖项。

    此外,您还需要确保在同步时已建立连接。有时,模拟器可能会喜怒无常,要么不同步所有内容,要么随机断开连接。这应该很少见,但如果发生这种情况,请按照article 中的说明重新启动该过程。

    您可能还想查看本教程以获取更多信息:

    【讨论】:

    • 我正在使用最新的 Google Play Services 10.0.0
    • W/GooglePlayServicesUtil:Google Play 服务已过期。需要 10084000 但找到 9841574 12-12 13:17:20.030 2750-2750/com.sagar.sunshine D/SunshineWatch: onConnectionFailedConnectionResult{statusCode=SERVICE_VERSION_UPDATE_REQUIRED, resolution=null, message=null}
    【解决方案2】:

    在 gradle 中使用 compileSdkVersion 23。 Android Wear 目前与 API 23 兼容。

    【讨论】:

      【解决方案3】:

      通过开发 Android 可穿戴应用程序,当可穿戴设备无法到达手机时,我遇到了不同的情况。下面的问题列表有助于确定根本原因

      • 它们是否通过蓝牙配对?
      • 是否在设备上转发端口?
      • 可穿戴设备能看到节点吗?
      • 紧急标志是否打开以立即同步?
      • 数据是否缓存在设备端,只是不同步未失效的数据?
      • 您用于从缓存中获取数据的可穿戴 uri 格式是否与“wear://node_id/resource_path”匹配?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 2012-08-21
        • 2015-06-04
        相关资源
        最近更新 更多