每当您打开Wear应用程序时,即可将Android Wear与手机同步

诺罗克斯

我正在尝试为Android手机和Wear实现基本的天气应用。该应用程序从Web API获取其数据,然后将其显示在手机上。现在,如果在Wear上打开了该应用程序,然后在手机上打开了该应用程序,它将同步两者的天气。而且,如果您在手机上更改天气,则磨损也会随之改变。每当打开磨损应用程序时,我都想让磨损应用程序从电话中获取天气信息,我尝试通过使服装通过消息“ ping”电话来实现这种情况,然后电话通过数据映射发送信息。这是可行的,但是尽管手机说它已经发送了数据图,但服装没有从手机上接收到数据图。

穿着主要活动:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_data_map);
    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);
            sendMessage("Ping");
            Log.i("OnLayoutInflated","LAYOUT INFLATED");
        }
    });

    setAmbientEnabled();

    // Register the local broadcast receiver
    IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
    MessageReceiver messageReceiver = new MessageReceiver();
    LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);

}


@Override
protected void onPause() {

    super.onPause();
    if (wearCommsManager.isConnected()) {
        wearCommsManager.disconnectClient();
    }
}

@Override
protected void onResume() {
    super.onResume();

    if (wearCommsManager == null) {
        wearCommsManager = new WearCommsManager(this);
    }
    if (messageSender == null) {
        messageSender = new WearMessageSender(wearCommsManager);
    }
    verifyCommsConnection();
}
protected void sendMessage(final String message) {
    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {;
            messageSender.processRequest(message);
            return null;
        }
    };
    task.execute();
}


private void verifyCommsConnection() {
    new WearCommsManager(this).verifyCommsConnection(new WearCommsManager.CommsCallback() {
        @Override
        public void onSuccess() {

        }

        @Override
        public void onFailure() {
            Log.e("ERROR","CONNECTION FAILED");
        }

    });
}



public class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle data = intent.getBundleExtra("datamap");
        // Display received data in UI
        String display =
                 data.getString("city") + "\n" +
                 data.getString("temperature") + "\n" +
                 data.getString("wind_speed") + "\n" +
                 data.getString("cloud_percent")+"\n"+
                 data.getString("lastupdate");
        mTextView.setText(display);
    }
}

佩戴者:

public class ListenerService extends WearableListenerService{

private static final String WEARABLE_DATA_PATH = "/wearable_data";


@Override
public void onCreate() {

    super.onCreate();
}

@Override
public void onDataChanged(DataEventBuffer dataEvents) {

    DataMap dataMap;
    for (DataEvent event : dataEvents) {
        Log.v("myTag", "DataMap received on watch: " + DataMapItem.fromDataItem(event.getDataItem()).getDataMap());
        // Check the data type
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            // Check the data path
            String path = event.getDataItem().getUri().getPath();
            if (path.equals(WEARABLE_DATA_PATH)) {}
            dataMap = DataMapItem.fromDataItem(event.getDataItem()).getDataMap();


            // Broadcast DataMap contents to wearable activity for display
            // The content has the golf hole number and distances to the front,
            // middle and back pin placements.

            Intent messageIntent = new Intent();
            messageIntent.setAction(Intent.ACTION_SEND);
            messageIntent.putExtra("datamap", dataMap.toBundle());
            LocalBroadcastManager.getInstance(this).sendBroadcast(messageIntent);

        }
    }
}
}

电话主要活动:

public class DataMapActivity extends AppCompatActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener{
private TextView cityName;
private TextView temp;
private ImageView iconView;
private TextView description;
private TextView humidity;
private TextView pressure;
private TextView wind;
private TextView sunrise;
private TextView sunset;
private TextView updated;

Weather weather = new Weather();

GoogleApiClient googleClient;

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

    cityName = (TextView) findViewById(R.id.cityText);
    iconView = (ImageView) findViewById(R.id.thumbnailIcon);
    temp = (TextView) findViewById(R.id.tempText);
    description = (TextView) findViewById(R.id.CloudText);
    humidity = (TextView) findViewById(R.id.HumidText);
    pressure = (TextView) findViewById(R.id.PressureText);
    wind = (TextView) findViewById(R.id.WindText);
    sunrise = (TextView) findViewById(R.id.RiseText);
    sunset = (TextView) findViewById(R.id.SetText);
    updated = (TextView) findViewById(R.id.UpdateText);
    CityPreference cityPreference=new CityPreference(DataMapActivity.this);
    System.out.println(cityPreference.getCity());
    renderWeatherData(cityPreference.getCity());

    IntentFilter messageFilter = new IntentFilter(Intent.ACTION_SEND);
    MessageReceiver messageReceiver = new MessageReceiver();
    LocalBroadcastManager.getInstance(this).registerReceiver(messageReceiver, messageFilter);

