是否可以使用 Wear OS(即通过 Android 智能手表)在 Android 中以编程方式设置提醒,通过“手表和连接的手机”向用户发出提醒?我可以使用手表上的提醒应用程序来设置提醒,但我无法通过我正在开发的在手表上执行的应用程序来执行此操作。 我听说以编程方式设置提醒(在手机上)的方法是使用两个步骤,第一步是将数据从 Wear OS 发送到手机。 具体来说,在 Wear OS 设备上,使用数据层 API 将事件详细信息发送到手机。
import com.google.android.gms.tasks.Task; import com.google.android.gms.wearable.DataClient; import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.PutDataMapRequest;
import com.google.android.gms.wearable.PutDataRequest;
import com.google.android.gms.wearable.Wearable;
public void sendEventToPhone(String title, long startTime, long endTime, String location) {
PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/calendar_event");
putDataMapReq.getDataMap().putString("title", title);
putDataMapReq.getDataMap().putLong("startTime", startTime);
putDataMapReq.getDataMap().putLong("endTime", endTime);
putDataMapReq.getDataMap().putString("location", location);
PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
Task<DataItem> putDataTask = Wearable.getDataClient(this).putDataItem(putDataReq);
}
下一步是在手机上接收数据并插入事件,通过实现 WearableListenerService 来接收数据并将事件插入日历中。
import android.content.ContentValues;
import android.net.Uri;
import android.provider.CalendarContract;
import com.google.android.gms.wearable.DataEvent;
import com.google.android.gms.wearable.DataEventBuffer;
import com.google.android.gms.wearable.DataMap;
import com.google.android.gms.wearable.DataMapItem;
import com.google.android.gms.wearable.WearableListenerService;
public class CalendarEventService extends WearableListenerService {
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_CHANGED) {
DataMap dataMap =
DataMapItem.fromDataItem(event.getDataItem()).getDataMap();
if (event.getDataItem().getUri().getPath().equals("/calendar_event")) {
String title = dataMap.getString("title");
long startTime = dataMap.getLong("startTime");
long endTime = dataMap.getLong("endTime");
String location = dataMap.getString("location");
insertEvent(title, startTime, endTime, location);
}
}
}
}
private void insertEvent(String title, long startTime, long endTime, String location) {
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, startTime);
values.put(CalendarContract.Events.DTEND, endTime);
values.put(CalendarContract.Events.TITLE, title);
values.put(CalendarContract.Events.EVENT_LOCATION, location);
values.put(CalendarContract.Events.CALENDAR_ID, 1); // Use the default calendar
values.put(CalendarContract.Events.EVENT_TIMEZONE, "UTC");
Uri uri = getContentResolver().insert(CalendarContract.Events.CONTENT_URI, values);
if (uri != null) {
long eventId = Long.parseLong(uri.getLastPathSegment());
// Optionally, add a reminder
ContentValues reminderValues = new ContentValues();
reminderValues.put(CalendarContract.Reminders.EVENT_ID, eventId);
reminderValues.put(CalendarContract.Reminders.MINUTES, 15);
reminderValues.put(CalendarContract.Reminders.METHOD,
CalendarContract.Reminders.METHOD_ALERT);
getContentResolver().insert(CalendarContract.Reminders.CONTENT_URI,
reminderValues);
}
}
}
但是,这不适用于我的应用程序,因为我需要在手机未开机的情况下设置提醒。 这样做的原因是,如果用户需要访问手机,那么使用手表就没有意义了。
以下是我尝试过但不起作用的一些方法:
首先,我使用 WearableCalendarContract 尝试了以下代码,代码抛出了一个异常,表明不允许使用 WearableCalendarContract 进行插入。
public long createInstance(ContentResolver contentResolver, long i_eventId, long
beginTime, long endTime) {
ContentValues values = new ContentValues();
values.put(CalendarContract.Instances.EVENT_ID, i_eventId);
values.put(CalendarContract.Instances.BEGIN, beginTime);
values.put(CalendarContract.Instances.END, endTime);
Uri uri = null;
try {
uri = contentResolver.insert(WearableCalendarContract.Instances.CONTENT_URI,
values);
}
catch (Exception e){
int x = 1;
}
Cursor cursor = contentResolver.query(WearableCalendarContract.Instances.CONTENT_URI,
new String[]{CalendarContract.Reminders.EVENT_ID }, null, null, null);
int wNumInstances = cursor.getCount();
if (uri == null) {
return Long.parseLong(uri.getLastPathSegment());
}
// Prepare reminder values
values = new ContentValues();
// eventId is the ID of the event
values.put(CalendarContract.Reminders.EVENT_ID, i_eventId);
// or METHOD_EMAIL
values.put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT);
values.put(CalendarContract.Reminders.MINUTES, 1); // Reminder 30 minutes before event
// Insert reminder
android.net.Uri uri2 =
contentResolver.insert(WearableCalendarContract.Reminders.CONTENT_URI, values);
Cursor cursor2 = contentResolver.query(WearableCalendarContract.Reminders.CONTENT_URI,
new String[]{CalendarContract.Reminders.EVENT_ID }, null, null, null);
int wNumReminder = cursor2.getCount();
return Long.parseLong(uri2.getLastPathSegment());
}
下一步:我尝试修改代码以使用 CalendarContract。 这涉及将 CalendarContract.Instances.EVENT_ID 更改为 CalendarContract.Events.EVENT_ID 以及 BEGIN 和 END 的相关更改。 执行插入时代码不再抛出异常,但插入不起作用。 通过检查 wNumInstances = curve.getCount() 代码行中的实例计数来确认这一点,该代码行指示 wNumInstances= 0,这意味着尚未插入任何项目。 有什么办法可以解决这些问题并添加提醒吗?
最后,我试图找到一个可以与手机上的提醒应用程序一起使用的API(提醒应用程序不知何故可以添加提醒)。我的搜索没有找到任何允许我的应用程序通过提醒应用程序设置提醒的 API,也没有显示任何其他 API。
由于手表安排活动时您的手机可能已关闭或超出范围,因此您需要:
在手表上对事件进行排队