Retropie en Debian / Ubuntu / Mint

Una guía para construir la configuración de RetroPie en Ubuntu (16.04 LTS o posterior) x86 y distribuciones basadas en Debian.


No es tarea sencilla actualmente  conseguir imagenes de  Retropie para otras placas clónicas de  Raspberry Pi  como Orange Pi o Banana Po, pero si lo es conseguir imágenes basadas en Ubuntu como por ejemplo Lubuntu 16.04 , asi que si partimos de  una  imagen con Lubuntu instalada , podemos a partir de ahi instalarle Retropie  por consola  siguiendo  unos pocos pasos

 

 

En primer lugar   deberíamos tener instalada Ubuntu (16.04 LTS o posterior) o una distribución basada en Debian relacionada, como Linux Mint 18 / 19. 

Armbian es una distribución ligera basada en Debian o Ubuntu especializada para placas de desarrollo ARM. Compilado desde cero, contando con poderosas herramientas, desarrollo de software, y una comunidad vibrante.Otras placas ARM pueden ser las Raspberry PI, Odroid, Cubieboard… cada una de un fabricante distinto y luchando por hacerse con su espacio

Si parte de una Orange Pi   que tiene un chip  ARM , en este post se explica  como  instalar ARMbian  

Para ejecutar RetroPie-Setup, debe ser miembro del grupo root / admin.

 

Instalacion Retropie

Para descargar RetroPie, actualice  los paquetes APT existentes:

sudo apt-get update && sudo apt-get upgrade

Instale los paquetes necesarios para el script de instalación de RetroPie:

sudo apt-get install -y git dialog unzip xmlstarlet

NOTA: si recibe algún error sobre un paquete que no se encuentra y está utilizando Ubuntu, asegúrese de que el repositorio universeAPT se haya agregado y habilitado en el sistema al ejecutarlo sudo add-apt-repository universey luego comenzar de nuevo con el paso anterior.

Descargue el último script de configuración de RetroPie:

git clone --depth=1 https://github.com/RetroPie/RetroPie-Setup.git

Ingrese la carpeta con el script de configuración:

cd RetroPie-Setup

El script se ejecuta con:

sudo ./retropie_setup.sh

La pantalla debería verse / similar en este punto:

script de configuración de retropie 4-0-2

 

Instalación Básica

Esto instalará los paquetes principales que son equivalentes a los que se proporcionan con la imagen RetroPie SD. Tenga en cuenta que esta será la versión de 32 bits de RetroPie  lo que significa que algunos emuladores como Daphne (Dragon’s Lair) no funcionarán de fábrica en esta versión pues Daphne y algunos otros emuladores solo tienen una versión de 64 bits lanzada para su uso, mientras que esta instalación es para la familia de CPU de 32 bits.

Ahora, debe copiar sus archivos rom en los directorios rom correctos asociados. Si siguió los pasos anteriores, el directorio principal para todas las roms es ~/RetroPie/roms(o /home/pi/RetroPie/roms, que es lo mismo aquí). En este directorio hay un subdirectorio para cada sistema emulado compatible, por ejemplo, NES, SNES, Sega Megadrive, etc.

Se debe prestar atención a las extensiones de los archivos rom pues algunos emuladores usan .zip mientras que otros usan una extensión de archivo personalizada asociada con el emulador en cuestión. Por ejemplo, el emulador Atari 2600 puede usar .a26, .bin y .rom.

Configurar RetroPie

EmulationStation se puede ejecutar desde el terminal escribiendo emulationstationel terminal.

Puede ir a Configuración / Configuración y habilitar el inicio automático a su gusto.

 

 

Algunos problemas 

La estación de emulación se cuelga si se seleccionó apagar / reiniciar

No es posible reiniciar / apagar si un sudo solicita una contraseña. Para deshabilitar la solicitud de contraseña de sudo, agregue la línea

<user> ALL=(ALL) NOPASSWD:ALL

al final de /etc/sudoers. Reemplace <usuario> con el nombre de su usuario actual.

