无法将资产发送到 Android Wear 设备

2023-12-06

我正在尝试将资产发送到我的 Sony SmartWatch3。我遵循了谷歌的文档(https://developer.android.com/training/wearables/data-layer/assets.html)但它不起作用。

我的手持活动的代码:

public class MainActivityHandheld extends ActionBarActivity
{
    private GoogleApiClient mGoogleApiClient;
    private static final String MY_KEY = "com.example.andy.key.mykey";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_activity_handheld);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendDataToWearable();
            }
        });

        Log.i("ANDY", "mGoogleApiClient before creation -- Handheld");
        mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
                @Override
                public void onConnected(Bundle connectionHint) {
                    Log.d("tag", "onConnected: " + connectionHint);
                    // Now you can use the Data Layer API
                }

                @Override
                public void onConnectionSuspended(int cause) {
                    Log.d("tag", "onConnectionSuspended: " + cause);
                }
            })
            .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
                @Override
                public void onConnectionFailed(ConnectionResult result) {
                    Log.d("tag", "onConnectionFailed: " + result);
                }
            })
            // Request access only to the Wearable API
            .addApi(Wearable.API)
            .build();
        Log.i("ANDY", "mGoogleApiClient after creation -- Handheld");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("ANDY", "mGoogleApiClient before connect -- Handheld");
        mGoogleApiClient.connect();
        Log.i("ANDY", "mGoogleApiClient after connect -- Handheld");
    }

    @Override
    protected void onStop() {
        Log.i("ANDY", "mGoogleApiClient before disconnect -- Handheld");
        mGoogleApiClient.disconnect();
        Log.i("ANDY", "mGoogleApiClient after disconnect -- Handheld");
        super.onStop();
    }

    private void sendDataToWearable()
    {
        try 
        {
            Log.i("ANDY", "Before send -- Handheld");
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
            Asset asset = createAssetFromBitmap(bitmap);
            PutDataRequest request = PutDataRequest.create("/image");
            request.putAsset("profileImage", asset);
            Wearable.DataApi.putDataItem(mGoogleApiClient, request);
            Log.i("ANDY", "After send -- Handheld");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            Log.i("ANDY", "Exception -- Handheld : " + ex.getStackTrace().toString());
        }
    }

    private static Asset createAssetFromBitmap(Bitmap bitmap) {
        final ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteStream);
        return Asset.createFromBytes(byteStream.toByteArray());
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main_activity_handheld, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

我的可穿戴活动的代码:

public class MainActivityWear extends Activity implements
    DataApi.DataListener,
    GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {

private TextView mTextView;
private GoogleApiClient mGoogleApiClient;
private static final String MY_KEY = "com.example.andy.key.mykey";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity_wear);
    final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
    stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
        @Override
        public void onLayoutInflated(WatchViewStub stub) {
            mTextView = (TextView) stub.findViewById(R.id.text);
        }
    });

    Log.i("ANDY", "mGoogleApiClient before creation -- Wearable");
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            // Request access only to the Wearable API
            .addApi(Wearable.API)
            .build();
    Log.i("ANDY", "mGoogleApiClient after creation -- Wearable");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("ANDY", "mGoogleApiClient after connect (OnResume) -- Wearable");
    mGoogleApiClient.connect();
    Log.i("ANDY", "mGoogleApiClient after connect (OnResume) -- Wearable");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("ANDY", "mGoogleApiClient before removeListener & disconnect -- Wearable");
    Wearable.DataApi.removeListener(mGoogleApiClient, this);
    mGoogleApiClient.disconnect();
    Log.i("ANDY", "mGoogleApiClient after removeListener & disconnect -- Wearable");
}

@Override
public void onConnected(Bundle connectionHint) {
    Log.i("ANDY", "mGoogleApiClient before addListener -- Wearable");
    Wearable.DataApi.addListener(mGoogleApiClient, this);
    Log.i("ANDY", "mGoogleApiClient after addListener -- Wearable");
    // Now you can use the Data Layer API
}

@Override
public void onConnectionSuspended(int cause) {
    Log.d("tag", "onConnectionSuspended: " + cause);
}

@Override
public void onConnectionFailed(ConnectionResult result) {
    Log.d("tag", "onConnectionFailed: " + result);
}

