0

Android 용 휴대 전화 및 착용 용 기본 날씨 앱을 구현하려고합니다. 응용 프로그램은 웹 API에서 데이터를 가져온 다음 전화 상에 표시합니다. 앱이 Wear에서 열려 있고 전화에서 열면 지금 날씨에 동기화됩니다. 그리고 만약 당신이 전화로 날씨를 바꾼다면, 그것은 착용시에도 바뀝니다. 착용 응용 프로그램을 열 때마다 착용 응용 프로그램이 휴대 전화에서 날씨를 가져 오도록 만들고 싶습니다. 메시지를 통해 전화를 "핑"하고 전화가 데이터 맵을 통해 정보를 전송하도록 구현하려고했습니다. 전화가 데이터 맵을 보냈다고 말했지만 마모가 전화에서 데이터 맵을 수신하지 않는다는 점을 제외하면이 방식이 효과적입니다. 착용 앱을 열 때마다 Android Wear를 휴대 전화와 동기화하십시오.

는 주요 활동을 착용 :

@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; 
    } 
} 

답변

0

applicationID가에 대한 build.gradle에서 동일 있는지 확인 모바일 및 착용 앱. 또한 두 앱 모두 buildTypes 부분과 signingConfigs 부분이 동일해야합니다. Source.Long.toString(System.currentTimeMillis())을 전송하여 매번 변경 될 때이를 확인할 수도 있습니다.

+0

현재 시간 (밀리 초)이 내 문제를 해결했습니다. 나는 마모가 데이터 맵 변경을 청취한다는 사실과 관련이 있다고 생각합니다. 귀하의 답변 주셔서 감사합니다! – Nerozx

관련 문제