如何将"复制到剪贴板"添加到自定义IntentChooser?

dea*_*ish 3 clipboard android share

根据此解决方案,我想在自定义共享对话框中添加"复制到剪贴板"操作 - 与默认操作共享提供程序中的操作相同.

在此输入图像描述

我试过的是加入if clausule语句,packageName.contains("clipboard")但没有成功.

String packageName = ri.activityInfo.packageName;
    if(packageName.contains("android.email")) {
        emailIntent.setPackage(packageName);
    } else if(packageName.contains("twitter") || packageName.contains("facebook") || packageName.contains("mms") || packageName.contains("android.gm")) {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName(packageName, ri.activityInfo.name));
        intent.setAction(Intent.ACTION_SEND);
        intent.setType("text/plain");
        if(packageName.contains("twitter")) {
            intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_twitter));
        } else if(packageName.contains("facebook")) {
            intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_facebook));
        } else if(packageName.contains("mms")) {
            intent.putExtra(Intent.EXTRA_TEXT, resources.getString(R.string.share_sms));
        } else if(packageName.contains("android.gm")) {
            intent.putExtra(Intent.EXTRA_TEXT, Html.fromHtml(resources.getString(R.string.share_email_gmail)));
            intent.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.share_email_subject));               
            intent.setType("message/rfc822");
        }

        intentList.add(new LabeledIntent(intent, packageName, ri.loadLabel(pm), ri.icon));
    }
Run Code Online (Sandbox Code Playgroud)

整个代码用于/sf/answers/1264768571/.

adb shell pm list packages 返回我的包名列表但没有这个短语.

我可以以某种方式获取剪贴板的包名称将其添加到我的自定义共享提供程序列表中吗?

以下是"复制到剪贴板"选项的示例:

在此输入图像描述

mat*_*ash 10

诀窍是实际上没有用于剪贴板的内置包(一些应用程序通过使用适当的intent-filter创建这样的包来提供系统范围内的Copy to Clipboard选项).

但是,由于您手动创建选择器的选项,因此您可以添加自己的意图来处理复制到剪贴板操作.例如,像这样:

... create the intentList, as before ...

// Add a custom intent to handle the "copy to clipboard" option.
Intent copyToClipboard = new Intent(this, ShareToClipboardActivity.class);
copyToClipboard.putExtra(Intent.EXTRA_TEXT, "text to copy to clipboard");

// Wrap it with a LabeledIntent and add it to the list of choosable ones.
LabeledIntent labeledCopyToClipboard = new LabeledIntent(copyToClipboard, getPackageName(), "Copy!", 0);
intentList.add(labeledCopyToClipboard);

... convert intentList to array and show chooser, as before ...
Run Code Online (Sandbox Code Playgroud)

ShareToClipboardActivity你自己的活动在哪里,哪个(至少)这个:

public class ShareToClipboardActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        CharSequence text = getIntent().getCharSequenceExtra(Intent.EXTRA_TEXT);
        ClipboardManager clipboardManager = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
        clipboardManager.setPrimaryClip(ClipData.newPlainText(null, text));
        finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个简单的示例:您可能需要可绘制和字符串资源LabeledIntent,以及可能显示Toast消息ShareToClipboardActivity,使用旧的ClipboardManagerif if pre-API 11&c.


Man*_*ani 5

更新: 我的解决方案依赖于另一个应用程序包,我意识到这可能不是正确的方法。因此,建议按照此答案中的另一个建议,定义您自己的文件Activity,该文件将使用来处理复制和粘贴功能。ClipboardManager

原始答案

Clipboard 活动详情:

  • 包裹名字 : com.google.android.apps.docs
  • 活动名称: com.google.android.apps.docs.app.SendTextToClipboardActivity

以下Intent代码将启动并执行clipboard活动。

Intent i = new Intent();
i.setComponent(new ComponentName("com.google.android.apps.docs", "com.google.android.apps.docs.app.SendTextToClipboardActivity"));
i.setAction(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, "text to copy to clipboard");
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

您可以if在将其添加intent到中时添加适当的子句intentList。