Android 同步日历功能与自己的日历

2024-02-24

我已经展示了如何为我们自己的帐户设置自己的sync_calendar功能以及我们如何将我们自己的事件同步到...的技术。

在清单中授予读取和写入日历的权限

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

在res/xml文件夹下创建SyncAdapter 文件名:sync_calendar.xml

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
    android:accountType="com.account.auth"
    android:contentAuthority="com.android.calendar"
    android:supportsUploading="false"
    android:userVisible="true" />

android:accountType:-- 这里提供您在帐户验证器下创建的帐户类型 就像我在下面提到的

<account-authenticator
 android:accountType="com.account.auth"
 android:icon="@drawable/ic_launcher"
 android:label="@string/app_name"
 android:smallIcon="@drawable/ic_launcher"
 xmlns:android="http://schemas.android.com/apk/res/android">
</account-authenticator>

在清单文件中定义服务名称和元数据

     <service
                android:name="com.account.auth.CalendarSyncAdapterService"
                android:exported="true"
                android:process=":calendar" >
                <intent-filter>
                    <action android:name="android.content.SyncAdapter" />
                </intent-filter>
            <meta-data
                android:name="android.content.SyncAdapter"
                android:resource="@xml/sync_calendar" />
</service>

创建同步开始时将被调用的服务,并添加您想要移交同步日历的逻辑

public class CalendarSyncAdapterService extends Service {

 private static SyncAdapterImpl sSyncAdapter = null;
 static MeetingsDatabaseAdapter sync_Meetings = null;

 public CalendarSyncAdapterService() {
  super();
 }

 private static class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
  public SyncAdapterImpl(Context context) {
   super(context, true);
   mContext = context;
  }

 @Override
 public void onPerformSync(Account account, Bundle extras,
   String authority, ContentProviderClient provider,
   SyncResult syncResult) {

        account = null;
 account = AccountManager.getAccount( mContext, AccountManager.currentUser(mContext)
       .get("username_display").toString());
 try {
  if (account != null) {
               CalendarSyncAdapterService.performSync(mContext, account,
       extras, authority, provider, syncResult);
  }
 } catch (OperationCanceledException e) {
 }
      }

 private Uri asSyncAdapter(Uri uri, String account, String accountType) {
  return uri.buildUpon()
    .appendQueryParameter(
      CalendarContract.CALLER_IS_SYNCADAPTER, "true")
    .appendQueryParameter(Calendars.ACCOUNT_NAME, account)
    .appendQueryParameter(Calendars.ACCOUNT_TYPE, accountType)
    .build();
  }
 }

 @Override
 public IBinder onBind(Intent intent) {
  IBinder ret = null;
  ret = getSyncAdapter().getSyncAdapterBinder();
  return ret;
 }

 private SyncAdapterImpl getSyncAdapter() {
  if (sSyncAdapter == null)
   sSyncAdapter = new SyncAdapterImpl(this);
  return sSyncAdapter;
 }

 private static void performSync(Context context, Account account,
   Bundle extras, String authority, ContentProviderClient provider,
   SyncResult syncResult) throws OperationCanceledException {

  Log.i("SERVICE", "Calendar Service Start");
 }
}

使用您的帐户名创建您自己的日历

public long CreateCalendar(Account account) {

 Log.i("CALENDAR CREATED", "Calendar With by Account Name");
 ContentResolver cr = context.getContentResolver();
 ContentValues values = new ContentValues();
 values.put(Calendars.ACCOUNT_NAME, account.name);
 values.put(CalendarContract.Calendars.ACCOUNT_TYPE,
   CalendarContract.ACCOUNT_TYPE_LOCAL);
 values.put(Calendars.NAME, account.name);
 values.put(Calendars.CALENDAR_DISPLAY_NAME, account.name);
 values.put(Calendars.CALENDAR_COLOR, 0xFFFFFFFF);
 values.put(Calendars.CALENDAR_ACCESS_LEVEL,
   Calendars.CAL_ACCESS_OWNER);
 values.put(Calendars.OWNER_ACCOUNT, account.name);
 values.put(Calendars.SYNC_EVENTS, 1);
 values.put(Calendars.VISIBLE, 1);
 values.put(CalendarContract.Calendars.CALENDAR_TIME_ZONE, TimeZone
   .getDefault().getID());

 Uri creationUri = asSyncAdapter(Calendars.CONTENT_URI,
   account.name, account.type);

 Uri created = cr.insert(creationUri, values);
 long cal_id = Long.parseLong(created.getLastPathSegment());
 return cal_id;
}

在您创建的日历中创建事件

