android:電話番号のautoLinkが常に機能するとは限りません 質問する

android:電話番号のautoLinkが常に機能するとは限りません 質問する

私はTextView市内電話番号852112222または(8 5)211 2222のシンプルな番号を持っています。

クリック可能にする必要があるため、当然 を使用しましたandroid:autoLink="all"
しかし、何らかの理由で、同じ電話番号がすべてのデバイスで「リンク化」されないのは理解できません。

普通の Genymotion デバイスでは動作しませんでした。私の個人的な OnePlus2 デバイスでは動作しました。さまざまなデバイスでテストしましたが、うまくいきませんでした。

何が問題なのでしょうか?
ユーザー アカウントの設定ですか? Android のバージョンですか? ORM ですか? 他に何かありますか?

ベストアンサー1

これが私の調査です。

新しいプロジェクトを作成し、android:autoLink="all"のテキスト ビューに追加しましたactivity_main.xml。Android Studio の開発者のおかげでプレビューを確認でき、興味深い点が見つかりました。

  • 12345リンクされていない
  • 123456リンクされていない
  • 1234567 リンクされた
  • 12345678 リンクされた
  • 123456789リンクされていない
  • 1234567890リンクされていない
  • 12345678901 リンクされた
  • 123456789012リンクされていない

結果は私の携帯電話でも同じでした。そこでソースコードを調べてキーワードを検索しましたオートリンク、そして私はこれを見つけました:

private void setText(CharSequence text, BufferType type,
                     boolean notifyBefore, int oldlen) {

    ...
    // unconcerned code above

    if (mAutoLinkMask != 0) {
        Spannable s2;

        if (type == BufferType.EDITABLE || text instanceof Spannable) {
            s2 = (Spannable) text;
        } else {
            s2 = mSpannableFactory.newSpannable(text);
        }

        if (Linkify.addLinks(s2, mAutoLinkMask)) {
            text = s2;
            type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;

            /*
             * We must go ahead and set the text before changing the
             * movement method, because setMovementMethod() may call
             * setText() again to try to upgrade the buffer type.
             */
            mText = text;

            // Do not change the movement method for text that support text selection as it
            // would prevent an arbitrary cursor displacement.
            if (mLinksClickable && !textCanBeSelected()) {
                setMovementMethod(LinkMovementMethod.getInstance());
            }
        }
    }

    ...
    // unconcerned code above
}

キーワードは「今」Linkifyです。addLinks

public static final boolean addLinks(@NonNull Spannable text, @LinkifyMask int mask) {
    ...

    if ((mask & PHONE_NUMBERS) != 0) {
        gatherTelLinks(links, text);
    }

    ...
}

private static final void gatherTelLinks(ArrayList<LinkSpec> links, Spannable s) {
    PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
    Iterable<PhoneNumberMatch> matches = phoneUtil.findNumbers(s.toString(),
            Locale.getDefault().getCountry(), Leniency.POSSIBLE, Long.MAX_VALUE);
    for (PhoneNumberMatch match : matches) {
        LinkSpec spec = new LinkSpec();
        spec.url = "tel:" + PhoneNumberUtils.normalizeNumber(match.rawString());
        spec.start = match.start();
        spec.end = match.end();
        links.add(spec);
    }
}

PhoneNumberUtilその後、何か悪いことが起こりました。SDK には、具体的には以下の 3 つのクラスがありません。

import com.android.i18n.phonenumbers.PhoneNumberMatch;
import com.android.i18n.phonenumbers.PhoneNumberUtil;
import com.android.i18n.phonenumbers.PhoneNumberUtil.Leniency;

今のところ、最初の理由が浮かび上がってきました: Locale.getDefault().getCountry()
そこで設定に行き、言語を見つけて中国語を選択しました。結果は以下のとおりです:

  • 12345 リンクされた
  • 123456 リンクされた
  • 1234567 リンクされた
  • 12345678 リンクされた
  • 123456789 リンクされた
  • 1234567890 リンクされた
  • 12345678901 リンクされた
  • 123456789012 リンクされた

次に、 のパッケージについてはcom.android.i18n.phonenumbers、次のものを見つけました。
https://android.googlesource.com/platform/external/libphonenumber/+/ics-factoryrom-2-release/java/src/com/android/i18n/phonenumbers
興味があれば、上のリンクを確認してください。URLに注意してください:ics-factoryrom-2-release。これはプラットフォーム依存

解決策としては、賢いAndroid正しい場合は、完全に制御することがLinkMovementMethod良い選択肢です。

おすすめ記事