Android Wear手表面板设置主机上的内容

3
我目前开发了一个Android Wear手表表盘,但我现在想在主机应用程序上创建一个设置部分,以允许用户自定义手表表盘。由于我是新手,因此不确定正确的做法是什么。
是否有一种方法可以更新主机上的共享首选项,然后将其推送或同步到佩戴设备上的共享首选项?还是应该采用完全不同的方法来解决这个问题?
2个回答

14
您可以使用DataApiMessageApi来在手机和手表设备之间同步您的表盘配置。
请查看文档并选择更适合您需求的一个:
https://developer.android.com/training/wearables/data-layer/index.html https://developer.android.com/training/wearables/data-layer/data-items.html
https://developer.android.com/training/wearables/data-layer/messages.html

以下是一个使用DataApi的示例。
所有推送到DataApi的内容都在设备之间共享,可用于两个设备。您可以在双方设备上更改此数据,另一方将立即被通知到这种变化(当设备相互连接时)。您也可以随时读取此数据(例如,当用户在手表上选择您的表盘时,配置数据将已经等待您那里)。

在手机端:

public class WatchfaceConfigActivity extends Activity {
    private GoogleApiClient mGoogleApiClient;

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

        mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(new ConnectionCallbacks() {
                    @Override
                    public void onConnected(Bundle connectionHint) {
                    }
                    @Override
                    public void onConnectionSuspended(int cause) {
                    }
            })
            .addOnConnectionFailedListener(new OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(ConnectionResult result) {
                    }
                })
            .addApi(Wearable.API)
            .build();
        mGoogleApiClient.connect();
    }

每当您想要将新的配置与Android Wear设备同步时,您必须通过Wearable DataApi发送一个DataRequest:

    private void syncConfiguration() {
        if(mGoogleApiClient==null)
            return;

        final PutDataMapRequest putRequest = PutDataMapRequest.create("/CONFIG");
        final DataMap map = putRequest.getDataMap();
        map.putInt("mode", 1);
        map.putInt("color", Color.RED);
        map.putString("string_example", "MyWatchface");
        Wearable.DataApi.putDataItem(mGoogleApiClient,  putRequest.asPutDataRequest());
    }
}

在手表端:

您需要创建一个继承 WearableListenerService 的类:

public class DataLayerListenerService extends WearableListenerService {

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        super.onDataChanged(dataEvents);

        final List<DataEvent> events = FreezableUtils.freezeIterable(dataEvents);
        for(DataEvent event : events) {
            final Uri uri = event.getDataItem().getUri();
            final String path = uri!=null ? uri.getPath() : null;
            if("/CONFIG".equals(path)) {
                final DataMap map = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
                // read your values from map:
                int mode = map.getInt("mode");
                int color = map.getInt("color");
                String stringExample = map.getString("string_example");
            }
        }
    }
}

并在您的AndroidManifest中声明它:

<service android:name=".DataLayerListenerService" >
    <intent-filter>
        <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
    </intent-filter>
</service>

请注意,这只是一个使用示例。也许(而不是注册WearableListenerService的实例),直接在您的手表中创建mGoogleApiClient的实例并在那里添加一个DataListener会更好。
    Wearable.DataApi.addListener(mGoogleApiClient, new DataListener() {
        @Override
        public void onDataChanged(DataEventBuffer dataEvents) {
            // read config here and update the watchface
        }
    });

也许您不需要共享数据——那么您可以使用 MessageApi 进行通信,并仅在保存新配置或手表需要从手机读取当前配置时发送消息。

哇 - 谢谢您的回复!我本来期望能得到一两句话引导我思考,但您超出了我的预期。我会阅读您提供的链接和信息,并尝试着去实践! - user3842670
没问题。在研究这些文档后,考虑哪种解决方案更适合您的需求(因为每种情况都略有不同)。您始终可以将这些代码片段用作支持 :) - Maciej Ciemięga

1

从本质上讲,手机和手表模块之间没有共享的偏好设置,但是您可以发送消息和/或更新资产,侦听器将检测到这些更改。例如,每当您在手机上更改偏好设置时,您也可以使用Message API向手表发送消息。在手表上,您应该实现一个WearableListenerService,具有onMessageReceived方法,您可以在其中解析消息并采取适当的操作,例如,在手表上设置偏好。

请查看Android开发者培训指南: https://developer.android.com/training/wearables/data-layer/index.html


谢谢您的建议...这将让我朝着正确的方向前进! - user3842670

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接