调试意图

时间:2010-12-12 21:50:37

标签: java android android-intent

我之前问过一个问题,当我发送一个含有ACTION_SEND和MIME类型" image / png"的Intent时,会出现在IntentChooser中的内容。问题是,有些手机带有一个默认的消息应用程序没有出现在列表中,包括我的(myTouch 4G)以及通过电子邮件(使用HTC EVO)与之交谈的用户。如果我从内置图库应用程序或同一图像上的其他应用程序中选择“发送”或“共享”选项,我将保存并尝试直接从我的应用程序发送,消息将显示在列表中。从我的应用程序它没有。其他手机没有这个问题,所以它显然是一个平台特定的东西。但这并不意味着我应该忽略这个问题。

所以,我去解决这个问题。我在我的应用程序中注册了一个活动以接收相同类型的意图,然后点击断点来分析从两种不同的发送方式发送的Intent对象。

问题是,我发送的意图和从Gallery或AndroZip发送的意图(消息确实出现在选择器中)似乎是相同的。它们都具有相同的动作,相同的类别,相同的标志,相同的mime类型。还有什么我可以在Gallery或AndroZip的Intent上检查,以告诉我是否有更多信息可以添加到我的Intent中以使默认消息传递应用程序出现在选择器中,如果不是这样的话?

3 个答案:

答案 0 :(得分:8)

问题是HTC Sense手机特有的,因为它们的图库和信息应用程序与库存应用程序不同。

具体而言,从Gallery发送到Messaging的Intent的行为android.intent.action.SEND_MSGandroid.intent.action.SEND不同。与股票消息传递应用程序不同,Sense消息传递应用程序无法处理SEND。

问题就变成了,Sense Gallery应用程序如何创建一个结合了SEND和SEND_MSG的活动选择器对话框?

我已经完成了一些研究并且最终得到了...下面的代码可以工作,但是对话框中的“消息”条目显示在顶部而不是按照字母顺序排列。毫无疑问,对意图的更多研究会纠正这种情况,但至少这有用:

    // Create a chooser for things that can ACTION_SEND images
    Intent intent = new Intent(Intent.ACTION_SEND);
    Uri data = Uri.parse("content://media/external/images/media/98");
    intent.putExtra(Intent.EXTRA_STREAM, data);
    intent.setType("image/jpeg");
    Intent chooser = Intent.createChooser(intent, "Blah");

    // Add the stupid HTC-Sense-specific secondary intent
    Intent htcIntent = new Intent("android.intent.action.SEND_MSG");
    htcIntent.putExtra(Intent.EXTRA_STREAM, data);
    htcIntent.setType("image/jpeg");  
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent });

    // Show the chooser
    startActivity(chooser);

答案 1 :(得分:1)

首先,给鲁本+1,他是天才,不是我。但我不得不修改他的代码以使其工作。基本上我不得不把onExtra()放在htcIntent上,或者图像永远不会卡在意图上。

在Droid X和HTC Incredible上进行测试和验证(由于Reuben,此问题一直存在问题)。

Uri uri = Uri.fromFile(new File(mFile));  
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.setType("image/png"); 

Intent htcIntent = new Intent("android.intent.action.SEND_MSG");
htcIntent.setType("image/png");
htcIntent.putExtra(Intent.EXTRA_STREAM, uri);

Intent chooser = Intent.createChooser(intent, "Send Method");
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent });
startActivity(chooser);

编辑:我意识到我现在正在将图像放在两个Intent上,但我无法以任何其他方式使用它。

答案 2 :(得分:0)

为什么不尝试比较启动选择器的方式与图库的操作方式,而不是调试意图。毕竟它是开源的,所以你可以从原因进行调试,而不是试图猜测结果的问题。

https://android.googlesource.com/platform/packages/apps/Gallery3D