7

在新的 Android KitKat 设备(API 19、4.4)上运行我的应用程序时,我每次尝试创建 Intent 选择器时都会收到“复制到剪贴板”。这发生在 Youtube、Tumblr 和 Android KitKat 上的各种其他应用程序上。查看日志,我看到以下异常:

com.android.internal.app.ChooserActivity 泄露了 IntentReceiver com.android.internal.app.ResolverActivity$1@4150aac8

这曾经是当设备没有多个应用程序可以 Intent 时导致的问题(请参阅为什么 Intent.createChooser() 需要 BroadcastReceiver 以及如何实现?)。但是,在我的设备上并非如此。似乎在 Android API 19 中出现了问题。

4

2 回答 2

7

这是我针对此问题的解决方法。我首先检测设备是否在 KIT_KAT 或更高版本上运行,而不是创建选择器,我只是尝试启动意图。这将导致 Android 询问用户他们想要使用哪个应用程序完成操作(除非用户已经为所有 ACTION_SEND 意图设置了默认值。

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setType("text/plain");

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    // This will open the "Complete action with" dialog if the user doesn't have a default app set.
    context.startActivity(sendIntent);
} else {
    context.startActivity(Intent.createChooser(sendIntent, "Share Via"));
}
于 2013-11-07T03:11:21.247 回答
0

@clu 有正确的答案,只是向后大声笑。应该是这样的:

//Create the intent to share and set extras
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setType("text/plain");

//Check if device API is LESS than KitKat
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT)
    context.startActivity(sendIntent);
else
    context.startActivity(Intent.createChooser(sendIntent, "Share"));

此构建检查也可以缩短为单行:

//Create the intent to share and set extras
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.putExtra(Intent.EXTRA_TEXT, message);
sendIntent.setType("text/plain");

//Check if device API is LESS than KitKat
startActivity(Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ? sendIntent : intent.createChooser(sendIntent, "Share"));
于 2015-08-19T16:38:44.700 回答