`

当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

    在IT行业中,网络通信是至关重要的一个领域,TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。本篇文章将详细探讨TCP和UDP的区别,以及如何使用C语言中的`recvfrom`、`tcp_sendto`等函数进行...

    tcp.rar_sendto TCP_tcp 数据包

    首先,`sendto()`函数是用于UDP(用户数据报协议)的,它允许程序员指定目标地址和端口,直接发送数据。然而,在这里,描述提到使用`sendto()`发送TCP数据包,这并不常见,因为TCP通常使用`connect()`或`send()`来...

    01_udp_sendto.py

    udp网络编程

    15个Android很有用的代码片段.pdf

    在这个例子中,当系统执行主重置时,会触发`onReceive()`方法,允许应用程序执行恢复默认配置等操作。 ### 8. 定义ContentObserver,监听某个数据表 ```java private ContentObserver mDownloadsObserver = new ...

    Android中使用Intent启动信息发送功能的方法介绍.pdf

    mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true); startActivity(mmsintent); ``` 4. **发送彩信(MMS)** 发送包含多媒体内容的彩信,你需要使用ACTION_SEND动作,并设置额外的流...

    20个Android很有用的代码片段

    - `Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY`、`Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE`、`Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT`:这些都是用于发送短信时传递额外信息的键值对。 - 通过这种方式可以...

    Android系统调用[定义].pdf

    当需要在Google中搜索特定内容时,可以创建一个Intent并设置ACTION_WEB_SEARCH。同时,通过putExtra方法添加SearchManager.QUERY参数,传入搜索字符串,然后启动该Intent。 ```java Intent intent = new Intent(); ...

    Android 整理Intent的19例应用

    intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString()); intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); startActivity(intent); ``` 以上示例展示了如何使用`Intent`执行...

    原创15个Android很有用的代码片段

    mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, ...

    15个Android很有用的代码片段

    mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, ...

    Android编程14个很有用的代码片段

    mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, ...

    android20个常用的系统调用代码片段[收集].pdf

    intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject); intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, ...); ``` 以上代码片段涵盖了Android中常见的用户交互操作,如网络搜索...

    非常有用的Android代码

    mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, ...

    android开发利器

    当接收到特定的动作广播时,会触发`onReceive`方法执行相应的逻辑处理,如本例中的重置配置操作。 这些代码片段不仅展示了Android开发中的常见需求和解决方案,还体现了如何利用Android框架提供的API和组件,以简洁...

    android 20个常用的系统调用代码片段

    - **`Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE`**:设置是否进入编辑模式。 - **`Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT`**:发送后退出。 #### 9. 发送彩信 ```java Uri uri = Uri.parse("content://media/...

    android Intent使用技巧.pdf

    mmsIntent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true); // 提供图片的Uri mmsIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + file.getAbsolutePath())); startActivity(mmsIntent...

    android Intent指南

    当Intent被startActivity()或startService()启动时,Android会查找匹配的Activity或Service,如果有多个匹配项,系统通常会提供一个让用户选择的对话框。 Intent还可以用于启动Service,传递数据,以及实现...

    Andr​​oid编程14个很有用的代码片段

    intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString()); intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode); intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_...

    adroid中默认的intent

    4. `ACTION_CALL`:直接拨打电话,与`ACTION_DIAL`不同,会立即发起通话。 5. `ACTION_MAIN`:这是启动应用程序的主入口点,通常与`CATEGORY_LAUNCHER`一起使用,创建应用快捷方式。 6. `ACTION_EDIT`:编辑数据,...

Global site tag (gtag.js) - Google Analytics