No se puede instalar el controlador de PS3

Ubuntu tiene un controlador bluetooth PS3 incorporado. No hay necesidad de instalar sixad. Haga que su dongle bluetooth sea reconocible. Conecte su controlador a través de usb. Ahora abra “configuración del sistema bluetooth / agregar dispositivo”. Seleccione el controlador PS3 y haga clic en Aceptar. Su controlador debería emparejarse ahora si presiona el botón PS.

Pantalla en blanco después de algunos minutos

Abra el menú de configuración del sistema Ubuntu, desactive el protector de pantalla y los tiempos de espera de bloqueo de pantalla.

Ubuntu no se inicia automáticamente

Abra el menú de configuración del sistema Ubuntu y seleccione cuentas de usuario. Habilitar el inicio de sesión automático para el usuario actual.

Cómo configurar una pantalla de bienvenida

Use Plymouth para configurar una pantalla de bienvenida. Vea el wiki de Plymouth Ubuntu o use este sencillo tema de ES .

 

Mas info en https://retropie.org.uk/docs/Debian/

 

exit status 1 using typedef-name ‘fpos_t’ after ‘struct’

Veremos como lograr qeu compile Marlin para su impresora 3d


Si está viendo  este página probablemente se deba que esta intentando actualizar el firmware Marlin  de su impresora 3d  desde el IDE de Arduino  y no lo logra.

Marlin es un firmware de código abierto para la familia RepRap de replicar prototipos rápidos, popularmente conocidos como “impresoras 3D”. Se deriva de Sprinter y grbl,y se convirtió en un proyecto de código abierto independiente el 12 de agosto de 2011 con su lanzamiento de Github. Marlin tiene licencia bajo la GPLv3 y es gratis para todas las aplicaciones.

Desde el principio Marlin fue construido por y para los entusiastas de RepRap para ser un controlador de impresora sencillo, confiable y adaptable que “simplemente funciona”. Como testimonio de su calidad, Marlin es utilizado por varias impresoras 3D comerciales respetadas. Ultimaker, Printrbot, AlephObjects (Lulzbot) y Prusa Research son solo algunos de los vendedores que envían una variante de Marlin. Marlin también es capaz de conducir CNC y grabadores láser.

Una clave de la popularidad de Marlin es que se ejecuta en microcontroladores Atmel AVR de 8 bits de bajo costo – Marlin 2.x ha añadido soporte para placas de 32 bits. Estos chips están en el centro de la popular plataforma de código abierto Arduino/Genuino. Las plataformas de referencia para Marlin es un Arduino Mega2560 con RAMPS 1.4 y Re-Arm con rampas 1.4.

Como producto comunitario, Marlin tiene como objetivo ser adaptable a tantas placas y configuraciones como sea posible  intentando ser configurable, personalizable, extensible y económico tanto para aficionados como para proveedores. Una construcción Marlin puede ser muy pequeña, para su uso en una impresora sin cabeza con solo hardware modesto. Las características se habilitan según sea necesario para adaptar Marlin a los componentes añadidos.

 

Marlin Firmware se ejecuta en la placa principal de la impresora 3D, gestionando todas las actividades en tiempo real de la máquina. Coordina los calentadores, pasos, sensores, luces, pantalla LCD, botones y todo lo demás involucrado en el proceso de impresión 3D.

Marlin implementa un proceso de fabricación aditiva llamado Fused Deposition Modeling (FDM), también conocido como Fused Filament Fabrication (FFF). En este proceso, un motor empuja el filamento de plástico a través de una boquilla caliente que funde y extruye el material mientras la boquilla se mueve bajo control informático. Después de varios minutos (o muchas horas) de colocar finas capas de plástico, el resultado es un objeto físico.

El lenguaje de control para Marlin es un derivado del código G. Los comandos de código G le dicen a una máquina que haga cosas simples como “establecer el calentador de 1 a 180o” o “mover a XY a la velocidad F.” Para imprimir un modelo con Marlin, debe convertirse en código G utilizando un programa llamado “slicer”. Dado que cada impresora es diferente, no encontrará archivos de código G para descargar; tendrás que cortarlos tú mismo.

