美文网首页
系统中没有邮件客户端设置autoLink=email会挂掉的问题

系统中没有邮件客户端设置autoLink=email会挂掉的问题

作者: Bbbig | 来源:发表于2017-02-22 16:21 被阅读0次

    今天使用了autoLink ,于是 摘抄了可能会出现了问题 留待他用

    通过看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事件拦截下来。

    
    @Overridepublic 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        Listactivities = 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);
    
    

    相关文章

      网友评论

          本文标题:系统中没有邮件客户端设置autoLink=email会挂掉的问题

          本文链接:https://www.haomeiwen.com/subject/ifrlwttx.html