ShareActionProvider - 绘图应用程序的setShareIntent

时间:2012-08-23 14:42:23

标签: android

我正在开发一个绘图应用程序,我想允许用户在电子邮件,社交网络等中分享他的绘图。我知道,有一个 ShareActionProvider 类,但是有一个一个大问题。

我的应用程序内容快速更新,因此每次用户开始或结束绘图时我都无法调用setShareIntent()。很明显,当用户按下分享按钮时,应该创建意图。但是,遗憾的是,没有点击监听器或类似的东西。这是一个问题。

任何解决方案?

4 个答案:

答案 0 :(得分:3)

为您的应用添加操作栏。

然后,您可以在操作栏中添加“共享”图标:

<item android:id="@+id/action_share"
  android:icon="@android:drawable/ic_menu_share" ... />

public boolean onOptionsItemSelected(MenuItem item) {
  switch (item.getItemId()) {
    case R.id.action_share:
      Intent intent = new Intent(Intent.ACTION_SEND);
      intent.setType("image/jpeg");
      intent.putExtra(Intent.EXTRA_SUBJECT, "Subject text");
      intent.putExtra(Intent.EXTRA_TEXT, "Detailed description");
      intent.putExtra(Intent.EXTRA_STREAM, getPubliclyAccessibleUriOfAnImage());
      startActivity(Intent.createChooser(intent, "Share my dynamic image"));
      return true;

使用MENU项目可能是另一种解决方案,但它不是很时髦。

答案 1 :(得分:2)

这个答案没有解决方案,如果不完全自己动手,我就无法评估这项任务。

我完全同意,它应该在需要时使用监听器来提取数据,但同时它以这种方式工作,因为它只显示可以处理意图的应用程序。

这意味着您必须先提供意图才能共享它,让<intent-filter>做他们的事情并过滤不兼容的活动。当过滤器包含一个过滤Uri和MimeType的<data>元素时会出现问题。

让我们尝试解决这个问题。

使用OnShareTargetSelectedListener

@hannes arch正在寻找某些内容,但答案中缺少答案,即doSomeStuff的实施。

啊它返回布尔值,让我们更新意图并执行startActivity(intent)并返回true以表示我们处理了它。 事实证明ShareActivityChooserModelPolicy忽略了onShareTargetSelected的返回值,因此我们无法使用它。

这样做是有效的,但它会对不同内容(原始意图和修改过的内容)的相同活动开放。对用户不太好。

扩展ShareActionProvider

并复制ShareActivityChooserModelPolicy所需的逻辑并返回从侦听器返回的值。这样我们的return true就可以了。相反,它没有。我们失去了拥有所选应用程序历史记录的能力。

扩展ShareActionProvider取2

我尝试过并试过,即使有令人讨厌的反思和setAccessible调用,也没有办法扩展这个类。它太僵硬了。

复制ShareActionProvider

及相关课程。不,它不会工作,它有一些Android内部类依赖。

结束语

我只是想知道

  

行为是可扩展的,ShareActionProvider的扩展可以根据历史文件(如果适用)执行不同的行为和排名。

表示来自https://developer.android.com/guide/topics/ui/actionbar.html

答案 2 :(得分:1)

这是我的方式

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.mymenu, menu);

    MenuItem actionItem = menu.findItem(R.id.mymenu_item);
    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);       actionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() {

    public boolean onShareTargetSelected(ShareActionProvider source,
                Intent intent) {
            doSomeStuff();//TODO
            return false;
    }} );
    actionProvider.setShareIntent(createShareIntent());

    MenuItem overflowItem = menu.findItem(R.id.mymenu_item);
    ShareActionProvider overflowProvider = (ShareActionProvider) overflowItem.getActionProvider();
    overflowProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
    overflowProvider.onPerformDefaultAction();
    overflowProvider.setShareIntent(createShareIntent());

    return super.onCreateOptionsMenu(menu);
}

答案 3 :(得分:0)

我用android.support.v7.app.ActionBarActivity衍生物遇到了类似的问题(虽然我认为这种方法适用于任何活动)并且我覆盖onPrepareOptionsMenu并获得了你想要的效果:

private ShareActionProvider actionProvider;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.mymenu, menu);

    // get the share menu item
    MenuItem actionItem = menu.findItem(R.id.share_menu_item);
    actionProvider = (ShareActionProvider) actionItem.getActionProvider();

    return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (actionProvider != null) {
        actionProvider.setShareIntent(createShareIntent());
    }
    return super.onPrepareOptionsMenu(menu);
}

private Intent createShareIntent() {
    // ripped from @nicolas-raoul answer
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("image/jpeg");
    intent.putExtra(Intent.EXTRA_SUBJECT, "Subject text");
    intent.putExtra(Intent.EXTRA_TEXT, "Detailed description");
    intent.putExtra(Intent.EXTRA_STREAM, getPubliclyAccessibleUriOfAnImage());
    return intent;
}

另请参阅:Android setShareIntent within fragment