zoukankan      html  css  js  c++  java
  • Android调用系统邮件类应用的正确实现方法

    Android应用开发中,很多情况下免不了要调用手机上的邮件类应用,实现邮件发送的功能,这一般是通过调用系统已有的Intent来实现的。看到网上很多邮件发送都是调用action为android.content.Intent.ACTION_SEND的Intent来实现的,下面我们就来看下这种方式实现的效果如何。

    【使用Intent.ACTION_SEND方式】

    具体的UI搭建我就不说了,很easy,直接看下发送的核心代码就行:

    1. String[] email = {"3802**92@qq.com"}; // 需要注意,email必须以数组形式传入  
    2. Intent intent = new Intent(Intent.ACTION_SEND);  
    3. intent.setType("message/rfc822"); // 设置邮件格式  
    4. intent.putExtra(Intent.EXTRA_EMAIL, email); // 接收人  
    5. intent.putExtra(Intent.EXTRA_CC, email); // 抄送人  
    6. intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题  
    7. intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文  
    8. startActivity(Intent.createChooser(intent, "请选择邮件类应用"));  

    上面代码的效果如下图所示,将会拉起不止邮件类应用,这是很坑爹的事情,用户体验相当差。

    从上面结果可以看出,ACTION_SEND不是首选的方案,更好的方案是能够过滤非邮件类应用,只识别邮件类应用。这可以通过使用另外一个action来实现的。

    【使用Intent.ACTION_SENDTO方式】

    核心代码如下:

    1. // 必须明确使用mailto前缀来修饰邮件地址,如果使用  
    2. // intent.putExtra(Intent.EXTRA_EMAIL, email),结果将匹配不到任何应用  
    3. Uri uri = Uri.parse("mailto:3802**92@qq.com");   
    4. String[] email = {"3802**92@qq.com"};  
    5. Intent intent = new Intent(Intent.ACTION_SENDTO, uri);  
    6. intent.putExtra(Intent.EXTRA_CC, email); // 抄送人  
    7. intent.putExtra(Intent.EXTRA_SUBJECT, "这是邮件的主题部分"); // 主题  
    8. intent.putExtra(Intent.EXTRA_TEXT, "这是邮件的正文部分"); // 正文  
    9. startActivity(Intent.createChooser(intent, "请选择邮件类应用"));  

    效果图如下所示:

    当手机上只有一个匹配的邮件类应用时,系统将不会弹出ChooserActivity,供用户从候选的应用中挑选一个,而是直接跳转到匹配的那个应用去。这时查看Eclipse的logcat可以发现,出现如下异常信息:

    但是,当系统中存在多于一个的匹配应用时,会弹出ChooserActivity,让用户选择一个应用发送邮件,这时查看logcat不会出现之前的异常。这又是为何呢?

    【ChooserActivity的bug】

    从异常信息中可以看出,代码在某个地方注册了IntentReceiver,但却没有代码去解除注册。具体原因是Android源码的一个bug,但不影响正常功能,因此可忽略之。想知道详细原因的可以自己查看Android源码。下图是stackoverflow上面的解答,可参考之。

    网址:

    http://stackoverflow.com/questions/10068954/why-does-intent-createchooser-need-a-broadcastreceiver-and-how-to-implement/10290486#10290486

    Demo源码地址: http://download.csdn.net/detail/ace1985/4695230  

  • 相关阅读:
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 394 字符串解码
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 392 判断子序列
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 391 完美矩形
    Java实现 LeetCode 390 消除游戏
    Java实现 LeetCode 390 消除游戏
  • 原文地址:https://www.cnblogs.com/dongweiq/p/4290169.html
Copyright © 2011-2022 走看看