public void SyncEvent(long id, int meeting_id, String EventName,
   String Stime, String Etime, String Description) {

 Calendar cal = Calendar.getInstance();
 cal.setTimeZone(TimeZone.getTimeZone("GMT-1"));
 Date dt = null;
 Date dt1 = null;
 try {
  dt = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Stime);
  dt1 = new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(Etime);

  Calendar beginTime = Calendar.getInstance();
  cal.setTime(dt);

  // beginTime.set(2013, 7, 25, 7, 30);
  beginTime.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
  cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY),
  cal.get(Calendar.MINUTE));

  Calendar endTime = Calendar.getInstance();
  cal.setTime(dt1);

  // endTime.set(2013, 7, 25, 14, 30);
  // endTime.set(year, month, day, hourOfDay, minute);
  endTime.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
  cal.get(Calendar.DATE), cal.get(Calendar.HOUR_OF_DAY),
  cal.get(Calendar.MINUTE));

  ContentResolver cr = this.mContext.getContentResolver();
  ContentValues values = new ContentValues();

  values.put(Events.DTSTART, beginTime.getTimeInMillis());
  values.put(Events.DTEND, endTime.getTimeInMillis());
  values.put(Events.TITLE, EventName);
  values.put(Events.DESCRIPTION, Description);
  values.put(Events.CALENDAR_ID, id);
  // values.put(Events._ID, meeting_id);
  values.put(Events.EVENT_TIMEZONE, TimeZone.getDefault().getID());

  Uri uri = cr.insert(Events.CONTENT_URI, values);
  long eventID = Long.parseLong(uri.getLastPathSegment());
 } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}

检查设备中是否存在日历

public int queryCalendar(Account account) {

 Cursor cur = null;
 ContentResolver cr = this.mContext.getContentResolver();
 Uri uri = Calendars.CONTENT_URI;
 String selection = "((" + Calendars.ACCOUNT_NAME + " = '"
     + account.name + "'))";
 cur = cr.query(uri, CALENDAR_PROJECTION, selection, null, null);
 while (cur.moveToNext()) {
  return cur.getInt(0);
 }
 return 0;
}

检查事件是否在日历中

public boolean isEventInCal(Context context, String cal_meeting_id) {

 Cursor cursor = context.getContentResolver().query(
 Uri.parse("content://com.android.calendar/events"),
   new String[] { "_id" }, " _id = ? ",
   new String[] { cal_meeting_id }, null);

       if (cursor.moveToFirst()) {
  return true;
 }
 return false;
}

获取设备日历中所有注册的事件[所有日历]

public boolean all_Events(Context context) {

        boolean flag = false;
 Cursor cursor = context.getContentResolver().query(
  Uri.parse("content://com.android.calendar/events"),
   new String[] { "calendar_id", "title", "description",
     "dtstart", "dtend", "eventLocation", "_id",
     "allDay", "duration" }, null, null, null);

 if (cursor.moveToFirst()) {
 do {
           //all the EVENTS Will be fetched From Here Which 
           //Are registered under DEVICE
  } while (cursor.moveToNext());
    }
 return flag;
}

从您自己创建的日历中删除事件

public void event_Delete(long eventID) {

 // ContentResolver cr = this.mContext.getContentResolver();
  // ContentValues values = new ContentValues();
  Uri deleteUri = null;
  deleteUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventID);
  int rows = this.mContext.getContentResolver().delete(deleteUri,
   null, null);
  Log.i("Rows deleted: ", "" + rows);
 }

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 同步日历功能与自己的日历 的相关文章

