Intent ACTION_SEND 不显示每个浏览器
Intent ACTION_SEND doesn't show every browser
我有一个按钮,点击时会触发 ACTION_SEND 意图,如下所示:
private static final String WEB_URL = "https://www.google.ca/";
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, WEB_URL);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, "CHOOOOOSE"));
}
目前,它还有一些其他的应用程序,'Copy to clipboard',和'Add to Firefox'可以用来在Firefox中打开link。但是,我想让用户决定使用哪个浏览器应用程序来打开 link,但是当我使用的这个设备有 'Chrome' 并且 'Add to Firefox' 似乎是现在唯一的选择'Internet' 申请也是如此。
最终,我想要的是一个分享按钮,在点击事件中,它会显示所有已安装的浏览器应用程序,如 chrome、firefox、'internet' 等,'Copy to clipboard' ,以及任何其他应用程序(<- 不过这些都不是必需的)。
显示所有浏览器应用程序,以及一个按钮“复制到剪贴板”是我真正想要的。
'WEB_URL' 字符串总是正确的 url。
如何实现?
编辑
总结一下:
我想要 'Intent.createChooser()' 显示的应用程序列表,其列表包含所有浏览器应用程序和一个 'Copy to clipboard' 选项。
我尝试将 Intent.ACTION_VIEW 与 intent.setData(Uri.parse(url)) 一起使用,但在这种情况下,它没有 'Copy to clipboard'选项。
解决方案
经过一番研究,我能够实现上述目标。
关键是使用 'Intent.EXTRA_INITIAL_INTENTS' 和自定义 Activity。
一些Activity的onClick事件
private static final String WEB_URL = "https://www.google.ca/";
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(WEB_URL));
Intent clipboardIntent = new Intent(SomeActivity.this, CopyToClipboardActivity.class);
clipboardIntent.setData(Uri.parse(WEB_URL));
Intent chooserIntent = Intent.createChooser(intent, "Custom Title...");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {clipboardIntent});
startActivity(chooserIntent);
}
将 'CopyToClipboardActivity' 添加到清单
<activity android:name=".activities.CopyToClipboardActivity"
android:exported="false"
android:icon="@drawable/someIcon"
android:label="@string/copy_to_clipboard"
android:theme="@android:style/Theme.NoDisplay"/>
CopyToClipboardActivity.java
public class CopyToClipboardActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
if (uri != null) {
copyTextToClipboard(uri.toString());
Toast.makeText(this, "Link copied to clipboard", Toast.LENGTH_SHORT).show();
}
// Finish right away. We don't want to actually display a UI.
finish();
}
private void copyTextToClipboard(String url) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("URL", url);
clipboard.setPrimaryClip(clip);
}
}
我有一个按钮,点击时会触发 ACTION_SEND 意图,如下所示:
private static final String WEB_URL = "https://www.google.ca/";
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_TEXT, WEB_URL);
intent.setType("text/plain");
startActivity(Intent.createChooser(intent, "CHOOOOOSE"));
}
目前,它还有一些其他的应用程序,'Copy to clipboard',和'Add to Firefox'可以用来在Firefox中打开link。但是,我想让用户决定使用哪个浏览器应用程序来打开 link,但是当我使用的这个设备有 'Chrome' 并且 'Add to Firefox' 似乎是现在唯一的选择'Internet' 申请也是如此。
最终,我想要的是一个分享按钮,在点击事件中,它会显示所有已安装的浏览器应用程序,如 chrome、firefox、'internet' 等,'Copy to clipboard' ,以及任何其他应用程序(<- 不过这些都不是必需的)。
显示所有浏览器应用程序,以及一个按钮“复制到剪贴板”是我真正想要的。
'WEB_URL' 字符串总是正确的 url。
如何实现?
编辑
总结一下:
我想要 'Intent.createChooser()' 显示的应用程序列表,其列表包含所有浏览器应用程序和一个 'Copy to clipboard' 选项。
我尝试将 Intent.ACTION_VIEW 与 intent.setData(Uri.parse(url)) 一起使用,但在这种情况下,它没有 'Copy to clipboard'选项。
解决方案
经过一番研究,我能够实现上述目标。
关键是使用 'Intent.EXTRA_INITIAL_INTENTS' 和自定义 Activity。
一些Activity的onClick事件
private static final String WEB_URL = "https://www.google.ca/";
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(WEB_URL));
Intent clipboardIntent = new Intent(SomeActivity.this, CopyToClipboardActivity.class);
clipboardIntent.setData(Uri.parse(WEB_URL));
Intent chooserIntent = Intent.createChooser(intent, "Custom Title...");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {clipboardIntent});
startActivity(chooserIntent);
}
将 'CopyToClipboardActivity' 添加到清单
<activity android:name=".activities.CopyToClipboardActivity"
android:exported="false"
android:icon="@drawable/someIcon"
android:label="@string/copy_to_clipboard"
android:theme="@android:style/Theme.NoDisplay"/>
CopyToClipboardActivity.java
public class CopyToClipboardActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
if (uri != null) {
copyTextToClipboard(uri.toString());
Toast.makeText(this, "Link copied to clipboard", Toast.LENGTH_SHORT).show();
}
// Finish right away. We don't want to actually display a UI.
finish();
}
private void copyTextToClipboard(String url) {
ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("URL", url);
clipboard.setPrimaryClip(clip);
}
}