如何从外部应用程序打开安卓的Outlook应用程序。

9

我目前正在开发一款Android应用程序,以显示主屏幕小部件。这些小部件与Microsoft Outlook(事件+消息)相关,以显示动态磁贴中的传入事件和未读新消息。

Msal图形库帮助我进行身份验证并检索包含每个事件/消息结果标识符的信息

但现在我想知道Outlook应用程序是否已安装在用户设备上,并且是否有一种方法可以在用户单击小部件时打开Outlook。此外,用户是否可以使用标识符打开相应的单击事件或消息。

例如,事件小部件当前显示一个生日事件。用户单击它。然后它会打开Outlook并直接显示那个生日事件。

谢谢

4个回答

5

我正在转达一些内部人士的建议:

请尝试使用以下URL之一打开事件:

  1. ms-outlook://events/open?restid=%s&account=test@om.com(如果您有常规REST id)

  2. ms-outlook://events/open?immutableid=%s&account=test@om.com(如果您正在使用不可变ID)

由于不可变ID仍处于Microsoft Graph的预览阶段,并且客户不应在其生产应用程序中使用预览API,因此我认为选项#1适用于您的情况。

如果URL有效或无效,请在此处回复,如果您有其他相关问题,请告知。 我请求那几位关注此帖子。


感谢@Angelgolfer-ms的帮助,我非常感激!这些网址对我来说不起作用。以下是我的代码:String iCalUID = intent.getStringExtra(EXTRA_CALENDAR_iCalUId);String deepLink = "ms-outlook://events/open?restid=%s&account=@.**"; deepLink = String.format(deepLink, iCalUID);Intent intentDL = new Intent(Intent.ACTION_VIEW); intentDL.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intentDL.setData(Uri.parse(deepLink)); context.startActivity(intentDL); - Predalpha
我已经尝试过使用iCalUID和Id,但都没有成功。最好的结果是弹出一个消息提示,说明Outlook无法打开该事件。我正在使用的标识符来自于该请求: mClient.me().calendars(calendar.id).calendarView().buildRequest(options) .top(20) .select("subject,bodyPreview,organizer,start,end,isAllDay,webLink,iCalUId") - Predalpha
@Predalpha,我已经向内部同事转达了您的结果。 - Angelgolfer-ms
@Predalpha,你能找到解决方案吗? - Pablo Pantaleon
我没有找到任何解决方案。只有微软安卓应用程序的开发人员才能提供答案。我使用了安卓通知来实现这个问题的解决,尽管这并不完美。 - Predalpha

5

我不认为有正式的文件记录这个。但是你可以做些什么来了解它。

你可以列出设备上安装的所有微软应用程序...

        val packages = context.packageManager
            .getInstalledApplications(PackageManager.GET_META_DATA)

        for (info in packages) {
            if(info.packageName.startsWith("com.microsoft", true)){
                Log.d("package name:" + info.packageName)
                Log.d("Launch Activity: " + context.packageManager.getLaunchIntentForPackage(info.packageName))
            }
        }

在LogCat中记下“启动意图(launch intent)”。您可以使用该意图来启动Outlook应用程序。只需确保您不会硬编码这些值,因为Microsoft随时可以更改这些值,例如活动类可能会更改。所以,不要像这样做...

context.startActivity(
            Intent().apply {
                action = Intent.ACTION_MAIN
                addCategory(Intent.CATEGORY_LAUNCHER)
                setPackage("com.microsoft.office.outlook")
                component = ComponentName("com.microsoft.office.outlook", "com.microsoft.office.outlook.MainActivity")
            }
        )

请执行以下操作...

context.startActivity(
            Intent().apply {
                action = Intent.ACTION_MAIN
                addCategory(Intent.CATEGORY_LAUNCHER)
                component = ComponentName(
                   outlookLaunchIntent?.component?.packageName, 
                   outlookLaunchIntent?.component?.className
                )
                setPackage(outlookLaunchIntent.package)
            }
        )

另外,请记住getLaunchIntentForPackagecomponent可能会返回null,因此请确保您适当地检查null值。


谢谢@Leo提供的好答案。我最近几天非常忙。我会尽快尝试实现你的解决方案并给你反馈。 - Predalpha
从Android 11开始,getInstalledApplications不提供有关所有应用程序的信息。 - kotoMJ
@kotoMJ,这个答案中建议的重载并没有被弃用。被弃用的是那个不接受任何参数的重载。 - Leo

0

你好,您可以尝试使用以下其中一个URL打开事件:

  • ms-outlook://events/open?restid=%s&account=test@om.com (如果用户拥有REST ID)
  • ms-outlook://events/open?immutableid=%s&account=test@om.com (如果用户拥有不变ID)

你好,Utkarsh Srivastav,这两个URL尝试打开Outlook Android应用程序,但可能存在我的事件ID或其他问题,因为Outlook没有获得焦点。如果我按系统按钮以获取所有打开的应用程序,则可以看到。使用[restid] URL,Outlook应用程序向我显示一个烤面包消息“无法打开事件”。这是restid =“AQMkADAwATZiZmYAZC05MjQ1LWNlNGMtMDACLTAwCgBGAAADlTUrKZqmfk%2BrNABlMa7wSwcAbUarDFvXZUeDZALCGxo5UgAAAgENAAAAbUarDFvXZUeDZALCGxo5UgACxC11rgAAAA%3D%3D” - Predalpha
ms-outlook://events/open?restid={id} 这在iOS上可以工作,但在Android上不行。有人知道如何解决这个问题吗? - Robert P
仍然无法工作,我怀疑我们不会在这个问题上找到解决方法。 - Predalpha

0

嗯,我成功地使用你的代码@Leo打开了Outlook Android应用程序。由于我不是使用Kotlin进行开发,因此我将在下面发布JAVA代码:

Intent outlookLaunchIntent =  context.getPackageManager().getLaunchIntentForPackage("com.microsoft.office.outlook");
                if (outlookLaunchIntent  != null) {
                    context.startActivity(outlookLaunchIntent );
                }

以下是打开Web浏览器中的事件/消息的代码,由图形API的webLink属性提供。(我只测试了事件,提供的URL无法工作。我会在StackOverFlow上发布一个新问题,但您已经在那里看到了这个问题:https://github.com/microsoftgraph/microsoft-graph-docs/issues/4203
try {
                    Intent webIntent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(calendarWebLink));
                    webIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(webIntent);
                } catch (RuntimeException e) {
                    // The url is invalid, maybe missing http://
                    e.printStackTrace();
                }

然而,我仍然卡在我的小部件项点击的决定性目标上,即在Microsoft Outlook Android应用程序中打开相关事件/电子邮件。

Microsoft Outlook Android应用程序包含可以实现我所寻找的功能的小部件。因此,我想知道是否可能列出其广播接收器。

我发现的最好的东西是该应用程序的旧清单,但它对我没有帮助。 https://gist.github.com/RyPope/df0e61f477af4b73865cd72bdaa7d8c2


有人知道我可以在哪里联系微软获取这种信息吗? - Predalpha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接