如何从外部打开Android Outlook应用程序

时间:2019-08-23 01:38:28

标签: android android-intent outlook microsoft-graph msal

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

Msal图形库对我进行身份验证和检索的形式有很大帮助,其中包含每个事件/消息结果的标识符

但是现在我想知道用户设备上是否安装了Outlook应用程序,以及当用户单击窗口小部件时是否可以打开Outlook。此外,用户是否可以打开带有标识符的相应单击事件或消息。

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

致谢

4 个答案:

答案 0 :(得分:3)

我不认为这是正式记录在某处。但是,这是您可以找到的解决办法。

您可以列出设备上安装的所有Microsoft应用程序...

        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中显示的“启动意图”。您可以使用它来启动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值

答案 1 :(得分:3)

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

请尝试使用以下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适用于您的情况。

如果该网址有效,或者您还有其他相关问题,请在此处回复。我要求这对夫妇也要密切注意这一话题。

答案 2 :(得分:0)

好吧,我在您的代码@Leo的帮助下成功打开了Outlook Android应用程序。由于我不是用Kotlin开发的,因此请在下面张贴Java代码:

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

下面的代码在图形API的webLink属性提供的Web浏览器中打开事件/消息。 (我仅测试事件,提供的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

答案 3 :(得分:0)

您好,您可以尝试使用以下网址之一打开事件:

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