A medida que Marlin recibe comandos de movimiento, los agrega a una cola de movimiento para ser ejecutados en la orden recibida. La “interrupción paso a paso” procesa la cola, convirtiendo los movimientos lineales en pulsos electrónicos con precisión en los motores paso a paso. Incluso a velocidades modestas Marlin necesita generar miles de pulsos paso a paso cada segundo. (p. ej., 80 pasos por mm * 50 mm/s a 4000 pasos por segundo!) Dado que la velocidad de la CPU limita la velocidad con la que la máquina puede moverse, ¡siempre estamos buscando nuevas formas de optimizar la interrupción paso a paso!

Los calentadores y sensores se gestionan en una segunda interrupción que se ejecuta a una velocidad mucho más lenta, mientras que el bucle principal controla el procesamiento de comandos, la actualización de la pantalla y los eventos del controlador. Por razones de seguridad, Marlin realmente se reiniciará si la CPU se sobrecarga demasiado para leer los sensores.

What is Marlin?

 

Instalación de Marlin en su impresora

Normalmente todas las impresoras 3d ya llevan el firmware instalado ( incluso las que vienen en kit )   pero   conviene estar al tanto de las actualizaciones   de  este   ( en cuyo caso habar  que seguir el procedimiento siguiente)  o puede que sea  necesario cambiarlo para añadir alguna funcionalidad extra como por ejemplo la autonivelación o el cambio de idioma

En todos estos casos normalmente estos son los pasos que se siguen:  

1. Instale Arduino en su PC.
Si su impresora es A10/A10M/A20/A20M, utilice Arduino 1.8.5 para finalizar la  carga; Si es Prusa I3 Pro B/W/X/C, por favor vaya por Arduino 1.0.1!! De lo contrario, es posible que reciba algunos errores durante la verificación.

Descargue Arduino 1.0.1 o Arduino 1.8.5  aquí: https://www.arduino.cc/en/Main/OldSoftw … s-anterior

Arduino 1.0.1.jpg
Arduino 1.8.5.jpg
Arduino 1.8.5.jpg (27.86 KiB) Visto 60177 veces


2. Conecte la impresora al PC con el cable USB.
3. Descomprima el  firmware.  Aquí  tomaremos el firmware para el extrusor dual I3 pro C, por  ejemplo el proceso para la serie A10/A20 es bastante similar, excepto el Arduino en una versión diferente.   Puede descargar el de su impresora aquí:
http://www.geeetech.com/forum/viewtopic … 10&t-17046

02.jpg


4. Haga doble clic en el Marlin.ino, luego abrirá todo el firmware en el arduino.

03.jpg
04.jpg

5. Seleccione el puerto Com adecuado.

06.jpg
06.jpg (205.84 KiB) Viewed 189584 times


6. En Herramientas, en Board, seleccione Mega 2560 .

05.jpg


7. Finalmente haga clic en la flecha para compilar y cargar el firmware en su impresora.

07.jpg

 

Bien   es cierto que debería de compilar el sw  y nuestra impresora ya si estaría actualizada, pero lamentablemente  no siempre es así,  y desgraciadamente puede que  nos lance un error de que no se puede compilar  .

 

 

Por ejemplo en el caso de una Geetech Prusa i 3 W este es el mensaje que lanza el IDE de Arduino al intentar verificar el firmware: 

 

Arduino:1.8.10 (Windows 10), Tarjeta:”Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)”

In file included from sketch\Marlin.h:23:0, from sketch\ConfigurationStore.cpp:1:

sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1   sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN 28  In file included from sketch\Marlin.h:23:0,  from sketch\BlinkM.cpp:5:

sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\thermistortables.h:4, from sketch\Configuration.h:792, from f:\Users\Carlos\Documents\Arduino\I3 ProW GT2560A+ with 3dtouch (1)\Marlin\Marlin.ino:33:sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined #define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0,  from sketch\Marlin_main.cpp:30: sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\MarlinSerial.cpp:23:sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 In file included from sketch\Marlin.h:23:0, from sketch\Sd2Card.cpp:20:

sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 sketch\Marlin_main.cpp:2667:36: warning: invalid suffix on literal; C++11 requires a space between literal and string macro [-Wliteral-suffix] LCD_MESSAGEPGM(MACHINE_NAME” “MSG_OFF”.”); ^In file included from sketch\Marlin.h:23:0,  from sketch\SdBaseFile.cpp:21:sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 In file included from sketch\SdFile.h:27:0, from sketch\cardreader.h:8, from sketch\Marlin_main.cpp:44:SdBaseFile.h:38:8: error: using typedef-name ‘fpos_t’ after ‘struct’ struct fpos_t { ^~~~~~  In file included from sketch\Marlin.h:10:0,  from sketch\Marlin_main.cpp:30:c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:950:33: note: ‘fpos_t’ has a previous declaration here extension typedef long long fpos_t; ^~~~~~ sketch\Marlin_main.cpp: In function ‘void set_bed_level_equation_lsq(double*)’:

sketch\Marlin_main.cpp:998:36: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]  planeNormal.debug(“planeNormal”); ^

