使用Linkify的ACTION_CALL意图?

时间:2015-04-22 22:07:16

标签: android android-intent linkify

我有几个包含电话号码的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只包含一个电话号码,我想我会保持正则表达式简单。这很好。

除了我认为我得到Intent.ACTION_DIAL而不是Intent.ACTION_CALL。

将电话号码显示在活动中作为可点击链接的最简单方法是什么,点击该链接拨打电话,而不是只是拨打拨号器?

1 个答案:

答案 0 :(得分:1)

您可以通过模拟相同的行为来跳过整个linkify业务:

使用 SpannableString 为TextView中的文本加下划线:

String udata="1-800-BUY-MY-STUFF";
SpannableString content = new SpannableString(udata);
content.setSpan(new UnderlineSpan(), 0, udata.length(), 0);
mTextView.setText(content);

然后在XML中,将TextView的文本颜色设置为#05c5cf

之后,您需要调用clickPhone方法。