@Override
public void onDataChanged(DataEventBuffer dataEvents) {

    Log.i("ANDY", "onDataChanged before boucle event -- Wearable");

    for (DataEvent event : dataEvents)
    {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            // DataItem changed
            DataItem item = event.getDataItem();
            if (item.getUri().getPath().compareTo("/image") == 0)
            {
                Log.i("ANDY", "onDataChanged before get Asset -- Wearable");
                DataMapItem dataMapItem = DataMapItem.fromDataItem(event.getDataItem());
                Asset profileAsset = dataMapItem.getDataMap().getAsset("profileImage");
                Bitmap bitmap = loadBitmapFromAsset(profileAsset);
                // Do something with the bitmap

                Log.i("ANDY", "onDataChanged after get Asset -- Wearable");

                try
                {
                    Log.i("ANDY", "onDataChanged before deserialize -- Wearable");
                    ArrayList<MyObject> myObjectArrayList = (ArrayList<MyObject>) Serializer.deserialize(array);
                    Log.i("ANDY", "onDataChanged after deserialize -- Wearable");
                }
                catch (Exception e) {
                    e.printStackTrace();
                    Log.i("ANDY", "onDataChanged exception -- Wearable :" + e.getStackTrace().toString());
                }
            }
        } else if (event.getType() == DataEvent.TYPE_DELETED) {
            // DataItem deleted
        }
    }
}

public Bitmap loadBitmapFromAsset(Asset asset) {
    if (asset == null) {
        throw new IllegalArgumentException("Asset must be non-null");
    }
    ConnectionResult result =
           mGoogleApiClient.blockingConnect(100, 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);
}
}

手持设备的代码执行正常(日志显示正确),但程序无法进入数据改变时的佩戴方法。但是,当我尝试发送整数而不是资产时,它工作正常:

PutDataRequest request = PutDataRequest.create("/array");
request.putInt("array", 90);
Wearable.DataApi.putDataItem(mGoogleApiClient, request);

有任何想法吗?我不明白发生了什么事。


这很棘手,但为了被调用,数据的内容必须改变。尝试将时间戳添加到 DataMap。例如。

PutDataMapRequest request = PutDataMapRequest.create("/image");
Asset asset = createAssetFromBitmap(bitmap);
request.putAsset("profileImage", asset);
DataMap dataMap = request.getDataMap(); 
dataMap.putLong("timestamp", System.currentTimeMillis());
PutDataRequest dataRequest = request.asPutDataRequest();      
Wearable.DataApi.putDataItem(mGoogleApiClient, dataRequest);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法将资产发送到 Android Wear 设备 的相关文章

