You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Things中Google API(日历、Gmail等)使用及权限兼容问题咨询

嘿,这个问题我刚好有过实操经验!Android Things因为没有常规安卓的账户绑定UI和系统级Google账户集成,确实没法用普通的Calendar API流程。不过咱们可以用**Google服务账号(Service Account)**来绕开这个限制,完全不需要用户交互,刚好适配无UI的设备场景。

下面是一步步的解决方案:

1. 先在Google Cloud控制台配置服务账号

  • 新建一个Google Cloud项目,找到并启用「Calendar API」;
  • 在「IAM与Admin」→「服务账号」页面创建一个新的服务账号,创建完成后下载对应的JSON密钥文件;
  • 把这个JSON密钥文件放到你的Android Things项目的assets目录下。

2. 添加必要的依赖

在模块的build.gradle里加入这些依赖(版本可以根据兼容性微调,Android Things 0.6.1建议用相对稳定的旧版本):

dependencies {
    implementation 'com.google.apis:google-api-services-calendar:v3-rev20220715-2.0.0'
    implementation 'com.google.oauth-client:google-oauth-client-android:1.34.1'
    implementation 'com.google.http-client:google-http-client-android:1.42.0'
    implementation 'com.google.api-client:google-api-client-gson:2.0.0'
}

同时别忘了在AndroidManifest.xml里添加网络权限:

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

3. 实现服务账号的认证逻辑

通过assets里的JSON密钥构建认证凭证,进而创建Calendar服务实例:

private Calendar getCalendarService() throws IOException {
    // 从assets读取服务账号密钥文件
    InputStream keyStream = getAssets().open("your-service-account-key.json");
    GoogleCredential credential = GoogleCredential.fromStream(keyStream)
            .createScoped(Collections.singleton(CalendarScopes.CALENDAR_READONLY)); // 按需选权限,比如CALENDAR是读写

    // 构建Calendar API服务客户端
    return new Calendar.Builder(
            AndroidHttp.newCompatibleTransport(),
            new GsonFactory(),
            credential)
            .setApplicationName("Your-Android-Things-App")
            .build();
}

4. 关键一步:共享目标日历给服务账号

服务账号是独立的身份,默认没法访问你的个人Google日历。你需要打开目标Google账户的日历页面,找到「设置和共享」→「添加人员」,输入服务账号的邮箱(在服务账号详情页能找到),并授予对应的权限(比如「查看所有事件」)。

5. 最后写代码获取日历事件

调用刚才的服务实例,就能拉取日历内容了,举个获取未来7天事件的例子:

try {
    Calendar calendarService = getCalendarService();
    String targetCalendarId = "primary"; // 如果是共享的日历,换成对应的日历ID
    DateTime now = new DateTime(System.currentTimeMillis());

    // 调用API获取事件列表
    Events events = calendarService.events().list(targetCalendarId)
            .setMaxResults(10)
            .setTimeMin(now)
            .setOrderBy("startTime")
            .setSingleEvents(true)
            .execute();

    List<Event> eventList = events.getItems();
    if (eventList.isEmpty()) {
        Log.d("CalendarDemo", "没有即将到来的事件");
    } else {
        for (Event event : eventList) {
            DateTime startTime = event.getStart().getDateTime();
            if (startTime == null) {
                startTime = event.getStart().getDate(); // 处理全天事件
            }
            Log.d("CalendarDemo", String.format("%s - %s", event.getSummary(), startTime));
        }
    }
} catch (IOException e) {
    Log.e("CalendarDemo", "访问日历失败", e);
}

一些注意事项

  • 服务账号的JSON密钥要妥善保管,绝对不能泄露给第三方;
  • Android Things 0.6.1版本较老,如果遇到依赖冲突(比如Apache HttpClient相关),可以在build.gradle里排除冲突的依赖;
  • 确保你的Android Things设备能正常连接外网,访问Google的API服务器。

内容的提问来源于stack exchange,提问作者Roberto Leinardi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:35:10