2.3.3 之前的 Android API 级别使用 setType("message/rfc822") 的 Intent

问题描述 投票:0回答:4

我在Android模拟器上设置类型“消息/rfc822”以发送电子邮件带有文件附件时遇到问题。我必须使用 setType("message/rfc822") 因为该文件没有标准 MIME 类型(SQLite 数据库),并且我试图避免选择列表中的大量应用程序供用户选择。 对于 2.3.3 之前的所有 API 级别 我有一个错误:

java.lang.RuntimeException: 
Unable to start activity ComponentInfo{my.cashwatcher/my.cashwatcher.SendEmailActivity}: 
android.content.ActivityNotFoundException: 
No Activity found to handle Intent { act=android.intent.action.SEND typ=message/rfc822 
(has extras) }

在API级别的情况下,2.3.3代码工作正常并且不会出现错误。是Android模拟器的问题还是旧API的问题!?

代码:

Intent sendIntent = new Intent(Intent.ACTION_SEND);                         
sendIntent.setType("message/rfc822");            
sendIntent.putExtra(Intent.EXTRA_EMAIL , new String[]{appPrefs.getEmail("email")});                   
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), DATABASE_PATH)));
sendIntent.putExtra(Intent.EXTRA_TEXT, "body_of_email"); 
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "APPLICATION_NAME");
startActivityForResult(sendIntent, EMAIL_SEND_RESULT);
android email android-intent android-emulator
4个回答
9
投票

首先,“为了避免选择列表中有很多应用程序供用户选择”,请使用

ACTION_SENDTO
mailto:
Uri

其次,您遇到的问题不是“Android模拟器的问题”,也不是“旧API的问题”。您需要 1 个以上能够处理

ACTION_SEND
Intent
和 MIME 类型
message/rfc822
的应用程序。无法保证任何给定的设备都支持该组合,更不用说任何给定的模拟器了。您的代码需要处理该问题,就像您使用
ACTION_GOBBLEDYGOOK
或 MIME 类型的
thisis/sonotreal
或其他内容一样。


3
投票

我已经制作了一个根据您的需要使用 URI 示例的应用程序:

if(v.getId()==R.id.button3)
{
    intent=new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("mailto"));
    String[]to={"[email protected]","[email protected]"};
    intent.putExtra(Intent.EXTRA_EMAIL, to);
    intent.putExtra(Intent.EXTRA_SUBJECT, "hello");
    intent.putExtra(Intent.EXTRA_TEXT, "hi");
    intent.setType("message/rfc822");
    chooser=intent.createChooser(intent, "send mail");
    startActivity(chooser); 
}

2
投票

这就是解决方案。使用下面的代码,完美运行......得到了 研究后的解决方案......:)

Intent testIntent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("mailto:?subject=" + "blah blah subject" + "&body=" + 
"blah blah body" + "&to=" + "[email protected]");  
testIntent.setData(data);  
startActivity(testIntent);  

0
投票

改编自 dreamdevelope 和 Syed Rafaqat Hussain。

fun sendEmail(activity: AppCompatActivity,subject:String,body:String,email:String){
    val testIntent = Intent(Intent.ACTION_VIEW)

    val encodeSubject = java.net.URLEncoder.encode(subject, "utf-8")
    val encodeBody = java.net.URLEncoder.encode(body, "utf-8")

    val uriContent =buildString {
        append("mailto:?subject=")
        append(encodeSubject)
        append("&body=")
        append(encodeBody)
        append("&to=")
        append(email)
    }
    val data = Uri.parse(uriContent)
    testIntent.data = data
    activity.startActivity(testIntent)
}
© www.soinside.com 2019 - 2024. All rights reserved.