如何同时使用LinkMovementMethod捕捉异常(ActivityNotFoundException)异常、LinkMovementMethod、ActivityNotFoundExcepti

2023-09-08 09:53:09 作者:EXO去星星了 ~(>_<)~

我目前是用HTML的电话号码和网址。

的TextView

我注意到,我们可以使用setMovementMethod使这些链接点击:

  tv.setText(电话号码是:32485123456 url是http://www.blabla.com);tv.setMovementMethod(LinkMovementMethod.getInstance()); 

这工作pretty很好,但在某些设备上,它ActivityNotFoundException崩溃,那​​是相当understanble。 (见code以下)

这些问题出现在我的开发者控制台,我不能复制它们。

我现在面临的最大问题是,当点击由LinkMovementMethod处理,我不能try / catch语句code在我的活动

我如何能避免这样的错误任何想法?

  android.content.ActivityNotFoundException:无活动处理意向{行动= android.intent.action.VIEW DAT = www.vlaamsbrabant.be /赛雷欧(有临时演员)}    在android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)    在android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)    在android.app.Activity.startActivityForResult(Activity.java:2817)    在android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)    在android.app.Activity.startActivity(Activity.java:2923)    在android.text.style.URLSpan.onClick(URLSpan.java:62)    在android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:216)    在android.widget.TextView.onTouchEvent(TextView.java:6788)    在android.view.View.dispatchTouchEvent(View.java:3766)    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)    在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)    在com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1896)    在com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1159)    在android.app.Activity.dispatchTouchEvent(Activity.java:2086)    在com.android.internal.policy.impl.PhoneWindow $ DecorView.dispatchTouchEvent(PhoneWindow.java:1880)    在android.view.ViewRoot.handleMessage(ViewRoot.java:1811)    在android.os.Handler.dispatchMessage(Handler.java:99)    在android.os.Looper.loop(Looper.java:123)    在android.app.ActivityThread.main(ActivityThread.java:4627)    在java.lang.reflect.Method.invokeNative(本机方法)    在java.lang.reflect.Method.invoke(Method.java:521)    在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:858)    在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)    在dalvik.system.NativeStart.main(本机方法) 

解决方案 Spring 全局异常捕获 自定义业务异常

您可以永远只是延长LinkMovementMethod,赶上的错误。

是这样的:

 私有类MovementCheck扩展LinkMovementMethod {    @覆盖    公共布尔onTouchEvent(TextView的小部件,Spannable缓冲,MotionEvent事件){        尝试{            返回super.onTouchEvent(小部件,缓冲,事件);        }赶上(例外前){            Toast.makeText(MainActivity.this,无法加载链接,Toast.LENGTH_LONG).show();            返回true;        }    }} 

将在情况下显示的错误消息没有应用程序安装到处理这个意图。

另一种选择是使用这个问题提前确定时间如果有什么是prepared来处理你的链接。

I have currently a TextView with some HTML phone numbers and url.

I have noticed that we can use the setMovementMethod to make these links clickable:

tv.setText("Phone number is: +32485123456 and url is http://www.blabla.com");
tv.setMovementMethod(LinkMovementMethod.getInstance());

This works pretty well, but on some devices, it crash with ActivityNotFoundException and that is quite understanble. (see code below)

These problems appear in my developer console and I cannot reproduce them.

The big problem I am facing is that I cannot try/catch code in my activity as the click is handled by LinkMovementMethod

Any idea on how I can avoid such errors?

android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.VIEW dat=www.vlaamsbrabant.be/zoutleeuw (has extras) }
    at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1408)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
    at android.app.Activity.startActivityForResult(Activity.java:2817)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:817)
    at android.app.Activity.startActivity(Activity.java:2923)
    at android.text.style.URLSpan.onClick(URLSpan.java:62)
    at android.text.method.LinkMovementMethod.onTouchEvent(LinkMovementMethod.java:216)
    at android.widget.TextView.onTouchEvent(TextView.java:6788)
    at android.view.View.dispatchTouchEvent(View.java:3766)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1896)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1159)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1880)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1811)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
    at dalvik.system.NativeStart.main(Native Method)

解决方案

You can always just extend LinkMovementMethod and catch the error there.

Something like:

private class MovementCheck extends LinkMovementMethod {

    @Override
    public boolean onTouchEvent( TextView widget, Spannable buffer, MotionEvent event ) {
        try {
            return super.onTouchEvent( widget, buffer, event ) ;
        } catch( Exception ex ) {
            Toast.makeText( MainActivity.this, "Could not load link", Toast.LENGTH_LONG ).show();
            return true;
        }
    }

}

Will display an error message in the case that there is no application setup to handle the intent.

Another option is to use the method in this question to determine ahead of time if anything is prepared to handle your links.