随机推荐

  • Amazon AWS S3 目录结构效率

    我脑子里闪过一个简单的效率问题 我创建了一个 PHP 代码 用于将文件夹中的所有文件上传到 Amazon S3 上的存储桶 我的代码也能够以子文件的形式上传文件 而不会丢失其结构 基本上 用户必须登录我的网站 然后根据用户的帐户名 他们可以
  • 从 php 运行蹩脚

    我正在尝试从 php 脚本运行蹩脚 我已经尝试过这些 但没有运气 我没有得到任何回报 有任何想法吗 system lame returnarr system lame help returnarr exec lame returnarr p
  • 如何使用索引访问ListView中的委托属性

    我想访问委托属性ListView 我尝试过contentItem但有时是undefined 这是我的代码 ListModel id modeldata ListElement name don rank 1 ListElement name
  • 如何从领域数据库中查询具有不同结果的java

    我有一个Realm对象类 并在其中存储大量数据 想象我有一个String uid 场地 我想获取 uid 名称 但相同的 uid 名称只能获取一次 例如 uid AA AA BB CC DD BB BB 我想得到只是 AA BB CC DD
  • 具有两个或多个参数的 ITransformableFilterValues 接口 [SharePoint WebParts]

    我使用 Sharepoint 并尝试使用多个参数连接 Web 部件 我的问题是如何将多个参数从自定义 Web 部件传递到另一个参数 我可以通过在自定义 webpart 中实现 ITransformableFilterValues 接口来传递
  • eclipse 在无限循环中开始“构建工作区”

    是否可以在 Eclipse 中调试哪个进程触发了 构建工作区 我有一个带有一些 BIRT 报告的 Java 项目 当该项目打开时 Eclipse 将无限循环地重新启动 构建工作区 我正在使用 Eclipse 3 6 1 和 BIRT 2 6
  • 理解“随机性”

    我无法理解这个问题 哪个更随机 rand OR rand rand 我发现这是一个真正的脑筋急转弯 你能帮我吗 EDIT 直觉上我知道数学答案是它们同样随机 但我忍不住认为 如果你在将两者相乘时 运行随机数算法 两次 你会创建比仅仅做更随机
  • 为什么 String.match( / \d*/ ) 返回空字符串?

    有人可以帮助我理解为什么使用 d 返回包含空字符串的数组 而使用 d 返回 100 如预期 我明白为什么 d 有效 但不明白为什么 d 不起作用 使用 是否会导致它返回零长度匹配 这到底是如何工作的 var str one to 100 v
  • 实体框架:跳过/接受功能

    我只是好奇 Skip 和 Take 函数如何在 Entity Framework 中工作 使用 EF 6 1 If I do db Events OrderByDescending x gt x Date Take maxPageSize
  • Zend Framework 不允许我包含 Google Maps API

    我遇到这个问题 我想使用引导程序中的 HeadScript Helper 将 Google Maps API 添加到我的 Zend Framework 应用程序中 view gt headScript gt appendFile stati
  • 使用 Masm 的浮点数据示例

    有人能给我一个如何在 MASM 数据部分定义浮点数或常量的例子吗 或者至少有一些关于它的信息 我认为已经完成了 data myVar REAL4 1 0f code Masm 中的浮点值为 REAL4 REAL8 或 REAL10 表达式
  • 全局 PHP CONSTANT 在类文件中可用吗?

    全局 PHP CONSTANT 在类文件中可用吗 define SITE PATH C webserver htdocs somefolder 然后在我的班级文件中我尝试这个 public debug file SITE PATH debu
  • Aurelia 委托与触发器:您如何知道何时使用委托或触发器?

    我正在尝试学习如何使用 Aurelia 框架 这样做时 我正在阅读文档here https github com aurelia documentation blob master old English docs md event mod
  • GNU GCC 编译器更新

    我正在使用 gnu gcc 编译器的代码块 但是当我尝试编译开始的范围基础时 它给出了许多错误 所以我认为编译器不支持C 0x 所以我想知道如何知道我正在使用的编译器版本以及如何将其正确更新到 C 0x 支持版本 我使用的是Windows
  • 编译 opencv 框架时出现未知错误:未定义符号:“_CGImageDestinationCreateWithURL”

    Xcode 给了我以下错误 我真的不知道该怎么做 这让我发疯 我正在导入 OpenCV 框架 因此问题可能存在或与编译器相关 谁能告诉我该怎么做或寻找什么 Undefined symbols CGImageDestinationCreate
  • Access 2010 的 INSERT INTO 语句中的语法错误

    我的 INSERT 语句显然有语法错误 有人可以解释一下为什么会这样吗 Private Sub Register Click 1 ByVal sender As System Object ByVal e As System EventAr
  • [空手道][独立]错误:无法找到或读取文件

    我只使用最新的独立空手道 jar 在配置了 JRE 的 docker 容器上测试我的 API 并且没有任何 Java 代码 目前 在我的一项功能中 我有这个 read file json 当资源文件与功能文件位于同一目录时 它可以正常工作
  • C# winforms numericupdown 控件

    我正在使用 numericupdown 控件 当以编程方式分配值或用户更改值时 将触发 ValueChanged 事件 我希望仅当用户更改值时触发事件 而不是在我设置最小值和最大值时触发 如何做呢 基于 TheVillageIdiot 的答
  • spring-boot 从 1.3.2 升级到 1.3.3:logback 问题

    从 spring boot 1 3 2 升级到最近发布的 1 3 3 时 我们遇到了一个问题 我们的应用程序一直在使用以下依赖项 每个都是最新的 没有问题
  • Android 同步日历功能与自己的日历

    我已经展示了如何为我们自己的帐户设置自己的sync calendar功能以及我们如何将我们自己的事件同步到 的技术 在清单中授予读取和写入日历的权限