zoukankan      html  css  js  c++  java
  • 系统中没有邮件客户端设置autoLink=email会挂掉的问题

      TextView的autoLink属性为我们提供了很大的便利性,当文本中有网址,邮箱或电话的时候可以让我们方便地执行打电话发邮件等动作,不过也有一些问题,比如说设置autoLink包含email属性,当文本中有邮件地址时只要点击就可以调用邮件客户端来发邮件,但是如果当前系统中没有邮件客户端可供调用,程序会直接挂掉。

      通过看Log可以发现,系统抛出了ActivityNotFoundException异常,并且Exception的getMessage中包含"mailto:xxxx@xxx.xxx"字样,当时第一反应是设置Thread.uncaughtExceptionHandler,判断如果异常的类型是ActivityNotFoundException并且Error Message中有"mailto"字样直接让uncaughtException函数返回,试了一下,程序确实没挂掉,窃喜中,但是接下来点击了一下屏幕,5秒钟后ANR了,好吧这个方法不行。

      又想到当点击链接后会调用邮件客户端发邮件,肯定有startActivity的调用,于是重载Activity的startActivity函数,把参数 intent的内容打出来(直接toString()就行了),发现在Intent的内容是ACTIVION_VIEW,并有extra data:mailto:xxxx@xxx.xxx,所以就通过intent包含的信息判断如果包含mailto字样就认为是系统调用邮件客户端发邮件,此时判断系统中是否有邮件客户端可处理这个请求,如果没有就把这个startActivity事件拦截下来。

    @Override
    public void startActivity(Intent intent) {
        if (intent.toString().indexOf("mailto") != -1) { // Any way to judge that this is to sead an email
            PackageManager pm = getPackageManager();
            // The first Method
            List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
            if (activities == null || activities.size() == 0) {
                // Do anything you like, or just return
                return;
            }
     
            // Another method
            // ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
            // if (resolveInfo == null)
     
            // Yet another metod
            // Intent.createChooser(intent, "Choose email client");
        }
        super.startActivity(intent);
    }

      代码就是上面这样,很简单,提到了三种方法,第一种和第二种都是通过PackageManager判断是否有可以处理这个Intent的请求的组件,如果没有就直接让startActivity返回,在返回之前你想干嘛干嘛,第三种方法是通过 Intent.createChoose手动弹出一个选择器,这个方法记得以前用是不行的,这次试了下竟然可以,难道是我记错了?反正用前两种方法就好了。

      不只是邮件,如果你想通过以下代码跳转到应用市场让用户为你的应用评分

    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("market://details?id=" + getPackageName()));
    startActivity(intent);

      如果用户系统中没有安装任何应用市场,很不幸,你的程序一样会挂掉,和前面说的email一样的问题:ActivityNotFoundException,不知道Google为什么不处理一下,也许人家以为手机上怎么可能没有邮件客户端和应用市场,不了解中国国情啊,不知道如果没有电话应用会是什么样?没有应用市场的处理是一样的方法,重载startActivity,只要你能判断这个请求是跳往市场的就行了。不过这个已经有了Intent对象,直接判断就行了,判断到没有市场直接不startActivity。

  • 相关阅读:
    设置好ftp后用xftp连接提示无法打开,无法显示远程文件夹
    textarea如何实现高度自适应?
    thinkphp中__construct与_initialize()的区别
    (转)在mac上配置cocos2d-x开发环境
    dynamic_cast,const_cast,static_cast,reinterpret_cast 详解
    cocos2d-x 2.1.2 bug发现
    cocos2d-x 小技巧
    CCScrollView 实现帮助界面、关卡选择
    cocos2d_x iconv转码
    cocos2dx场景切换中init、onEnter、onEnterTransitionDidFinish的调用顺序
  • 原文地址:https://www.cnblogs.com/angeldevil/p/3485871.html
Copyright © 2011-2022 走看看