In file included from sketch\SdBaseFile.cpp:24:0:SdBaseFile.h:38:8: error: using typedef-name ‘fpos_t’ after ‘struct’ struct fpos_t {  ^~~~~~

In file included from sketch\Marlin.h:10:0,  from sketch\SdBaseFile.cpp:21:c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:950:33: note: ‘fpos_t’ has a previous declaration here extension typedef long long fpos_t; ^~~~~~

sketch\SdBaseFile.cpp: In member function ‘void SdBaseFile::getpos(fpos_t*)’:SdBaseFile.cpp:298:8: error: request for member ‘position’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’ pos->position = curPosition_; ^~~~~~~~

SdBaseFile.cpp:299:8: error: request for member ‘cluster’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’ pos->cluster = curCluster_; ^~~~~~~

sketch\SdBaseFile.cpp: In member function ‘void SdBaseFile::setpos(fpos_t*)‘:

SdBaseFile.cpp:1496:23: error: request for member ‘position’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’  curPosition_ = pos->position; ^~~~~~~~

SdBaseFile.cpp:1497:22: error: request for member ‘cluster’ in ‘* pos’, which is of non-class type ‘fpos_t {aka long long int}’ curCluster_ = pos->cluster; ^~~~~~~

In file included from sketch\Marlin.h:23:0, from sketch\SdFatUtil.cpp:20:

sketch\pins.h:2956:0: warning: “X_MAX_PIN” redefined

#define X_MAX_PIN -1 sketch\pins.h:1363:0: note: this is the location of the previous definition

#define X_MAX_PIN 24 sketch\pins.h:2957:0: warning: “Y_MAX_PIN” redefined

#define Y_MAX_PIN -1 sketch\pins.h:1369:0: note: this is the location of the previous definition

#define Y_MAX_PIN 28 Se encontraron varias bibliotecas para “LiquidCrystal.h”


Usado: C:\Program
exit status 1
using typedef-name ‘fpos_t’ after ‘struct’

Este informe podría contener más información con “Mostrar salida detallada durante la compilación” opción habilitada en Archivo -> Preferencias.

Bueno   , este error nos impide  actualizar el firmarware Marlin de nuestra impresora, pero  en las siguientes líneas veremos que lograr que compile el sw Marlin para nuestra impresora en particular puede ser un juego de niños

 

 

Tip1 : todo lo que necesita hacer es cambiar   todas las ocurrencias fpos_t a filepos_t

 

Para solucionar el problema  de  compilación, anterior sólo tiene que abrir ide Arduino con el firmware y hacer una búsqueda global y reemplazar.

Esto se hace haciendo Ctrl-F y selecciona la casilla de búsqueda de todas las pestañas. A continuación, buscar y reemplazar  fpos_t  por  filepos_t. Volver a compilar y estará todo listo. 

Se trata de un cambio en las nuevas versiones del software de Arduino IDE que está haciendo esto. Las versiones más recientes del firmware del Marlin tienen que la estructura  filepos_t   se llama así ,lo  que  no tendrá ningún efecto negativo en el firmware

sí que la raíz del problema con las nuevas versiones de Arduino es que ya definen un objeto denominado fpos_t en uno de los archivos globales instaladas con Arduino llamado stdio.h. Destacar en el el fichero stdio.h  ha sido un problema con muchos usuarios en línea de cambiar al nuevo Arduino y la compilación de los firmwares más antiguas basadas Marlin. Es por ello que las nuevas versiones de Marlin han pasado a utilizar filepos_t para el nombre de estructura en su lugar. Si se realiza  ese cambio a sus versiones de firmware publicadas, a continuación nadie más tendría los problemas que tenía con cargar el firmware original pero bueno sabiéndolo podemos poner el remedio.  

 

 

 

Tip 2

Si la solución  anterior  no le fue suficiente   alguien informó recientemente el mismo problema con Marlin y así  ha  solucionado el  problema

  • Herramientas > Tablero > Administrador de placas… > Arduino AVR Boards(haga clic en él) > seleccione 1.6.11 en el menú “Seleccionar versión” > Instalar
  • Una vez completada la instalación, haga clic en el botón “Cerrar”



El problema es causado por la nueva versión del compilador incluida con Arduino AVR Boards 1.6.12 y más tarde, es más exigente con el código malo que alguien escribió. Tendrá sin necesidad de actualizar a cualquier versión de Arduino AVR Boards por encima de 1.6.11 hasta que alguien solucione el problema en el código Marlin.
¿Está utilizando la última versión del firmware real de Marlin o es alguna versión anterior o una versión modificada no  estándar?

Enviar correo internamente usando JavaMail API

Veremos como enviar fácilmente correos electrónicos en nuestra aplicación móvil mediante el Android Studio


En realidad no es demasiado difícil crear un aplicación capaz de enviar correos electrónicos usando el IDE de Android Studio  .De hecho gracias al APi de Javmail   podremos enviar e-mails sin utilizar la aplicación de correo electrónico que android incluye por defecto utilizando javamail API para crear nuestro propio email del remitente herramientas que enviará correo internamente.

Tenemos que seguir los pasos que se dan a continuación:

1. Descargar los archivos de biblioteca de api de java.

Tenemos que descargar  tres   librerías java: 

    1. activation.jar
    2. mail.jar.
    3.  additionnal.jar

    Lo puede descargar de Clic aquí.

    2 Ahora crear una  app en Android studio

    3-Ir a la carpeta del proyecto -> aplicación -> libs y agregue todos los archivos jar en libs ahora uno por uno, haga clic en biblioteca de archivos en la opción haga clic en Agregar como biblioteca en todos los archivos jar.

    libs

    También puede Agregar biblioteca por otro camino, pero lo  importante es que incluya esta tres librerías:

    1. activation.jar
    2. mail.jar.
    3.  additionnal.jar

    Ir a archivo >Proyecto estructura > seleccione aplicación> opción derecha haga clic en dependencias ahora haga clic en el botón de pulse(+) para agregar > seleccione dependencia de archivo> archivo seleccione Biblioteca > OK.

    addjar

    4. Ahora abrir el archivo manifest.xml y poner los permisos de internet.

     <uses-permission android:name="android.permission.INTERNET"/>

    Ahora busque manifiesto está buscando como.

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sp.sendmailinternally">
        <uses-permission android:name="android.permission.INTERNET"/>
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    4. Ahora abrael fichero  activity_main.xml para crear el archivo de diseño agregar después de código.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.sp.sendmailinternally.MainActivity">
        <EditText
            android:id="@+id/edittext_recipient_id"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Recipient Email"
            android:textSize="18sp" />
        <EditText
            android:id="@+id/edittext_subject"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Subject"
            android:textSize="18sp" />
        <EditText
            android:id="@+id/edittext_message"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:gravity="start"
            android:hint="Message"
            android:textSize="18sp" />
        <Button
            android:id="@+id/btn_send_mail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Send Mail"
            android:textAllCaps="false" />
    </LinearLayout>

    5. Cree la  clase de Asyntask para el envío de llamada correo API.

    package com.sp.sendmailinternally;
    import android.app.ProgressDialog;
    import android.content.Context;
    import android.os.AsyncTask;
    import android.widget.Toast;
    import java.util.Properties;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    /**
     * Created by ps205 on 3/1/17.
     */
    public class SendMailAsynTask extends AsyncTask<Void, Void, Void> {
        //Declaring Variables
        private Context context;
        private Session session;
        //Information to send email
        private String email;
        private String subject;
        private String message;
        //Progressdialog to show while sending email
        private ProgressDialog progressDialog;
        //Class Constructor
        public SendMailAsynTask(Context context, String email, String subject, String message) {
            //Initializing variables
            this.context = context;
            this.email = email;
            this.subject = subject;
            this.message = message;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            //Showing progress dialog while sending email
            progressDialog = ProgressDialog.show(context, "Sending message", "Please wait...", false, false);
        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            //Dismissing the progress dialog
            progressDialog.dismiss();
            //Showing a success message
            Toast.makeText(context, "Message Sent", Toast.LENGTH_LONG).show();
        }
        @Override
        protected Void doInBackground(Void... params) {
            //Creating properties
            Properties props = new Properties();
            //Configuring properties for gmail
            //If you are not using gmail you may need to change the values
            props.put("mail.smtp.host", "smtp.gmail.com");
            props.put("mail.smtp.socketFactory.port", "465");
            props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.port", "465");
            //Creating a new session
            session = Session.getDefaultInstance(props,
                    new javax.mail.Authenticator() {
                        //Authenticating the password
                        protected PasswordAuthentication getPasswordAuthentication() {
                            return new PasswordAuthentication(Config.EMAIL, Config.PASSWORD);
                        }
                    });
            try {
                //Creating MimeMessage object
                MimeMessage mm = new MimeMessage(session);
                //Setting sender address
                mm.setFrom(new InternetAddress(Config.EMAIL));
                //Adding receiver
                mm.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
                //Adding subject
                mm.setSubject(subject);
                //Adding message
                mm.setText(message);
                //Sending email
                Transport.send(mm);
            } catch (MessagingException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    6. Ahora abra MainActivity.java y agregue el siguiente código.

    package com.sp.sendmailinternally;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    public class MainActivity extends AppCompatActivity {
        EditText edittext_recipient_id, edittext_subject, edittext_message;
        Button btn_send_mail;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //initializr vista para encontar vista por id
            edittext_recipient_id = (EditText) findViewById(R.id.edittext_recipient_id);
            edittext_subject = (EditText) findViewById(R.id.edittext_subject);
            edittext_message = (EditText) findViewById(R.id.edittext_message);
            btn_send_mail = (Button) findViewById(R.id.btn_send_mail);
    //activar un listener  onclick en un  boton
            btn_send_mail.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //get  input data from view
                    String mRecipientMail = edittext_recipient_id.getText().toString();
                    String mSubject = edittext_subject.getText().toString();
                    String mMessage = edittext_message.getText().toString();
                    new SendMailAsynTask(MainActivity.this, mRecipientMail, mSubject, mMessage).execute();
    //llama al contructor de send mail asyntask mediante el envio de un parametroperameter } }); } }

    7. Ya puede construir y ejecutar la aplicación  

    Nota:- cuando ponga su id debe ser accesible acceso menos seguro aplicaciones .Para cambiar configuración para motivos de seguridad de correo vaya a cambiar la configuración   y actiíela .

     

    sendmail1

    Por cierto todo el código  esta disponible en descargar código fuente

     

     

     

    A %d blogueros les gusta esto: