Android意图解析

时间:2012-02-19 13:01:26

标签: android android-intent

我正在构建一个搜索种子的应用程序。因此,当用户选择一个时,我想打开用户已安装的客户端(典型的基于意图的活动)。

在我的测试机器上,我安装了transdroid。 Transdroid以这种方式声明其意图: http://code.google.com/p/transdroid/source/browse/android/AndroidManifest.xml

我以这种方式启动活动:

    final Intent intent = new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url));
    activity.startActivity(intent);

虽然我认为这应该有效但是浏览器会启动。该URL是一个直接URL,以“torrent”结尾,因此它应与Transdroid的过滤器匹配。

我也尝试使用type="application/x-bittorrent"设置了setDataAndType,但我得到一个例外“找不到处理意图的活动”。

我知道Transdroid已正确安装,因为浏览器下载了torrent文件后,我可以点击它并打开Transdroid。

3 个答案:

答案 0 :(得分:0)

我尝试了一些代码,这个代码对我来说很有用(也就是说它是transdroid):

Intent i = new Intent(Intent.ACTION_VIEW);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("http://releases.ubuntu.com/lucid/ubuntu-10.04.3-alternate-amd64.iso.torrent"));
i.setType("application/x-bittorrent");

我不知道,但行为很奇怪。例如,如果我只更改两行,则启动浏览器:

Intent i = new Intent(Intent.ACTION_VIEW);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setType("application/x-bittorrent");
i.setData(Uri.parse("http://releases.ubuntu.com/lucid/ubuntu-10.04.3-alternate-amd64.iso.torrent"));

答案 1 :(得分:0)

startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://site.com/tor.torrent")));

请注意,您链接到的文件需要具有.torrent扩展名或者是mime类型的application / x-bittorrent。否则,Android的意图机制无法与Transdroid的Intent之一匹配,而是启动浏览器。如果您随后使用浏览器下载文件并“打开”它,它将打开Transdroid。

如果这不起作用,请告诉我们一个不起作用的torrent的示例网址。

如果您想了解尚未安装Transdorid的情况,您可以执行以下操作:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://site.com/tor.torrent");
if (context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)  > 0) {
    startActivity(i);
} else {
    // Alert that Transdroid is not available and link to the installer
}

或使用Intent选择器:

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://site.com/tor.torrent");
startActivity(Intent.createChooser(i, getString(R.string.some_dialog_title)));

答案 2 :(得分:0)

从android resurces,你可以找到一种检查意图是否存在的方法。

public static boolean isIntentAvailable(Context context, String action) {
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(action);
    List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
            PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

这是一个如何使用Barcode Scanner意图使用它的示例。

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    final boolean scanAvailable = isIntentAvailable(this,
            "com.google.zxing.client.android.SCAN");

    MenuItem item; item = menu.findItem(R.id.menu_item_add);
    item.setEnabled(scanAvailable);

    return super.onPrepareOptionsMenu(menu); 
}