{"id":4389,"date":"2015-09-25T08:00:04","date_gmt":"2015-09-24T23:00:04","guid":{"rendered":"http:\/\/www.skyarch.net\/blog\/?p=4389"},"modified":"2015-09-25T08:16:31","modified_gmt":"2015-09-24T23:16:31","slug":"androidwear%e3%81%a8amazon-api-gateway%e3%81%a7github-follower%e3%82%92%e8%a6%8b%e3%81%88%e3%82%8b%e5%8c%96","status":"publish","type":"post","link":"https:\/\/www.skyarch.net\/blog\/androidwear%e3%81%a8amazon-api-gateway%e3%81%a7github-follower%e3%82%92%e8%a6%8b%e3%81%88%e3%82%8b%e5%8c%96\/","title":{"rendered":"AndroidWear\u3068Amazon API Gateway\u3067Github Follower\u6570\u3092\u898b\u3048\u308b\u5316"},"content":{"rendered":"<h1>\u76ee\u7684<\/h1>\n<p>\u69d8\u3005\u306a\u30b5\u30fc\u30d3\u30b9\u4e0a\u306eAPI\u3067\u53d6\u5f97\u3067\u304d\u308b\u6570\u5024\u30c7\u30fc\u30bf\u7b49\u3092\u4e00\u5143\u7684\u306b\u7ba1\u7406\u3057\u305f\u4e0a\u3067AndroidWear\u306b\u8868\u793a\u3057\u305f\u3044\u3002<br \/>\n\u65b0\u305f\u306b\u5229\u7528\u3057\u305fAPI\u304c\u5897\u3048\u305f\u308a\u3001\u5909\u66f4\u3055\u308c\u305f\u6642\u306b\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30b3\u30b9\u30c8\u3092\u4f4e\u304f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9762\u3092\u62c5\u4fdd\u3057\u305f\u4e0a\u3067Android\u5074\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7c21\u5358\u306a\u7269\u306b\u3059\u308b\u305f\u3081\u306b\u4eca\u5e74\u306e7\u6708\u306b\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u3063\u305fAmazon API Gateway\u3092\u5229\u7528\u3059\u308b\u3002(\u65e5\u672c\u30ea\u30fc\u30b8\u30e7\u30f3\u306f\u307e\u3060\u672a\u5bfe\u5fdc)<\/p>\n<h1>\u95a2\u9023\u8a18\u4e8b<\/h1>\n<ul>\n<li><a href=\"http:\/\/www.skyarch.net\/blog\/?p=4341\">AndroidWear Huawei Watch\u306e\u7c21\u6613\u30ec\u30d3\u30e5\u30fc<\/a><\/li>\n<li><a href=\"http:\/\/www.skyarch.net\/blog\/?p=4371\">AndroidWear Huawei Watch\u3067WatchFace\u3092\u4f5c\u6210<\/a><\/li>\n<li>AndroidWear\u3068Amazon API Gateway\u3067Github Follower\u3092\u898b\u3048\u308b\u5316 \u2190 \u73fe\u5728\u3053\u3061\u3089\u306e\u8a18\u4e8b<\/li>\n<li><a href=\"http:\/\/www.skyarch.net\/blog\/?p=4416\">Amazon API Gateway\u3092\u5229\u7528\u3057Android\u30a2\u30d7\u30ea\u304b\u3089\u7c21\u5358\u306bWeb\u4e0a\u306eAPI\u3092\u53e9\u304f\u65b9\u6cd5<\/a><\/li>\n<\/ul>\n<h1>\u52d5\u4f5c\u6982\u8981\u56f3<\/h1>\n<p>AndroidWear\u304c\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u4e0a\u306e\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3059\u308b\u306b\u306f\u3001\u89aa\u6a5f\u3092\u7d4c\u7531\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u305f\u3081\u3001\u89aa\u6a5f\u3067Amazon API Gateway\u3078\u30a2\u30af\u30bb\u30b9 -> Wear\u306b\u53d6\u5f97\u3057\u305f\u30c7\u30fc\u30bf\u3092message\u3068\u3057\u3066\u9001\u4fe1\u3068\u3044\u3046\u5168\u4f53\u50cf\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u672c\u6765\u3067\u3042\u308c\u3070wear\u5074\u304b\u3089\u5b9a\u671f\u7684\u306bmobile\u5074\u3078\u60c5\u5831\u66f4\u65b0\u8981\u6c42\u3092\u51fa\u3057\u3001wear\u5074\u3078\u9001\u4fe1\u3084 mobile\u5074\u304b\u3089node\u304c\u5b58\u5728\u3059\u308c\u3070wear\u5074\u3078\u5b9a\u671f\u7684\u306b\u9001\u4fe1\u7b49\u51e6\u7406\u3092\u5b9f\u88c5\u3057\u3066\u5b8c\u6210\u306b\u81f3\u308b\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u901a\u4fe1\u53ef\u80fd\u306aWatchFace\u4f5c\u6210\u65b9\u6cd5\u306e\u60c5\u5831\u304c\u82f1\u8a9e\u30fb\u65e5\u672c\u8a9e\u5171\u306b\u5c11\u306a\u304b\u3063\u305f\u306e\u3067\u3001\u571f\u53f0\u90e8\u5206\u306e\u5b9f\u88c5\u306e\u307f\u3072\u3068\u307e\u305a\u30c7\u30e2\u7684\u306b\u52d5\u3044\u305f\u306e\u3067\u516c\u958b\u81f4\u3057\u307e\u3059\u3002<\/p>\n<a href=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/c26676b7b0f238657f8966f074631d94.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/c26676b7b0f238657f8966f074631d94.png\" alt=\"\u30b7\u30b9\u30c6\u30e0\u30fb\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u56f3\u8cc7\u6599\u7528 2\" width=\"1024\" height=\"733\" class=\"aligncenter size-full wp-image-4390\" srcset=\"https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/c26676b7b0f238657f8966f074631d94.png 1024w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/c26676b7b0f238657f8966f074631d94-300x215.png 300w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/c26676b7b0f238657f8966f074631d94-900x644.png 900w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a>\n<h2>Amazon API Gateway\u306e\u5229\u7528<\/h2>\n<p>Android\u5074\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067HTTP\u30ea\u30af\u30a8\u30b9\u30c8\u7d44\u307f\u7acb\u3066\u305f\u308a\u8907\u6570\u306eAPI\u7ba1\u7406\u304c\u9762\u5012\u3060\u306a\u3001\u3001\u3001\u3068\u8003\u3048\u305f\u6642\u306bAPI\u3092\u307e\u3068\u3081\u3066\u7ba1\u7406\u51fa\u6765\u3066\u3001Android\/iOS\/Javascript\u7528\u306eAPI\u30a2\u30af\u30bb\u30b9\u30e9\u30a4\u30d6\u30e9\u30ea\/SDK\u3092\u5410\u304d\u51fa\u3057\u3066\u304f\u308c\u308b\u300cAmazon API Gateway\u300d\u304c\u982d\u3092\u3088\u304e\u308a\u307e\u3057\u305f\u306e\u3067\u5229\u7528\u3057\u3066\u307f\u307e\u3057\u305f\u3001\u307b\u3093\u306e\u89e6\u308a\u3067\u30d7\u30ed\u30af\u30b7\u6a5f\u80fd\u3057\u304b\u4f7f\u3063\u3066\u304a\u308a\u307e\u305b\u3093\u304c\u975e\u5e38\u306b\u77ed\u3044\u30b3\u30fc\u30c9\u3067\u884c\u3051\u305f\u306e\u3067\u5229\u7528\u3057\u306a\u3044\u624b\u306f\u7121\u3044\u3068\u601d\u3044\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u308c\u307e\u3067\u30a4\u30de\u30a4\u30c1\u4f7f\u3044\u51e6\u304c\u898b\u3048\u306b\u304f\u304b\u3063\u305f Lambda \u304cAPI Gateway\u3068\u306e\u7d44\u307f\u5408\u308f\u305b\u3067\u8272\u3005\u4f7f\u3048\u308b\u304b\u306a\u3041\u3068\u611f\u3058\u3066\u304a\u308a\u307e\u3059\u3002\u4e0b\u8a18\u3092\u4eca\u5f8c\u5b9f\u65bd\u3057\u3066\u307f\u308b\u4e88\u5b9a\u3001\u3001\u3001<br \/>\nAPI Gateway -> Lambda -> SNS -> Android\u7aef\u672b\u7b49\u3078\u901a\u77e5\/Twilio \u7b49\u3005<\/p>\n<h2>Android Wear\u3078\u306e\u30c7\u30fc\u30bf\u9001\u4fe1<\/h2>\n<p>\u4e0b\u8a18\u65b9\u6cd5\u3067 mobile\u5074\u304b\u3089 wear\u306b\u30c7\u30fc\u30bf\u3092\u9001\u4fe1\u3057 WatchFace\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059<\/p>\n<h3>mobile\u5074\u51e6\u7406<\/h3>\n<ul>\n<li>\u30a2\u30d7\u30ea\u8d77\u52d5\u6642\u306bGoogleApiClient\u3092\u5229\u7528\u53ef\u80fd\u306b\u3059\u308b<\/li>\n<li>\u901a\u4fe1\u53ef\u80fd\u306a\u7aef\u672b\u3092 getNodes \u3067\u53d6\u5f97<\/li>\n<li>GoogleApiClient \u306e sendMessage \u3067 Wear\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1<\/li>\n<\/ul>\n<h3>wear\u5074\u51e6\u7406<\/h3>\n<ul>\n<li>Message\u3092\u53d7\u4fe1\u3059\u308b\u3068 DataLayerListenerService \u306e onMessageReceived \u304c\u547c\u3073\u51fa\u3055\u308c\u308b<\/li>\n<li>Preferences\u306b\u53d7\u4fe1\u3057\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u5185\u5bb9\u3092\u66f8\u304d\u8fbc\u307f<\/li>\n<li>WatchFace \u306e \u63cf\u753b\u90e8\u5206\u3067Preference\u3088\u308a\u53d6\u5f97\u3057\u305f\u5024\u3092\u8868\u793a<\/li>\n<\/ul>\n<h1>\u5b8c\u6210\u54c1<\/h1>\n<p>\u6bcd\u8266\u3067Refresh\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u5f0a\u793e\u306e\u73fe\u5728\u306egithub follower\u6570\u304cWatchFace\u306b\u8868\u793a\u3055\u308c\u307e\u3059<br \/>\n<a href=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/thumb_IMG_3281_1024.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/thumb_IMG_3281_1024.jpg\" alt=\"thumb_IMG_3281_1024\" width=\"679\" height=\"618\" class=\"aligncenter size-full wp-image-4392\" srcset=\"https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/thumb_IMG_3281_1024.jpg 679w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/thumb_IMG_3281_1024-300x273.jpg 300w\" sizes=\"auto, (max-width: 679px) 100vw, 679px\" \/><\/a><\/p>\n<h1>Android Studio\u3067\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210<\/h1>\n<p>Mobile \/ Wear\u4e21\u65b9\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u4ed8\u3051\u305f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<br \/>\n2\u3064\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8de8\u3050\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u306b\u3064\u3044\u3066\u306f\u3001New Module -> Common\u7b49\u306e\u540d\u524d\u3067\u4f5c\u6210\u3057dependencies\u306e\u8a2d\u5b9a\u3092\u4e0b\u8a18\u306e\u3088\u3046\u306b\u884c\u3044\u307e\u3059\u3002<\/p>\n<a href=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway06.png\" alt=\"API_Gateway06\" width=\"1022\" height=\"486\" class=\"aligncenter size-full wp-image-4395\" srcset=\"https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway06.png 1022w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway06-300x143.png 300w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway06-900x428.png 900w\" sizes=\"auto, (max-width: 1022px) 100vw, 1022px\" \/><\/a>\n<a href=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway07.png\" alt=\"API_Gateway07\" width=\"806\" height=\"669\" class=\"aligncenter size-full wp-image-4396\" srcset=\"https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway07.png 806w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway07-300x249.png 300w\" sizes=\"auto, (max-width: 806px) 100vw, 806px\" \/><\/a>\n<h1>Amazon API Gateway\u306e\u8a2d\u5b9a<\/h1>\n<p>API Gateway \u306e\u8a73\u7d30\u8a2d\u5b9a\u306f\u5225\u8a18\u4e8b\u3068\u3057\u307e\u3057\u305f\u4e0b\u8a18\u3092\u53c2\u8003\u306b\u4e0b\u3055\u3044<br \/>\n<a href=\"http:\/\/www.skyarch.net\/blog\/?p=4416\">Amazon API Gateway\u3092\u5229\u7528\u3057Android\u30a2\u30d7\u30ea\u304b\u3089\u7c21\u5358\u306bWeb\u4e0a\u306eAPI\u3092\u53e9\u304f\u65b9\u6cd5<\/a><\/p>\n<p>\u4e0b\u8a18GitHub API\u3092 API Gateway\u306b\u767b\u9332\u3057\u3066\u5229\u7528\u3057\u307e\u3057\u305f\u3002<br \/>\nhttps:\/\/api.github.com\/users\/xxxx<\/p>\n<a href=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway04.png\" alt=\"API_Gateway04\" width=\"1137\" height=\"607\" class=\"aligncenter size-full wp-image-4393\" srcset=\"https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway04.png 1137w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway04-300x160.png 300w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway04-1024x547.png 1024w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway04-900x480.png 900w\" sizes=\"auto, (max-width: 1137px) 100vw, 1137px\" \/><\/a>\n<a href=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway05.png\" alt=\"API_Gateway05\" width=\"821\" height=\"695\" class=\"aligncenter size-full wp-image-4394\" srcset=\"https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway05.png 821w, https:\/\/www.skyarch.net\/blog\/wp-content\/uploads\/2015\/09\/API_Gateway05-300x254.png 300w\" sizes=\"auto, (max-width: 821px) 100vw, 821px\" \/><\/a>\n<h1>Android Studio\u306b\u4e0b\u8a18\u30b3\u30fc\u30c9\u3092\u8a18\u8f09<\/h1>\n<h2>common module<\/h2>\n<h3>WearConstants.java<\/h3>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage net.skyarch.common;\r\n\r\npublic class WearConstants {\r\n    public static final String PREFS = &quot;net.skyarch.test&quot;;\r\n    public static final String PREFS_KEY_MESSAGE_TEXT = &quot;net.skyarch.test.message&quot;;\r\n\r\n    public static final String DATA_CHANGED_ACTION = &quot;net.skyarch.test.data.changed&quot;;\r\n}\r\n<\/pre>\n<h2>mobile (\u30b9\u30de\u30db\/\u30bf\u30d6\u30ec\u30c3\u30c8)<\/h2>\n<p>res\/layout\/activity_main.xml\u306bButton btRefresh\u3092\u914d\u7f6e\u3057\u3066\u4e0b\u3055\u3044\u3002<\/p>\n<p>MainActivity.java<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage net.skyarch.testapp;\r\n\r\nimport java.util.Collection;\r\nimport java.util.HashSet;\r\n\r\nimport android.app.Activity;\r\nimport android.os.AsyncTask;\r\nimport android.os.Bundle;\r\nimport android.os.StrictMode;\r\nimport android.util.Log;\r\nimport android.view.View;\r\nimport android.view.View.OnClickListener;\r\nimport android.widget.Button;\r\n\r\n\/\/Wear\u3068\u306e\u901a\u4fe1\u306b\u5fc5\u8981\r\nimport com.google.android.gms.common.ConnectionResult;\r\nimport com.google.android.gms.common.api.GoogleApiClient;\r\nimport com.google.android.gms.common.api.GoogleApiClient.ConnectionCallbacks;\r\nimport com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener;\r\nimport com.google.android.gms.common.api.ResultCallback;\r\nimport com.google.android.gms.wearable.DataApi.DataItemResult;\r\nimport com.google.android.gms.wearable.MessageApi;\r\nimport com.google.android.gms.wearable.MessageEvent;\r\nimport com.google.android.gms.wearable.Node;\r\nimport com.google.android.gms.wearable.NodeApi;\r\nimport com.google.android.gms.wearable.Wearable;\r\n\r\n\/\/Mobile\u3068Wear\u3067\u5171\u901a\u3067\u5229\u7528\u3059\u308b\u30af\u30e9\u30b9\r\nimport net.skyarch.common.WearConstants;\r\n\r\n\/\/Amazon API Gateway\u306e\u5229\u7528\u306b\u5fc5\u8981\r\nimport com.amazonaws.mobileconnectors.apigateway.ApiClientFactory;\r\nimport net.skyarch.api.SkyarchKPIClient;\r\n\r\npublic class MainActivity extends Activity implements OnClickListener,\r\n        ConnectionCallbacks, ResultCallback&lt;DataItemResult&gt;,\r\n        OnConnectionFailedListener {\r\n\r\n    private final String TAG = &quot;Mobile&quot;;\r\n\r\n    \/\/Google Play Service\r\n    private GoogleApiClient mGoogleApiClient;\r\n\r\n    \/\/Wear Node\r\n    private Collection&lt;String&gt; mNodes;\r\n\r\n    \/\/Button\r\n    private Button _btRefresh;\r\n\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n\r\n        setContentView(R.layout.activity_main);\r\n\r\n        \/\/GoogleApiClient\u306e\u4f5c\u6210\r\n        mGoogleApiClient = new GoogleApiClient.Builder(this)\r\n                .addApi(Wearable.API)\r\n                .addConnectionCallbacks(this)\r\n                .addOnConnectionFailedListener(this)\r\n                .build();\r\n        mGoogleApiClient.connect();\r\n\r\n        \/\/Refresh\u30dc\u30bf\u30f3\r\n        _btRefresh = (Button) findViewById(R.id.btRefresh);\r\n        _btRefresh.setOnClickListener(this);\r\n        _btRefresh.setEnabled(true);\r\n    }\r\n\r\n    @Override\r\n    public void onClick(View v) {\r\n        Log.d(TAG, &quot;Clicked&quot;);\r\n\r\n        switch (v.getId()) {\r\n            case R.id.btRefresh:\r\n                Log.d(TAG, &quot;Refresh Button Pushed&quot;);\r\n\r\n                new AsyncTask&lt;Void, Void, Void&gt;() {\r\n                    @Override\r\n                    protected Void doInBackground(Void... params) {\r\n\r\n                        \/\/Github\u304b\u3089 follower\u6570\u3092\u53d6\u5f97\r\n                        ApiClientFactory factory = new ApiClientFactory();\r\n                        final SkyarchKPIClient client = factory.build(SkyarchKPIClient.class);\r\n                        int followerCount = client.githubGet().getFollowers();\r\n\r\n                        Log.d(TAG, &quot;git followers&quot; + Integer.toString(followerCount));\r\n\r\n                        \/\/Wear Node\u3092\u53d6\u5f97\r\n                        mNodes = getNodes();\r\n\r\n                        \/\/\u30e1\u30c3\u30bb\u30fc\u30b8\u3092Wear\u306b\u9001\u4fe1\r\n                        sendMessageToWear(mNodes,\r\n                                WearConstants.DATA_CHANGED_ACTION,\r\n                                Integer.toString(followerCount));\r\n\r\n                        return null;\r\n                    }\r\n                }.execute();\r\n                break;\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public void onConnected(Bundle connectionHint) {\r\n        Log.d(TAG, &quot;onConnected:&quot;);\r\n    }\r\n\r\n    @Override\r\n    public void onConnectionSuspended(int cause) {\r\n        Log.d(TAG, &quot;onConnectionSuspended:&quot;);\r\n    }\r\n\r\n    @Override\r\n    public void onConnectionFailed(ConnectionResult result) {\r\n        Log.d(TAG, &quot;onConnectionFailed:&quot;);\r\n    }\r\n\r\n    @Override\r\n    public void onResult(DataItemResult result) {\r\n        Log.d(TAG, &quot;Result:&quot; + result.getStatus().isSuccess());\r\n    }\r\n\r\n    \/**\r\n     * Wear node\u3092\u53d6\u5f97\r\n     *\r\n     * @return WearNode\r\n     *\/\r\n    private Collection&lt;String&gt; getNodes() {\r\n\r\n        HashSet&lt;String&gt; results = new HashSet&lt;String&gt;();\r\n        NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi\r\n                .getConnectedNodes(mGoogleApiClient).await();\r\n\r\n        String nodesStr = &quot;&quot;;\r\n        for (Node node : nodes.getNodes()) {\r\n            Log.d(TAG, &quot;node.getId():&quot; + node.getId());\r\n            nodesStr += node.getId() + &quot;,&quot;;\r\n            results.add(node.getId());\r\n        }\r\n\r\n        final String nodesTmp = nodesStr;\r\n        runOnUiThread(new Runnable() {\r\n            public void run() {\r\n                \/\/UI\u306e\u66f4\u65b0\r\n            }\r\n        });\r\n        return results;\r\n    }\r\n\r\n    \/**\r\n     * Wear\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1\r\n     *\/\r\n    public void sendMessageToWear(Collection&lt;String&gt; nodes,\r\n                                  String action, String message) {\r\n\r\n        for (String node : nodes) {\r\n            Wearable.MessageApi.addListener(mGoogleApiClient, new MessageApi.MessageListener() {\r\n\r\n                @Override\r\n                public void onMessageReceived(MessageEvent messageEvent) {\r\n                    final String data = new String(messageEvent.getData());\r\n\r\n                    Log.d(TAG, &quot;Message received: &quot; + messageEvent);\r\n                    Log.d(TAG, &quot;Data: &quot; + data);\r\n\r\n                    runOnUiThread(new Runnable() {\r\n                        public void run() {\r\n                            \/\/UI\u306e\u66f4\u65b0\r\n                        }\r\n                    });\r\n                }\r\n            });\r\n\r\n            MessageApi.SendMessageResult result = Wearable.MessageApi\r\n                    .sendMessage(mGoogleApiClient, node, action,\r\n                            message.getBytes()).await();\r\n\r\n            if (!result.getStatus().isSuccess()) {\r\n                Log.d(TAG, &quot;ERROR: failed to send Message: &quot; + result.getStatus());\r\n                runOnUiThread(new Runnable() {\r\n                    public void run() {\r\n                        \/\/UI\u306e\u66f4\u65b0\r\n                    }\r\n                });\r\n            } else {\r\n                Log.d(TAG, &quot;result.getStatus():&quot; + result.getStatus());\r\n                runOnUiThread(new Runnable() {\r\n                    public void run() {\r\n                        \/\/UI\u306e\u66f4\u65b0\r\n                    }\r\n                });\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Manifest<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;manifest xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    package=&quot;net.skyarch.testapp&quot; &gt;\r\n\r\n    &lt;application\r\n        android:allowBackup=&quot;true&quot;\r\n        android:icon=&quot;@mipmap\/ic_launcher&quot;\r\n        android:label=&quot;@string\/app_name&quot;\r\n        android:theme=&quot;@style\/AppTheme&quot; &gt;\r\n\r\n        &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot;\/&gt;\r\n\r\n        &lt;meta-data android:name=&quot;com.google.android.gms.version&quot;\r\n            android:value=&quot;@integer\/google_play_services_version&quot;\/&gt;\r\n\r\n        &lt;activity\r\n            android:name=&quot;.MainActivity&quot;\r\n            android:label=&quot;@string\/app_name&quot; &gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.intent.action.MAIN&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/activity&gt;\r\n    &lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;\r\n<\/pre>\n<h3>build.gradle<\/h3>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n...\ndependencies {\n    compile fileTree(dir: &#039;libs&#039;, include: &#x5B;&#039;*.jar&#039;])\n    wearApp project(&#039;:wear&#039;)\n    compile &#039;com.android.support:appcompat-v7:23.0.1&#039;\n    compile &#039;com.google.android.gms:play-services:7.8.0&#039;\n    compile project(&#039;:common&#039;)\n}\n<\/pre>\n<h2>wear (\u30b9\u30de\u30fc\u30c8\u30a6\u30a9\u30c3\u30c1)<\/h2>\n<p>res\/drawable \u306b test.png \u3092\u5165\u308c\u3066\u4e0b\u3055\u3044<\/p>\n<h3>DataLayerListenerService.java<\/h3>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage net.skyarch.testapp;\r\n\r\nimport android.content.Intent;\r\nimport android.util.Log;\r\n\r\nimport com.google.android.gms.wearable.MessageEvent;\r\nimport com.google.android.gms.wearable.Node;\r\nimport com.google.android.gms.wearable.WearableListenerService;\r\n\r\nimport net.skyarch.common.WearConstants;\r\n\r\npublic class DataLayerListenerService extends WearableListenerService {\r\n    private static final String TAG = &quot;DataLayerService&quot;;\r\n\r\n    @Override\r\n    public void onMessageReceived(MessageEvent messageEvent) {\r\n        super.onMessageReceived(messageEvent);\r\n\r\n        String strMessage = new String(messageEvent.getData());\r\n\r\n        Log.d(TAG, &quot;onMessageReceived&quot;);\r\n        Log.d(TAG, strMessage);\r\n\r\n        if (strMessage != null) {\r\n            getBaseContext().getSharedPreferences(WearConstants.PREFS, MODE_PRIVATE).edit().putString(WearConstants.PREFS_KEY_MESSAGE_TEXT,\r\n                    strMessage).commit();\r\n            getBaseContext().sendBroadcast(new Intent(WearConstants.DATA_CHANGED_ACTION));\r\n        }\r\n    }\r\n\r\n    @Override\r\n    public void onPeerConnected(Node peer) {}\r\n\r\n    @Override\r\n    public void onPeerDisconnected(Node peer){}\r\n\r\n}\r\n<\/pre>\n<h3>TestWatch.java<\/h3>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\r\npackage net.skyarch.testapp;\r\n\r\nimport android.content.BroadcastReceiver;\r\nimport android.content.Context;\r\nimport android.content.Intent;\r\nimport android.content.IntentFilter;\r\nimport android.content.res.Resources;\r\nimport android.graphics.Bitmap;\r\nimport android.graphics.Canvas;\r\nimport android.graphics.Paint;\r\nimport android.graphics.Rect;\r\nimport android.graphics.Typeface;\r\nimport android.graphics.drawable.BitmapDrawable;\r\nimport android.graphics.drawable.Drawable;\r\nimport android.os.Bundle;\r\nimport android.os.Handler;\r\nimport android.os.Message;\r\nimport android.support.wearable.watchface.CanvasWatchFaceService;\r\nimport android.support.wearable.watchface.WatchFaceStyle;\r\nimport android.text.format.Time;\r\nimport android.util.Log;\r\nimport android.view.SurfaceHolder;\r\nimport android.view.WindowInsets;\r\n\r\nimport net.skyarch.common.WearConstants;\r\n\r\nimport java.lang.ref.WeakReference;\r\nimport java.text.DateFormat;\r\nimport java.util.Date;\r\nimport java.util.TimeZone;\r\nimport java.util.concurrent.TimeUnit;\r\n\r\n\/**\r\n * Digital watch face with seconds. In ambient mode, the seconds aren't displayed. On devices with\r\n * low-bit ambient mode, the text is drawn without anti-aliasing in ambient mode.\r\n *\/\r\npublic class TestWatch extends CanvasWatchFaceService {\r\n    private static final String TAG = &quot;TestWatch&quot;;\r\n\r\n    private static final Typeface NORMAL_TYPEFACE =\r\n            Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL);\r\n\r\n    \/**\r\n     * Update rate in milliseconds for interactive mode. We update once a second since seconds are\r\n     * displayed in interactive mode.\r\n     *\/\r\n    private static final long INTERACTIVE_UPDATE_RATE_MS = TimeUnit.SECONDS.toMillis(1);\r\n\r\n    \/**\r\n     * Handler message id for updating the time periodically in interactive mode.\r\n     *\/\r\n    private static final int MSG_UPDATE_TIME = 0;\r\n\r\n    @Override\r\n    public Engine onCreateEngine() {\r\n        return new Engine();\r\n    }\r\n\r\n    private class Engine extends CanvasWatchFaceService.Engine {\r\n        final Handler mUpdateTimeHandler = new EngineHandler(this);\r\n\r\n        final BroadcastReceiver mTimeZoneReceiver = new BroadcastReceiver() {\r\n            @Override\r\n            public void onReceive(Context context, Intent intent) {\r\n                mTime.clear(intent.getStringExtra(&quot;time-zone&quot;));\r\n                mTime.setToNow();\r\n            }\r\n        };\r\n\r\n        boolean mRegisteredTimeZoneReceiver = false;\r\n\r\n        Paint mBackgroundPaint;\r\n\r\n        \/\/\u80cc\u666f\u306b\u8868\u793a\u3059\u308bpng\r\n        Bitmap mBackgroundBitmap;\r\n\r\n        boolean mAmbient;\r\n\r\n        Time mTime;\r\n\r\n        \/\/\u65e5\u4ed8\r\n        Paint mTextPaintDate;\r\n        float mXOffsetDate;\r\n        float mYOffsetDate;\r\n\r\n        \/\/\u6642\u523b\r\n        Paint mTextPaintTime;\r\n        float mXOffsetTime;\r\n        float mXOffsetTimeAmbient;\r\n        float mYOffsetTime;\r\n\r\n        \/\/mobile\u30a2\u30d7\u30ea\u304b\u3089\u306eMessage\r\n        Paint mTextPaintMessage;\r\n        float mXOffsetMessage;\r\n        float mYOffsetMessage;\r\n\r\n        \/**\r\n         * Whether the display supports fewer bits for each color in ambient mode. When true, we\r\n         * disable anti-aliasing in ambient mode.\r\n         *\/\r\n        boolean mLowBitAmbient;\r\n\r\n        @Override\r\n        public void onCreate(SurfaceHolder holder) {\r\n            super.onCreate(holder);\r\n\r\n            setWatchFaceStyle(new WatchFaceStyle.Builder(TestWatch.this)\r\n                    .setCardPeekMode(WatchFaceStyle.PEEK_MODE_VARIABLE)\r\n                    .setBackgroundVisibility(WatchFaceStyle.BACKGROUND_VISIBILITY_INTERRUPTIVE)\r\n                    .setShowSystemUiTime(false)\r\n                    .build());\r\n            Resources resources = TestWatch.this.getResources();\r\n            mYOffsetTime = resources.getDimension(R.dimen.digital_y_offset_time);\r\n\r\n            mBackgroundPaint = new Paint();\r\n            mBackgroundPaint.setColor(resources.getColor(R.color.digital_background));\r\n\r\n            Drawable backgroundDrawable = resources.getDrawable(R.drawable.test, null);\r\n            mBackgroundBitmap = ((BitmapDrawable) backgroundDrawable).getBitmap();\r\n\r\n            \/\/Date\r\n            mTextPaintDate = new Paint();\r\n            mTextPaintDate = createTextPaint(resources.getColor(R.color.digital_text_date));\r\n\r\n            \/\/Time\r\n            mTextPaintTime = new Paint();\r\n            mTextPaintTime = createTextPaint(resources.getColor(R.color.digital_text_time));\r\n\r\n            \/\/Message\r\n            mTextPaintMessage = new Paint();\r\n            mTextPaintMessage = createTextPaint(resources.getColor(R.color.digital_text_message));\r\n\r\n            mTime = new Time();\r\n        }\r\n\r\n        @Override\r\n        public void onDestroy() {\r\n            mUpdateTimeHandler.removeMessages(MSG_UPDATE_TIME);\r\n            super.onDestroy();\r\n        }\r\n\r\n        private Paint createTextPaint(int textColor) {\r\n            Paint paint = new Paint();\r\n            paint.setColor(textColor);\r\n            paint.setTypeface(NORMAL_TYPEFACE);\r\n            paint.setAntiAlias(true);\r\n            return paint;\r\n        }\r\n\r\n        @Override\r\n        public void onVisibilityChanged(boolean visible) {\r\n            super.onVisibilityChanged(visible);\r\n\r\n            if (visible) {\r\n                registerReceiver();\r\n\r\n                \/\/ Update time zone in case it changed while we weren't visible.\r\n                mTime.clear(TimeZone.getDefault().getID());\r\n                mTime.setToNow();\r\n            } else {\r\n                unregisterReceiver();\r\n            }\r\n\r\n            \/\/ Whether the timer should be running depends on whether we're visible (as well as\r\n            \/\/ whether we're in ambient mode), so we may need to start or stop the timer.\r\n            updateTimer();\r\n        }\r\n\r\n        private void registerReceiver() {\r\n            if (mRegisteredTimeZoneReceiver) {\r\n                return;\r\n            }\r\n            mRegisteredTimeZoneReceiver = true;\r\n            IntentFilter filter = new IntentFilter(Intent.ACTION_TIMEZONE_CHANGED);\r\n            TestWatch.this.registerReceiver(mTimeZoneReceiver, filter);\r\n        }\r\n\r\n        private void unregisterReceiver() {\r\n            if (!mRegisteredTimeZoneReceiver) {\r\n                return;\r\n            }\r\n            mRegisteredTimeZoneReceiver = false;\r\n            TestWatch.this.unregisterReceiver(mTimeZoneReceiver);\r\n        }\r\n\r\n        @Override\r\n        public void onApplyWindowInsets(WindowInsets insets) {\r\n            super.onApplyWindowInsets(insets);\r\n\r\n            \/\/ Load resources that have alternate values for round watches.\r\n            Resources resources = TestWatch.this.getResources();\r\n            boolean isRound = insets.isRound();\r\n\r\n            \/\/ for Date \u6642\u523b\u306e\u4e0a\u306b\u8868\u793a\r\n            mXOffsetDate = resources.getDimension(isRound\r\n                    ? R.dimen.digital_x_offset_date_round : R.dimen.digital_x_offset_date);\r\n            mYOffsetDate = resources.getDimension(R.dimen.digital_y_offset_date);\r\n            float textSizeDate = resources.getDimension(isRound\r\n                    ? R.dimen.digital_text_size_date_round : R.dimen.digital_text_size_date);\r\n            mTextPaintDate.setTextSize(textSizeDate);\r\n\r\n            \/\/ for Time\r\n            mXOffsetTime = resources.getDimension(isRound\r\n                    ? R.dimen.digital_x_offset_time_round : R.dimen.digital_x_offset_time);\r\n            mXOffsetTimeAmbient = resources.getDimension(isRound\r\n                    ? R.dimen.digital_x_offset_time_round : R.dimen.digital_x_offset_time) +\r\n                    resources.getDimension(R.dimen.digital_x_offset_time_ambient_shift);\r\n            mYOffsetTime = resources.getDimension(R.dimen.digital_y_offset_time);\r\n            float textSizeTime = resources.getDimension(isRound\r\n                    ? R.dimen.digital_text_size_time_round : R.dimen.digital_text_size_time);\r\n            mTextPaintTime.setTextSize(textSizeTime);\r\n\r\n            \/\/ for Message\r\n            mXOffsetMessage = resources.getDimension(isRound\r\n                    ? R.dimen.digital_x_offset_message_round : R.dimen.digital_x_offset_message);\r\n            mYOffsetMessage = resources.getDimension(R.dimen.digital_y_offset_message);\r\n            float textSizeMessage = resources.getDimension(isRound\r\n                    ? R.dimen.digital_text_size_message_round : R.dimen.digital_text_size_message);\r\n            mTextPaintMessage.setTextSize(textSizeMessage);\r\n        }\r\n\r\n        @Override\r\n        public void onPropertiesChanged(Bundle properties) {\r\n            super.onPropertiesChanged(properties);\r\n            mLowBitAmbient = properties.getBoolean(PROPERTY_LOW_BIT_AMBIENT, false);\r\n        }\r\n\r\n        @Override\r\n        public void onTimeTick() {\r\n            super.onTimeTick();\r\n            invalidate();\r\n        }\r\n\r\n        @Override\r\n        public void onAmbientModeChanged(boolean inAmbientMode) {\r\n            super.onAmbientModeChanged(inAmbientMode);\r\n            if (mAmbient != inAmbientMode) {\r\n                mAmbient = inAmbientMode;\r\n                if (mLowBitAmbient) {\r\n                    mTextPaintTime.setAntiAlias(!inAmbientMode);\r\n                    mTextPaintDate.setAntiAlias(!inAmbientMode);\r\n                }\r\n                invalidate();\r\n            }\r\n\r\n            \/\/ Whether the timer should be running depends on whether we're visible (as well as\r\n            \/\/ whether we're in ambient mode), so we may need to start or stop the timer.\r\n            updateTimer();\r\n        }\r\n\r\n        @Override\r\n        public void onDraw(Canvas canvas, Rect bounds) {\r\n            \/\/draw the background.\r\n            canvas.drawRect(0, 0, bounds.width(), bounds.height(), mBackgroundPaint);\r\n            canvas.drawBitmap(mBackgroundBitmap, bounds.width() \/ 2 - mBackgroundBitmap.getWidth() \/ 2, 20, null);\r\n\r\n            \/\/draw date\r\n            DateFormat format = android.text.format.DateFormat.getDateFormat(getApplicationContext());\r\n            canvas.drawText(format.format(new Date()), mXOffsetDate, mYOffsetDate, mTextPaintDate);\r\n\r\n            \/\/draw H:MM in ambient mode or H:MM:SS in interactive mode.\r\n            mTime.setToNow();\r\n\r\n            \/\/draw time\r\n            String strTime = mAmbient\r\n                    ? String.format(&quot;%d:%02d&quot;, mTime.hour, mTime.minute)\r\n                    : String.format(&quot;%d:%02d:%02d&quot;, mTime.hour, mTime.minute, mTime.second);\r\n            if (mAmbient) {\r\n                canvas.drawText(strTime, mXOffsetTimeAmbient, mYOffsetTime, mTextPaintTime);\r\n            } else {\r\n                canvas.drawText(strTime, mXOffsetTime, mYOffsetTime, mTextPaintTime);\r\n            }\r\n\r\n            \/\/draw message\r\n            String strMessage = TestWatch.this.getSharedPreferences(WearConstants.PREFS, MODE_PRIVATE)\r\n                    .getString(WearConstants.PREFS_KEY_MESSAGE_TEXT, &quot;REFRESH&quot;);\r\n            canvas.drawText(strMessage, mXOffsetMessage, mYOffsetMessage, mTextPaintMessage);\r\n        }\r\n\r\n        \/**\r\n         * Starts the {@link #mUpdateTimeHandler} timer if it should be running and isn't currently\r\n         * or stops it if it shouldn't be running but currently is.\r\n         *\/\r\n        private void updateTimer() {\r\n            mUpdateTimeHandler.removeMessages(MSG_UPDATE_TIME);\r\n            if (shouldTimerBeRunning()) {\r\n                mUpdateTimeHandler.sendEmptyMessage(MSG_UPDATE_TIME);\r\n            }\r\n        }\r\n\r\n        \/**\r\n         * Returns whether the {@link #mUpdateTimeHandler} timer should be running. The timer should\r\n         * only run when we're visible and in interactive mode.\r\n         *\/\r\n        private boolean shouldTimerBeRunning() {\r\n            return isVisible() &amp;&amp; !isInAmbientMode();\r\n        }\r\n\r\n        \/**\r\n         * Handle updating the time periodically in interactive mode.\r\n         *\/\r\n        private void handleUpdateTimeMessage() {\r\n            invalidate();\r\n            if (shouldTimerBeRunning()) {\r\n                long timeMs = System.currentTimeMillis();\r\n                long delayMs = INTERACTIVE_UPDATE_RATE_MS\r\n                        - (timeMs % INTERACTIVE_UPDATE_RATE_MS);\r\n                mUpdateTimeHandler.sendEmptyMessageDelayed(MSG_UPDATE_TIME, delayMs);\r\n            }\r\n        }\r\n    }\r\n\r\n    private static class EngineHandler extends Handler {\r\n        private final WeakReference&lt;TestWatch.Engine&gt; mWeakReference;\r\n\r\n        public EngineHandler(TestWatch.Engine reference) {\r\n            mWeakReference = new WeakReference&lt;&gt;(reference);\r\n        }\r\n\r\n        @Override\r\n        public void handleMessage(Message msg) {\r\n            TestWatch.Engine engine = mWeakReference.get();\r\n            if (engine != null) {\r\n                switch (msg.what) {\r\n                    case MSG_UPDATE_TIME:\r\n                        engine.handleUpdateTimeMessage();\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>AndroidManifest.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;manifest xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\r\n    package=&quot;net.skyarch.testapp&quot; &gt;\r\n\r\n    &lt;uses-feature android:name=&quot;android.hardware.type.watch&quot; \/&gt;\r\n\r\n    &lt;!-- Required to act as a custom watch face. --&gt;\r\n    &lt;uses-permission android:name=&quot;com.google.android.permission.PROVIDE_BACKGROUND&quot; \/&gt;\r\n    &lt;uses-permission android:name=&quot;android.permission.WAKE_LOCK&quot; \/&gt;\r\n\r\n    &lt;application\r\n        android:allowBackup=&quot;true&quot;\r\n        android:icon=&quot;@mipmap\/ic_launcher&quot;\r\n        android:label=&quot;@string\/app_name&quot;\r\n        android:theme=&quot;@android:style\/Theme.DeviceDefault&quot; &gt;\r\n\r\n        &lt;meta-data\r\n            android:name=&quot;com.google.android.gms.version&quot;\r\n            android:value=&quot;@integer\/google_play_services_version&quot; \/&gt;\r\n\r\n        &lt;service android:name=&quot;.DataLayerListenerService&quot; &gt;\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;com.google.android.gms.wearable.BIND_LISTENER&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/service&gt;\r\n\r\n        &lt;service\r\n            android:name=&quot;.TestWatch&quot;\r\n            android:label=&quot;@string\/my_digital_name&quot;\r\n            android:permission=&quot;android.permission.BIND_WALLPAPER&quot; &gt;\r\n            &lt;meta-data\r\n                android:name=&quot;android.service.wallpaper&quot;\r\n                android:resource=&quot;@xml\/watch_face&quot; \/&gt;\r\n            &lt;meta-data\r\n                android:name=&quot;com.google.android.wearable.watchface.preview&quot;\r\n                android:resource=&quot;@drawable\/preview_digital&quot; \/&gt;\r\n            &lt;meta-data\r\n                android:name=&quot;com.google.android.wearable.watchface.preview_circular&quot;\r\n                android:resource=&quot;@drawable\/preview_digital_circular&quot; \/&gt;\r\n\r\n            &lt;intent-filter&gt;\r\n                &lt;action android:name=&quot;android.service.wallpaper.WallpaperService&quot; \/&gt;\r\n\r\n                &lt;category android:name=&quot;com.google.android.wearable.watchface.category.WATCH_FACE&quot; \/&gt;\r\n            &lt;\/intent-filter&gt;\r\n        &lt;\/service&gt;\r\n\r\n        &lt;meta-data\r\n            android:name=&quot;com.google.android.gms.version&quot;\r\n            android:value=&quot;@integer\/google_play_services_version&quot; \/&gt;\r\n    &lt;\/application&gt;\r\n\r\n&lt;\/manifest&gt;\r\n<\/pre>\n<p>res\/values\/strings.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;resources&gt;\r\n    &lt;string name=&quot;app_name&quot;&gt;TestApp&lt;\/string&gt;\r\n    &lt;string name=&quot;my_digital_name&quot;&gt;SkyarchTest&lt;\/string&gt;\r\n&lt;\/resources&gt;\r\n<\/pre>\n<p>res\/values\/dimens.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;resources&gt;\r\n    &lt;dimen name=&quot;digital_text_size_date&quot;&gt;10dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_text_size_date_round&quot;&gt;10dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_text_size_time&quot;&gt;20dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_text_size_time_round&quot;&gt;20dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_text_size_message&quot;&gt;40dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_text_size_message_round&quot;&gt;40dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_date&quot;&gt;85dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_date_round&quot;&gt;85dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_y_offset_date&quot;&gt;180dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_time&quot;&gt;70dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_time_round&quot;&gt;70dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_time_ambient_shift&quot;&gt;13dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_y_offset_time&quot;&gt;200dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_message&quot;&gt;75dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_x_offset_message_round&quot;&gt;75dp&lt;\/dimen&gt;\r\n    &lt;dimen name=&quot;digital_y_offset_message&quot;&gt;130dp&lt;\/dimen&gt;\r\n&lt;\/resources&gt;\r\n<\/pre>\n<p>res\/values\/colors.xml<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\r\n&lt;resources&gt;\r\n    &lt;color name=&quot;digital_background&quot;&gt;#000000&lt;\/color&gt;\r\n    &lt;color name=&quot;digital_text_date&quot;&gt;#ffffff&lt;\/color&gt;\r\n    &lt;color name=&quot;digital_text_time&quot;&gt;#ffffff&lt;\/color&gt;\r\n    &lt;color name=&quot;digital_text_message&quot;&gt;#cc0000&lt;\/color&gt;\r\n&lt;\/resources&gt;\r\n<\/pre>\n<h1>\u53c2\u8003\u8a18\u4e8b<\/h1>\n<p>Amazon API Gateway\u306e\u5229\u7528\u65b9\u6cd5<br \/>\n<a href=\"http:\/\/dev.classmethod.jp\/cloud\/aws\/api-gateway-with-android\/\">http:\/\/dev.classmethod.jp\/cloud\/aws\/api-gateway-with-android\/<\/a><\/p>\n<p>\u516c\u5f0f\u30da\u30fc\u30b8\u30c7\u30fc\u30bf\u8ee2\u9001\u65b9\u6cd5\u306b\u3064\u3044\u3066<br \/>\n<a href=\"https:\/\/developer.android.com\/intl\/ja\/training\/wearables\/data-layer\/messages.html\">https:\/\/developer.android.com\/intl\/ja\/training\/wearables\/data-layer\/messages.html<\/a><\/p>\n<p>\u5929\u6c17\u4e88\u5831\u3092AndroidWear\u306eWatchFace\u306b\u8868\u793a<br \/>\n<a href=\"http:\/\/swarmnyc.com\/whiteboard\/how-to-design-and-develop-an-android-watch-face-app-wearables-overview\/\">http:\/\/swarmnyc.com\/whiteboard\/how-to-design-and-develop-an-android-watch-face-app-wearables-overview\/<\/a><\/p>\n<p>Data API\u3092\u4f7f\u3063\u305f\u30c7\u30fc\u30bf\u8ee2\u9001<br \/>\n<a href=\"https:\/\/sites.google.com\/a\/gclue.jp\/android-docs\/ni-yinkiwear\/data-apiwo-shittadeta-zhuan-song\">https:\/\/sites.google.com\/a\/gclue.jp\/android-docs\/ni-yinkiwear\/data-apiwo-shittadeta-zhuan-song<\/a><\/p>\n<p>Android Wear\u306e\u30a2\u30d7\u30ea\u306e\u4f5c\u308a\u65b9<br \/>\n<a href=\"http:\/\/www.buildinsider.net\/mobile\/androidwear\/02\">http:\/\/www.buildinsider.net\/mobile\/androidwear\/02<\/a><\/p>\n<p>\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3057\u305f\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u76ee\u7684 \u69d8\u3005\u306a\u30b5\u30fc\u30d3\u30b9\u4e0a\u306eAPI\u3067\u53d6\u5f97\u3067\u304d\u308b\u6570\u5024\u30c7\u30fc\u30bf\u7b49\u3092\u4e00\u5143\u7684\u306b\u7ba1\u7406\u3057\u305f\u4e0a\u3067AndroidWear\u306b\u8868\u793a\u3057\u305f\u3044\u3002 \u65b0\u305f\u306b\u5229\u7528\u3057\u305fAPI\u304c\u5897\u3048\u305f\u308a\u3001\u5909\u66f4\u3055\u308c\u305f\u6642\u306b\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30b3\u30b9\u30c8\u3092\u4f4e\u304f\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u9762\u3092\u62c5\u4fdd\u3057\u305f\u4e0a\u3067And&#8230;<\/p>\n","protected":false},"author":2,"featured_media":4415,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"ja","_original_post":"4389","footnotes":""},"categories":[112,20,19,9],"tags":[],"class_list":{"0":"post-4389","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-androidwear","8":"category-aws","9":"category-19","10":"category-dev","11":"ja"},"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/posts\/4389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/comments?post=4389"}],"version-history":[{"count":20,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/posts\/4389\/revisions"}],"predecessor-version":[{"id":4435,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/posts\/4389\/revisions\/4435"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/media\/4415"}],"wp:attachment":[{"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/media?parent=4389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/categories?post=4389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyarch.net\/blog\/wp-json\/wp\/v2\/tags?post=4389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}