【发布时间】:2015-04-22 22:07:15
【问题描述】:
我有几个带有包含电话号码的 TextViews 的活动。我需要的是,当用户单击一个时,电话会拨打该号码。而所谓的“拨号”,我的意思是拨号,而不是调出预装号码的拨号器,等待用户点击“拨号”。
换句话说,我想要 Intent.ACTION_CALL,而不是 Intent.ACTION_DIAL。
现在请记住,我对 Android 开发完全陌生,而且我才刚刚开始弄清楚如何将它们组合在一起。
我的第一次尝试很简单。在我的 XML 中:
<TextView
android:id="@+id/textPhoneNumber"
android:text="@string/the_phone_number"
android:autoLink="phone"
android:clickable="true"
android:onClick="clickPhone"
/>
然后在我的java中:
public void clickPhone(View view)
{
String phoneNumber = getString(R.string.the_phone_number);
Uri uri = Uri.parse("tel:" + phoneNumber);
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(uri);
startActivity(callIntent);
}
阅读了有关自动链接应该如何工作的更多信息,这显然比应有的工作要多,但确实有效...
直到我不得不对包含字母的电话号码做同样的事情。你知道那种:1-800-BUY-MY-STUFF。
问题是,Linkify.PHONE_NUMBERS 无法将包含字母的字符串识别为电话号码,因此我的字符串不会被呈现为链接。不过,onClick 仍然会归档,而且我仍然会得到我想要的行为。
所以,我深入研究了 autoLink 的实际作用,并阅读了一些关于 Linkify 的内容,并删除了我的 onCLick 并尝试使用自定义模式:
Pattern matchEverything = Pattern.compile("^.*$");
TextView textPhoneNumber = (TextView)findViewById(R.id.textPhoneNumber);
Linkify.addLinks(textPhoneNumbermatchEverything, "tel:");
由于我的 TextView 只包含一个电话号码,我想我会保持 Regex 简单。这很好用。
除了我认为我得到的是 Intent.ACTION_DIAL 而不是 Intent.ACTION_CALL。
让电话号码在活动中显示为可点击链接并让点击该链接拨打电话而不只是调出拨号器的最简单方法是什么?
【问题讨论】:
-
Linkify 应该提供 Intent.ACTION_DIAL 工具。因此,该主机应用程序根本不需要呼叫权限。如果您需要使用 Intent.ACTION_CALL 进行 Linkify,那么您需要通过您自己的自定义代码来模拟 Linkify 行为。
标签: android android-intent linkify