`

当Email未设置账户时,通过ACTION_SENDTO启动会报ActivityNotFoundException

阅读更多
当Email未设置账户时,通过ACTION_SENDTO启动会报ActivityNotFoundException

手机里已经安装了email的apk,检查manitfest中也有对应的action,并且activity也没有被disable掉,为何就是找不到呢?
<activity
            android:name="com.android.email.activity.ComposeActivityEmail"
            android:label="@string/app_name"
            android:documentLaunchMode="intoExisting"
            android:autoRemoveFromRecents="true"
            android:theme="@style/ComposeTheme">
            <intent-filter>
                <action
                    android:name="android.intent.action.VIEW" />
                <action
                    android:name="android.intent.action.SENDTO" />
                <data
                    android:scheme="mailto" />
                <category
                    android:name="android.intent.category.DEFAULT" />
                <category
                    android:name="android.intent.category.BROWSABLE" />
            </intent-filter>

1.我下载了一个QQ邮箱安装到手机,发现ACTION_SENDTO启动QQ邮箱的设置界面
2.我把QQ邮箱卸载了,在原生Email里面登录一个账号,再ACTION_SENDTO可以启动对应的ComposeActivityEmail
3.那就是没有账号不能启动ComposeActivityEmail
4.ActivityStarter中startActivityMayWait的ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId);
和 ActivityInfo aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, profilerInfo);当有账号rInfo 和aInfo 都不为null,当没有账号返回的是null.

5.通过分析得知ComposeActivityEmail是动态被enable和disable的,所以搜索setComponentEnabledSetting,找到了关键代码
http://androidxref.com/7.1.1_r6/xref/packages/apps/Email/provider_src/com/android/email/provider/AccountReconciler.java
 if (!TextUtils.isEmpty(composeActivityName)) {
            // If there are no accounts remaining after reconciliation, disable the compose activity
            final boolean enableCompose = emailProviderAccounts.size() - accountsDeleted > 0;
            final ComponentName componentName = new ComponentName(context, composeActivityName);
            context.getPackageManager().setComponentEnabledSetting(componentName,
                    enableCompose ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED :
                            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                    PackageManager.DONT_KILL_APP);
            LogUtils.d(LogUtils.TAG, "Setting compose activity to "
                    + (enableCompose ? "enabled" : "disabled"));
        }


将这部分代码拿掉没有账号也可以启动email来处理sendto

具体为何google要这样做,目前还没有找到其理由。
分享到:
评论

相关推荐

    tcp.rar_UDP recvfrom_tcp_tcp sendto_udp 函数_udp_sendto

    UDP实现的简易通讯程序 用sendto(),recvfrom()函数实现客户机与服务器之间的信息交换。

    01_udp_sendto.py

    udp网络编程

    tcp.rar_sendto TCP_tcp 数据包

    TCP数据包的填充并发送,考虑到课设并没有严格要求我们成功发送到目的地,所以利用函数sendto()来实现数据包的发送,这种方式不可靠,只能保证数据是否从源地发送出去,至于有没有到达目的地就不管了。

    理解IO_Completion_Port(完成端口).

    理解IO_Completion_Port(完成端口).doc

    网络实验9 NETCONN_TCP 服务器.rar

    基于stm32以太网,根据例程不能解决启动前不差网线的问题以及使用中拔掉网线无法连接的问题

    SendTo+

    在 SendTo+ 下 CMD 文件夹下的 ShortcutToFolder.ini 是添加到“其它文件夹”的文件记录,以“*”号开头的行会被置顶选择,当执行操作后,所需目标文件夹不在此处时会提示输入目标位置,并记录在此文件中,后续版本中...

    wxh SendTo_src.zip

    SendTo_src.zip

    android Intent实例

    刚起步的时候经常困扰我们的是一些本来容易解决的问题,往往我们会花掉很大的力气去找解决的办法,最后才知道原来这么简单,这就是英文世界造成的。 Intent在Android应用开发中,占有很大的分量,关于Intent在...

    Android开发中怎样调用系统Email发送邮件(多种调用方式)

    SENDTO 无附件的发送 Intent.ACTION_SEND 带附件的发送 Intent.ACTION_SEND_MULTIPLE 带有多附件的发送 当然,所谓的调用Email,只是说Email可以接收Intent并做这些事情,可能也有其他的应用程序实现了相关功能,...

    sendto 快捷键COPY文件更方便快捷

    一键增加sendto快捷键 。使得COPY文件更方便快捷。只是个样本 按照做就行了

    cordova-send-menu-android:`SendMenu` 插件通过发送菜单从其他应用程序接收数据

    #org.cordova.sendmenu发送菜单SendMenu插件通过发送菜单从其他应用程序接收数据。...EMAILsendmenu.ACTION_CALLsendmenu.ACTION_SENDTO##window.plugins.sendmenu.hasExtra window.plugins.sendmenu.hasExtra(param

    recvfrom()和sendto()函数

    recvfrom()和sendto()函数

    android开发使用例子

    Intent it = new Intent(Intent.ACTION_SENDTO, uri); 3. it.putExtra("sms_body", "The SMS text"); 4. startActivity(it); 发送彩信 1. Uri uri = Uri.parse("content://media/external/images/media/23"); ...

    CommonIntents:适用于各种内置Intent的示例Android Java代码

    CommonIntents-各种内置Intent的示例代码,包括: ACTION_PICK /使用默认联系人应用程序选择联系人记录,将名称,街道地址,电话号码,电子邮件地址存储在可用于...ACTION_SENDTO /使用默认电子邮件应用发送电子邮件

    右键转换调整图片(SendTo-Convert)v27.3.0英文免费安装版(3264bit)

    SendTo-Convert 是一个图片格式转换软件,在操作方面比较特别,安装好软件后,会在鼠标右键菜单「发送到」中看到它的选项,除了能转换图片格式外,还可以对图片进行简单的大小裁剪处理功能很简单,可以让你右键点击...

    nautilus-sendto-3.8.6-2.el8.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    Android Intent 用法全面总结及实例代码

    1.调用拨号程序  // 给移动客服10086拨打电话 Uri uri = Uri.parse(tel:10086); Intent intent = new Intent(Intent.ACTION_DIAL, ...Intent intent = new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra(sms_

    封包助手包括Send,Recv,WSASend,WSARecv,SendTo等

    封包助手是一个能拦截网络应用程序数据包的纯绿色软件(压缩包不足400KB,无插件无病毒,不需安装),包括Send,Recv,WSASend,WSARecv,SendTo,RecvFrom,WSASendTo,WSARecvFrom。 封包助手还可以拦截Connect和Accept...

    Android中Intent习惯用法

    本文着重讲一下Android中一些常见的Intent的习惯用法,比如如何通过Intent发送短信、发送邮件、启动摄像机拍照录视频、设置闹铃、打开WIFI设置界面等等。 限于篇幅,本文分为上下两篇,这是上篇。 发送短信 发送短信...

    Android Mms之:深入理解Compose

    在外部Composer也是公开的接口,能够处理Intent.ACTION_SEND和Intent.ACTION_SENDTO以及文件类型为audio/*,image/*,video/*和text/*。Composer是一个标准的Activity,它的启动流程也要经过onCrea

Global site tag (gtag.js) - Google Analytics