随机推荐

  • 如何从一个输入标签添加/上传/选择多个文件?

    我来这里是为了知道如何从一个多个输入标签添加 上传 选择多个文件 但再次选择后所有先前的选择都被删除或覆盖 我想要的是 选择多个文件 将进行预览 确定完成 用户可以从预览中删除选择 将更多文件 图像添加到当前选择 您可以隐藏输入 type
  • ORDER BY 和WITH(行锁、UPDLOCK、READPAST)

    我需要使用一些 SQL 表来设置队列系统 如所描述的那样here 也就是说 因为我需要按不同的标准过滤队列项目 所以在我正在使用的存储过程中 BEGIN TRANSACTION CREATE TABLE Temp ID INT SOMEFI
  • PhoneGap - 存储图像,然后获取其 base64 编码数据

    我正在使用 PhoneGap Camera API 拍照并使用destinationType FILE URI 这部分正在发挥作用 随后我可以采用提供的路径并将其设置为 HTML 图像的 src 然后图像就会出现 稍后在代码中 我想抓取图像
  • 使用 GCloud KMS 生成加密密钥以访问私有存储库作为依赖项时出现错误

    我正在尝试使用此将加密的 ssh 密钥添加到 google KMS文档用于访问私有存储库作为 Google App Engine Node JS 项目 的依赖项 我已成功生成 Cloud KMS KeyRing 和 CryptoKey 但在
  • 如何处理CEdit在父窗体中的鼠标点击?

    我是 MFC 的新手 来自 C 和 Java 并且正在解决问题 考虑一个包含三个文本框的对话框 我已将 CEdit 子类化为 CMyEdit 并且三个文本框连接到对话框类中的 CMyEdit 变量 我想让对话框类 知道 何时用鼠标左键单击了
  • 转换以删除重复项并复制其余部分

    我希望输出 xml 根据属性 f 针对元素 c 进行分组 这是我的输入 xml 和 xslt 我希望该组仅出现一次 其他节点应按原样复制到输出 我尝试过的 xslt 复制了整个输入 xml 因此 如果有两个或多个具有 c 元素且 f 属性值
  • 缩放级别的任何更改都会导致我的所有标记重新出现在我的 Google 地图上

    缩放级别的任何更改都会导致自上次页面加载以来随时出现在地图上的所有标记出现在地图上 无论缩放级别更改是由于我的代码中的 setZoom 调用还是因为我操作缩放滑块 情况都是如此 我有一个地图控件小部件 其中带有按钮来添加对应于不同类别的标记
  • 通过简单的训练进行手写识别

    我一直在阅读 并尝试 之前答案中建议的 OCR 程序 但我仍然没有对我的问题给出明确的答案 我需要识别手写英文文本 文本将是多行 但每行只有一两个字长 该文本有时来自不同的人 我可以要求那个人提供一个培训文件 例如 包含字母和 0 9 数字
  • iOS:如何测量经过的时间,独立于时钟和时区的变化?

    为了测量我的应用程序运行时的持续时间 以及我的应用程序在后台空闲时经过的时间 我需要一个参考时钟 该参考时钟不会因用户更改其日历时钟的时间 日期而改变 我不能依赖 NSDate 因为当我的应用程序在后台运行时 用户可以更改它 不 拦截与此类
  • NSDate 延迟日期更改

    这可能是一个简单的解决方案 但有谁知道如何将 NSDate 更改延迟到午夜之后 任何见解都会非常有帮助 谢谢 Edit 我目前正在通过这种方式获取日期并显示基于当天的位置数据 但是 就像 NSDate 在逻辑上应该起作用一样 它会在午夜切换
  • 固定表单的位置

    我正在启动一个 winform 应用程序 NET 3 5 C 其中应用程序的主窗体从特定的指定位置启动 我为此在构造函数中调用以下代码 private void SetFormPosition this StartPosition Form
  • PHP Carbon,获取日期范围内的所有日期?

    如何在 PHP 中获取两个日期之间的所有日期 更喜欢使用 Carbon 来处理日期 from Carbon now to Carbon createFromDate 2017 5 21 我想获得这两个日期之间的所有日期 但是如何呢 只能使用
  • mousemoved 事件中的 Javafx 滑块值

    我正在制作一个媒体播放器 并尝试在将鼠标悬停在滑块上时获取光标位置处的播放滑块值 为了尝试做到这一点 我使用了以下内容 timeSlider addEventFilter MouseEvent MOUSE MOVED event gt Sy
  • 我可以使用 jQuery 淡入淡出颜色吗?

    我有 javascript 可以使用如下函数更改一些 HTML if correct true ft2 html Correct ft2 css color Green ft2 css border color Green else ft2
  • PHP脚本输出的AJAX持续响应

    我的 PHP 脚本的 AJAX 响应有问题 我创建了 Status div 我想在其中输出 PHP 脚本的响应 它工作得很好 但是只有当整个脚本完成时才会显示响应 我想 实时 输出每个回声 这是我的文件 form php div class
  • 在PHP中,如何检测是从CLI模式执行还是通过浏览器执行? [复制]

    这个问题在这里已经有答案了 我有一个通用脚本 我将其包含在我的 PHPcron 文件和通过浏览器访问的文件中 代码的某些部分 我只需要非 cron 文件 我如何检测执行是从 CLI 还是通过浏览器 我知道可以通过使用 cron 文件传递 一
  • Git LFS git lfs migrate import 包括 .gitattribute 中指定的所有文件类型?

    我安装了 git lfs 并创建了一个 gitattribute 文件 其中包含许多要跟踪的文件类型 我现在想对 gitattribute 中指定的所有文件类型运行 git lfs migrate 命令 我怎样才能做到这一点 我发现的所有源
  • 页面上的某些控件对于 MS UI Automation 不可见

    我们有一个带有 StartPage xaml 的应用程序 其中 TabControl 的控件模板定义了一些网格和堆栈面板 该模板中的 xaml 中间有一个 itemPresenter 其下方有一个堆栈面板 虽然它对用户来说工作得很好 但 M
  • 检查 Hashable 一致性

    我有一些结构符合的基本协议 模型 它们也符合 Hashable protocol Model struct Contact Model Hashable var hashValue Int return static func lhs Co
  • 无法将资产发送到 Android Wear 设备

    我正在尝试将资产发送到我的 Sony SmartWatch3 我遵循了谷歌的文档 https developer android com training wearables data layer assets html 但它不起作用 我的