Cómo enviar un correo electrónico con un archivo adjunto en Android

Quiero adjuntar el archivo .vcf con mi correo y enviarlo por correo. Pero el correo se recibe en la dirección sin el archivo adjunto. He usado el código siguiente pero el código para esto y no sé dónde estoy equivocado.

try { String filelocation="/mnt/sdcard/contacts_sid.vcf"; Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_SUBJECT, ""); intent.putExtra(Intent.EXTRA_STREAM, Uri.parse( "file://"+filelocation)); intent.putExtra(Intent.EXTRA_TEXT, message); intent.setData(Uri.parse("mailto:")); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(intent); activity.finish(); } catch(Exception e) { System.out.println("is exception raises during sending mail"+e); } 

Use el siguiente código para enviar un correo

 String filename="contacts_sid.vcf"; File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename); Uri path = Uri.fromFile(filelocation); Intent emailIntent = new Intent(Intent.ACTION_SEND); // set the type to 'email' emailIntent .setType("vnd.android.cursor.dir/email"); String to[] = {"asd@gmail.com"}; emailIntent .putExtra(Intent.EXTRA_EMAIL, to); // the attachment emailIntent .putExtra(Intent.EXTRA_STREAM, path); // the mail subject emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject"); startActivity(Intent.createChooser(emailIntent , "Send email...")); 

Folder_name es el nombre del archivo en su almacenamiento interno de su teléfono. (ACTUALMENTE EXTERNAL_STORAGE). file_name es el nombre del archivo que desea enviar.

 private void ShareViaEmail(String folder_name, String file_name) { try { File Root= Environment.getExternalStorageDirectory(); String filelocation=Root.getAbsolutePath() + folder_name + "/" + file_name; Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); String message="File to be shared is " + file_name + "."; intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_STREAM, Uri.parse( "file://"+filelocation)); intent.putExtra(Intent.EXTRA_TEXT, message); intent.setData(Uri.parse("mailto:xyz@gmail.com")); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); } catch(Exception e) { System.out.println("is exception raises during sending mail"+e); } } 

El ejemplo en el sitio oficial de Android funcionó para mí. Todo lo que se necesita para agregar el

 startActivity(Intent.createChooser(emailIntent , "Send email...")); 

como está hecho en la respuesta de Agarwal

SENDTO no es compatible con el archivo adjunto. He agregado mi respuesta usando Provider para leer la información del archivo. Está en Kotlin.

 fun shareFile(context: Context, filePath: File?, fileShareInfo: FileShareInfo) { val intentFileShare = Intent(Intent.ACTION_SEND) if (filePath!!.exists()) { intentFileShare.type = fileShareInfo.fileType val uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", filePath) intentFileShare.putExtra(Intent.EXTRA_STREAM, uri) fileShareInfo.recipients?.let { intentFileShare.putExtra(Intent.EXTRA_EMAIL, fileShareInfo.recipients) } intentFileShare.putExtra(Intent.EXTRA_SUBJECT, fileShareInfo.shareSubjectText) fileShareInfo.shareExtraText?.let { intentFileShare.putExtra(Intent.EXTRA_TEXT, AppViewUtil.fromHtml(fileShareInfo.shareExtraText!!)) } try { ContextCompat.startActivity(context, Intent.createChooser(intentFileShare, fileShareInfo.shareTitle), null) } catch (e: ActivityNotFoundException) { Toast.makeText(context, context.getString(R.string.sharing_no_app_found), Toast.LENGTH_LONG).show() } } }