    // Build a new GoogleApiClient for the the Wearable API
    googleClient = new GoogleApiClient.Builder(this)
            .addApi(Wearable.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
}

public void renderWeatherData(String city) {
    WeatherTask weatherTask = new WeatherTask();
    weatherTask.execute(new String[]{city + "&units=metric"});
}

private class WeatherTask extends AsyncTask<String, Void, Weather> {
    @Override
    protected Weather doInBackground(String... params) {
        String data = ((new WeatherHttpClient()).getWeatherData(params[0]));
        System.out.println(data);
        weather = JSONParser.getWeather(data);
        return weather;
    }

    @Override
    protected void onPostExecute(Weather weather) {

        super.onPostExecute(weather);
        if(weather.currentCondition.getIcon() != null){
            new DownloadImageAsyncTask().execute(weather.currentCondition.getIcon());
        }
        cityName.setText(weather.place.getCity() + "," + weather.place.getCountry());
        temp.setText("" + (int)weather.currentCondition.getTemperature() + "°C");
        wind.setText("Wind Speed: " + weather.wind.getSpeed()+"m/s" + " Degree: " + weather.wind.getDegree());
        description.setText("Clouds: " + weather.clouds.getPrecipitation() + "%, " + weather.currentCondition.getDescription());
        pressure.setText("Pressure: " + weather.currentCondition.getPressure()+"hpa");
        humidity.setText("Humidity: " + weather.currentCondition.getHumidity()+"%");
        Date mydate = new Date(weather.place.getSunrise() * 1000);
        SimpleDateFormat dateformat = new SimpleDateFormat("HH:mm");
        dateformat.setTimeZone(TimeZone.getTimeZone("GMT+3"));
        String date = dateformat.format(mydate);
        sunrise.setText("Sunrise: " + date);
        mydate = new Date(weather.place.getSunset() * 1000);
        date = dateformat.format(mydate);
        sunset.setText("Sunset: " + date);
        mydate = new Date(weather.place.getLastupdate() * 1000);
        dateformat = new SimpleDateFormat("dd.MM.yyyy, HH:mm, z");
        dateformat.setTimeZone(TimeZone.getDefault());
        date = dateformat.format(mydate);
        updated.setText("Last Updated: " + date);
        sendWear();

        //This part synchronizes perfectly with wear 

    }

}

private void sendWear(){
    String WEARABLE_DATA_PATH = "/wear_data";

    // Create a DataMap object and send it to the data layer
    DataMap dataMap = new DataMap();
    dataMap.putString("lastupdate", updated.getText().toString());
    dataMap.putString("city", cityName.getText().toString());
    dataMap.putString("temperature", temp.getText().toString());
    dataMap.putString("wind_speed", wind.getText().toString());
    dataMap.putString("cloud_percent", description.getText().toString());
    //Requires a new thread to avoid blocking the UI
    new SendToDataLayerThread(WEARABLE_DATA_PATH, dataMap).start();
}

public class MessageReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

       String s= intent.getStringExtra("Pinger");
        if(s!=null) {
            new SendToWearAsyncTask().execute();

        }
    }
}

private class SendToWearAsyncTask extends AsyncTask<Void,Void,Void>{
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        sendWear();
         //this part wear doesn't receive the datamap
    }

    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }
}
阿比利塔

确保applicationID适用于移动设备和穿戴式应用的build.gradle中的相同。还要确保buildTypes零件和signingConfigs零件在两个应用程序中都相同。来源。您还可以发送Long.toString(System.currentTimeMillis())验证消息,因为它每次都会更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在“手机”上打开时,内置于Android Studio中的Android Wear APK无法解析

无法挂载Android手机并无法与Banshee同步

在Android手机和Ubuntu之间同步笔记吗?

Android Wear Preview应用-哪些智能手机兼容?

如何从手机/手机传递一些信息到wear os 并在android wear os 模拟器中显示它?

Android Wear Watch Face获得手机的电池百分比

如何在具有多个已连接设备的手机中识别我的Wear节点?

当我尝试将Wear智能手机应用程序与Wear应用程序一起运行时,“否,缺少功能:WATCH”?

通过按钮打开手机应用程序

Android Wear和Google Fit:如何在smartwatch和智能手机之间强制更新数据集?

Android Wear-在手机上打开

Cortana停止在Windows和我的Android手机之间同步文本消息(sms)

与Android智能手机同步日历和通讯录

使用已配置的Android手机在PC上配置Firefox同步

Android手机存储

在波斯Android手机中运行应用程序时对齐左右概念更改

在手机上测试Android Wear应用?

Android应用程序如何延迟您的服务在手机开机时启动

连接到Web应用程序的android手机

从您的android手机完全卸载

我可以在Android智能手机上调试Android Wear应用程序吗?(如何)

如何使用Ionic 2应用程序打开Android手机的安全设置?

锁定和解锁手机后重新打开应用程序时,SurfaceView出现问题

应用程序安装到手机后无法打开,应用程序崩溃

“此应用与您的手机不兼容” Android 7.0

如何将我用Android手机录制的所有视频自动同步到桌面?

当我从Banshee断开Android智能手机的连接时,未保存我的“同步首选项”

手机键盘打开延迟

手机菜单无法打开