在Android M上,如何配置“直接共享”function(图像,文本)以及如何查询项目?

背景

根据Android M上的新function( 此处链接),应用程序外部的应用程序可以提供直接分享其活动之一的意图,例如,允许聊天应用程序将内容分享给确切的联系人,因此您同时选择聊天应用程序和联系人(一步而不是两步)。 这可以在这张图片上显示:

在此处输入图像描述

或者,至少这是我从中理解的。

这个问题

关于这个新function,我有两个问题:

  1. 在描述中,它们只显示清单中的内容,并提及使用“ChooserTargetService”。 为了提供文本和图像应该做些什么?

  2. 我想知道如何做相反的事情:如何查询所有这些“直接共享”项目(图像,文本和意图)并能够在自定义对话框中显示它们?

    我想这样做,因为我自己有一个自定义对话框,允许选择分享内容和方式,而不仅仅是通过哪个应用程序。

  • 将Android:name =“something”添加到Cordova plugin.xml的AndroidManifest.xml“application”标签中
  • 数据目录在Android中没有读/写权限
  • 我试图通过adb测试Android深层链接url来启动我的应用程序
  • 当我的minSdkVersion小于X时,是否可以在清单中设置API级别X属性?
  • 如何将我的Activity设置为android中的主要活动?
  • 创build系统应用程序
  • 可以从我的Android应用程序设置系统日期时间吗?
  • uses-sdk元素不能具有“tools:node”属性
  • 问题1

    在描述中,它们只显示清单中的内容,并提及使用“ChooserTargetService”。 为了提供文本和图像应该做些什么?

    首先扩展ChooserTargetService 。 您需要返回ChooserTarget List ,以及如何创建这些目标完全取决于您。

     public class YourChooserTargetService extends ChooserTargetService { @Override public List onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) { final List targets = new ArrayList<>(); for (int i = 0; i < length; i++) { // The title of the target final String title = ... // The icon to represent the target final Icon icon = ... // Ranking score for this target between 0.0f and 1.0f final float score = ... // PendingIntent to fill in and send if the user chooses this target final PendingIntent action = ... targets.add(new ChooserTarget(title, icon, score, action)); } return targets; } } 

    AndroidManifest

    现在,您需要在AndroidManifest声明您的ChooserTargetService并执行以下两项操作:

    1. 使用android.permission.BIND_CHOOSER_TARGET_SERVICE权限绑定Service
    2. android.service.chooser.ChooserTargetService操作中包含一个IntentFilter

    例如:

          

    在将要处理IntentActivity中,您需要添加meta-data标记android.service.chooser.chooser_target_service 。 例如:

             

    从这里开始,主要是调用Intent.createChooser ,然后在用户选择应用程序时处理数据。

     final Intent target = new Intent(Intent.ACTION_SEND); target.setType("text/plain"); target.putExtra(Intent.EXTRA_TITLE, "Your title"); target.putExtra(Intent.EXTRA_TEXT, "Your text"); startActivity(Intent.createChooser(target, "ChooserTargetService Example")); 

    结果

    结果

    注意事项

    每个ChooserTarget的排名分数用于对目标进行排序,但仅在UI决定使用它时使用。 根据ChooserTarget.getScore

    当从多个源排序和合并目标时,显示目标的UI 可以考虑该分数

    此外,据我所知,此function尚未在Android MNC预览中实现。 ChooserActivity包含一个TODO

    TODO:通过排名得分来维持排序

    在创建新的android.graphics.drawable.Icon ,您需要使用其中一个static初始值设定项。

     Icon.createWithBitmap(); Icon.createWithContentUri() Icon.createWithData() Icon.createWithFilePath() Icon.createWithResource() 

    问题2

    我想知道如何做相反的事情:如何查询所有这些“直接共享”项目(图像,文本和意图)并能够在自定义对话框中显示它们?

    提供给ChooserTargetService.onGetChooserTargets的数据是动态的。 因此,据我所知,没有直接访问这些项目的方法。

    我对这个未来有不同的理解。

    到目前为止,当用户想要分享他们被要求选择他们想要与之共享的应用程序时,然后该应用程序处理了共享。

    现在,用户不会选择应用程序,而是从将处理共享的应用程序中选择内容。 每个这样的选项都封装在android.service.chooser.ChooserTargetService

    因此,正如您在图像上看到的那样,它显示了ChooserTargetService一些产品,用户可以看到一些联系人ui,而无需进行午餐或共享。

    我相信你的对话可以以同样的方式触发。