Search code examples
javaandroidattachmentemail-attachments

Android Email intent with multiple attachments


I'm working on an app where the user can fill out a report card and send it through the email client of choice (Gmail in my case). In addition to text, the user needs to be able to attach one or more images, but I can't seem to get it to work (full code attached further down).

Below is the onActivityResult which attaches the images to the view and puts their Uris in "userSelectedImageUriList". This seems to work.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_CODE_BROWSE_PICTURE)
    {
        if(resultCode==RESULT_OK)
        {
            // Get return image uri. If select the image from camera the uri like file:///storage/41B7-12F1/DCIM/Camera/IMG_20180211_095139.jpg
            // If select the image from gallery the uri like content://media/external/images/media/1316970.
            Uri fileUri = data.getData();

            // Save user choose image file uri in list.
            if(userSelectedImageUriList == null)
            {
                userSelectedImageUriList = new ArrayList<Uri>();
            }
            userSelectedImageUriList.add(fileUri);

            // Create content resolver.
            ContentResolver contentResolver = getContentResolver();

            try {
                // Open the file input stream by the uri.
                InputStream inputStream = contentResolver.openInputStream(fileUri);

                // Get the bitmap.
                Bitmap imgBitmap = BitmapFactory.decodeStream(inputStream);

                ImageView imageview = new ImageView(ReportCard.this);
                LinearLayout linearLayout = (LinearLayout)findViewById(R.id.imageHolderLayout);
                LinearLayout.LayoutParams params = new LinearLayout
                        .LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

                // Add image path from drawable folder.
                imageview.setImageBitmap(imgBitmap);
                imageview.setLayoutParams(params);
                linearLayout.addView(imageview);

                inputStream.close();
            }catch(FileNotFoundException ex)
            {
                Log.e(TAG_BROWSE_PICTURE, ex.getMessage(), ex);
            }catch(IOException ex)
            {
                Log.e(TAG_BROWSE_PICTURE, ex.getMessage(), ex);
            }
        }
    }
}

Next, when the user clicks the send button I create the email intent.

public void sendReport(Context context) {
    EditText nameField = (EditText)findViewById(R.id.EditTextName);
    EditText emailField = (EditText)findViewById(R.id.EditTextEmail);
    EditText locationField = (EditText)findViewById(R.id.EditTextLocation);
    EditText dateField = (EditText)findViewById(R.id.EditTextDate);
    EditText bodyField = (EditText)findViewById(R.id.EditTextBody);

    if(!nameField.getText().toString().matches("") && !emailField.getText().toString().matches("") && !locationField.getText().toString().matches("") && !dateField.getText().toString().matches("") && !bodyField.getText().toString().matches("")) {
        PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("report_email", emailField.getText().toString()).commit();
        PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("report_name", nameField.getText().toString()).commit();

        String emailBody = "Name: "+nameField.getText()+"\n\n";
        emailBody += "Location: "+locationField.getText()+"\n\n";
        emailBody += "Time: "+dateField.getText()+"\n\n";
        emailBody += "Description: "+bodyField.getText();

        Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);

        // set the type to 'email'
        emailIntent.setType("text/plain");
        String to[] = {emailField.getText().toString()};
        emailIntent.putExtra(Intent.EXTRA_EMAIL, to);

        // the attachment
        emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, userSelectedImageUriList);

        // the mail
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report");
        emailIntent.putExtra(Intent.EXTRA_TEXT, emailBody);

        startActivity(Intent.createChooser(emailIntent , "Send using..."));
        finish();
    } else {
        Toast.makeText(this, getString(R.string.field_error), Toast.LENGTH_SHORT).show();
    }
}

Now, this is where things stop working. The chooser is displayed but the images are not attached. Gmail opens but a toast is displayed with "Could not attach file".

Full code

ReportCard.java

package com.zaewin.reports;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

public class ReportCard extends Activity {
    long reportID;
    long newRowId;
    // Log tag that is used to distinguish log info.
    private final static String TAG_BROWSE_PICTURE = "BROWSE_PICTURE";

    // Used when request action Intent.ACTION_GET_CONTENT
    private final static int REQUEST_CODE_BROWSE_PICTURE = 1;

    // Used when request read external storage permission.
    private final static int REQUEST_PERMISSION_READ_EXTERNAL = 2;

    // Save user selected image uri list.
    private ArrayList<Uri> userSelectedImageUriList = null;

    // Currently displayed user selected image index in userSelectedImageUriList.
    private int currentDisplayedUserSelectImageIndex = 0;

    @Override
    public void onBackPressed() {
        saveReport(ReportCard.this);
        finish();
    }

    // create an action bar button
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.reportmenu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    // handle button activities
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.deleteButton:
                new AlertDialog.Builder(this)
                    .setTitle(R.string.delete)
                    .setMessage(R.string.delete_prompt)
                    .setIcon(android.R.drawable.ic_dialog_alert)
                    .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            Bundle bundle = getIntent().getExtras();
                            Boolean deletestatus = deleteReport(getApplicationContext(), bundle.getInt("reportID"));

                            if(deletestatus == true) {
                                CharSequence text = getString(R.string.delete_success);
                                Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
                                toast.show();
                                finish();
                            } else {
                                CharSequence text = getString(R.string.delete_fail);
                                Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
                                toast.show();
                            }
                        }})
                    .setNegativeButton(android.R.string.no, null).show();
                return true;

            case R.id.saveButton:
                saveReport(getApplicationContext());
                return true;

            case R.id.sendButton:
                sendReport(getApplicationContext());
                return true;

            default:
                // If we got here, the user's action was not recognized.
                // Invoke the superclass to handle it.
                return super.onOptionsItemSelected(item);

        }
    }

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.report_view);
        setTitle(R.string.report_card);

        Bundle bundle = getIntent().getExtras();
        if(bundle != null) {
            reportID = bundle.getInt("reportID");
            loadReport(reportID);
        } else {
            setDefaults();
        }

        final Button button = (Button) findViewById(R.id.buttonAddPicture);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                // Because camera app returned uri value is something like file:///storage/41B7-12F1/DCIM/Camera/IMG_20180211_095139.jpg
                // So if show the camera image in image view, this app require below permission.
                int readExternalStoragePermission = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE);
                if(readExternalStoragePermission != PackageManager.PERMISSION_GRANTED)
                {
                    String requirePermission[] = {Manifest.permission.READ_EXTERNAL_STORAGE};
                    ActivityCompat.requestPermissions(ReportCard.this, requirePermission, REQUEST_PERMISSION_READ_EXTERNAL);
                }else {
                    openPictureGallery();
                }
            }
        });
    }

    /* Invoke android os system file browser to select images. */
    private void openPictureGallery()
    {
        // Create an intent.
        Intent openAlbumIntent = new Intent();

        // Only show images in the content chooser.
        // If you want to select all type data then openAlbumIntent.setType("*/*");
        // Must set type for the intent, otherwise there will throw android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.intent.action.GET_CONTENT }
        openAlbumIntent.setType("image/*");

        // Set action, this action will invoke android os browse content app.
        openAlbumIntent.setAction(Intent.ACTION_GET_CONTENT);

        // Start the activity.
        startActivityForResult(openAlbumIntent, REQUEST_CODE_BROWSE_PICTURE);
    }

    /* When the action Intent.ACTION_GET_CONTENT invoked app return, this method will be executed. */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode==REQUEST_CODE_BROWSE_PICTURE)
        {
            if(resultCode==RESULT_OK)
            {
                // Get return image uri. If select the image from camera the uri like file:///storage/41B7-12F1/DCIM/Camera/IMG_20180211_095139.jpg
                // If select the image from gallery the uri like content://media/external/images/media/1316970.
                Uri fileUri = data.getData();

                // Save user choose image file uri in list.
                if(userSelectedImageUriList == null)
                {
                    userSelectedImageUriList = new ArrayList<Uri>();
                }
                userSelectedImageUriList.add(fileUri);

                // Create content resolver.
                ContentResolver contentResolver = getContentResolver();

                try {
                    // Open the file input stream by the uri.
                    InputStream inputStream = contentResolver.openInputStream(fileUri);

                    // Get the bitmap.
                    Bitmap imgBitmap = BitmapFactory.decodeStream(inputStream);

                    ImageView imageview = new ImageView(ReportCard.this);
                    LinearLayout linearLayout = (LinearLayout)findViewById(R.id.imageHolderLayout);
                    LinearLayout.LayoutParams params = new LinearLayout
                            .LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);

                    // Add image path from drawable folder.
                    imageview.setImageBitmap(imgBitmap);
                    imageview.setLayoutParams(params);
                    linearLayout.addView(imageview);

                    inputStream.close();
                }catch(FileNotFoundException ex)
                {
                    Log.e(TAG_BROWSE_PICTURE, ex.getMessage(), ex);
                }catch(IOException ex)
                {
                    Log.e(TAG_BROWSE_PICTURE, ex.getMessage(), ex);
                }
            }
        }
    }

    /* After user choose grant read external storage permission or not. */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==REQUEST_PERMISSION_READ_EXTERNAL)
        {
            if(grantResults.length > 0)
            {
                int grantResult = grantResults[0];
                if(grantResult == PackageManager.PERMISSION_GRANTED)
                {
                    // If user grant the permission then open choose image popup dialog.
                    openPictureGallery();
                }else
                {
                    Toast.makeText(getApplicationContext(), "You denied read external storage permission.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    public void setDefaults()  {
        EditText emailField = (EditText)findViewById(R.id.EditTextEmail);
        emailField.setText(PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getString("report_email", ""), TextView.BufferType.EDITABLE);

        EditText nameField = (EditText)findViewById(R.id.EditTextName);
        nameField.setText(PreferenceManager.getDefaultSharedPreferences(getBaseContext()).getString("report_name", ""), TextView.BufferType.EDITABLE);

        Calendar c = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String formattedDate = df.format(c.getTime());

        EditText dateField = (EditText)findViewById(R.id.EditTextDate);
        dateField.setText(formattedDate, TextView.BufferType.EDITABLE);
    }

    public void loadReport(long reportID) {
        ReportDbHelper mDbHelper = new ReportDbHelper(getBaseContext());
        SQLiteDatabase db = mDbHelper.getReadableDatabase();

        // Define a projection that specifies which columns from the database
        // you will actually use after this query.
        String[] projection = {
                ReportContract.ReportEntry._ID,
                ReportContract.ReportEntry.COLUMN_NAME,
                ReportContract.ReportEntry.COLUMN_EMAIL,
                ReportContract.ReportEntry.COLUMN_LOCATION,
                ReportContract.ReportEntry.COLUMN_DATE,
                ReportContract.ReportEntry.COLUMN_BODY
        };

        // Filter results WHERE "title" = 'My Title'
        String selection = ReportContract.ReportEntry._ID + " = ?";
        String[] selectionArgs = { Long.toString(reportID) };

        // How you want the results sorted in the resulting Cursor
        String sortOrder = ReportContract.ReportEntry.COLUMN_NAME + " DESC";

        Cursor cursor = db.query(
                ReportContract.ReportEntry.TABLE_NAME,                     // The table to query
                projection,                               // The columns to return
                selection,                                // The columns for the WHERE clause
                selectionArgs,                            // The values for the WHERE clause
                null,                                     // don't group the rows
                null,                                     // don't filter by row groups
                sortOrder                                 // The sort order
        );


        //List itemIds = new ArrayList<>();
        while(cursor.moveToNext()) {
            EditText emailField = (EditText)findViewById(R.id.EditTextEmail);
            emailField.setText(cursor.getString(cursor.getColumnIndexOrThrow(ReportContract.ReportEntry.COLUMN_EMAIL)), TextView.BufferType.EDITABLE);

            EditText nameField = (EditText)findViewById(R.id.EditTextName);
            nameField.setText(cursor.getString(cursor.getColumnIndexOrThrow(ReportContract.ReportEntry.COLUMN_NAME)), TextView.BufferType.EDITABLE);

            EditText dateField = (EditText)findViewById(R.id.EditTextDate);
            dateField.setText(cursor.getString(cursor.getColumnIndexOrThrow(ReportContract.ReportEntry.COLUMN_DATE)), TextView.BufferType.EDITABLE);

            EditText locationField = (EditText)findViewById(R.id.EditTextLocation);
            locationField.setText(cursor.getString(cursor.getColumnIndexOrThrow(ReportContract.ReportEntry.COLUMN_LOCATION)), TextView.BufferType.EDITABLE);

            EditText bodyField = (EditText)findViewById(R.id.EditTextBody);
            bodyField.setText(cursor.getString(cursor.getColumnIndexOrThrow(ReportContract.ReportEntry.COLUMN_BODY)), TextView.BufferType.EDITABLE);
        }
        cursor.close();
        db.close();
    }

    public long saveReport(Context context) {
        EditText nameField = (EditText)findViewById(R.id.EditTextName);
        EditText emailField = (EditText)findViewById(R.id.EditTextEmail);
        EditText locationField = (EditText)findViewById(R.id.EditTextLocation);
        EditText dateField = (EditText)findViewById(R.id.EditTextDate);
        EditText bodyField = (EditText)findViewById(R.id.EditTextBody);

        ReportDbHelper mDbHelper = new ReportDbHelper(context);
        SQLiteDatabase db = mDbHelper.getWritableDatabase();

        // Create a new map of values, where column names are the keys
        ContentValues values = new ContentValues();
        values.put(ReportContract.ReportEntry.COLUMN_NAME, nameField.getText().toString());
        values.put(ReportContract.ReportEntry.COLUMN_EMAIL, emailField.getText().toString());
        values.put(ReportContract.ReportEntry.COLUMN_LOCATION, locationField.getText().toString());
        values.put(ReportContract.ReportEntry.COLUMN_DATE, dateField.getText().toString());
        values.put(ReportContract.ReportEntry.COLUMN_BODY, bodyField.getText().toString());

        CharSequence text;
        try {
            if(reportID == 0) {
                newRowId = db.insert(ReportContract.ReportEntry.TABLE_NAME, null, values);
                text = getString(R.string.save_success);
            } else {
                String where = ReportContract.ReportEntry._ID + " = ?";
                String[] whereArgs = new String[]{String.valueOf(reportID)};

                newRowId = db.update(ReportContract.ReportEntry.TABLE_NAME, values, where, whereArgs);
                text = getString(R.string.update_success);
            }
            Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
            toast.show();
            //finish();
        } catch(android.database.sqlite.SQLiteException ex) {
            text = getString(R.string.save_error);
            Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
            toast.show();
        }
        db.close();

        return newRowId;
    }

    public boolean deleteReport(Context context, Integer reportID) {
        ReportDbHelper mDbHelper = new ReportDbHelper(context);
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        Boolean status = db.delete(ReportContract.ReportEntry.TABLE_NAME, ReportContract.ReportEntry._ID + "=" + reportID, null) > 0;
        db.close();
        return status;
    }

    public void sendReport(Context context) {
        EditText nameField = (EditText)findViewById(R.id.EditTextName);
        EditText emailField = (EditText)findViewById(R.id.EditTextEmail);
        EditText locationField = (EditText)findViewById(R.id.EditTextLocation);
        EditText dateField = (EditText)findViewById(R.id.EditTextDate);
        EditText bodyField = (EditText)findViewById(R.id.EditTextBody);

        if(!nameField.getText().toString().matches("") && !emailField.getText().toString().matches("") && !locationField.getText().toString().matches("") && !dateField.getText().toString().matches("") && !bodyField.getText().toString().matches("")) {
            PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("report_email", emailField.getText().toString()).commit();
            PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("report_name", nameField.getText().toString()).commit();

            String emailBody = "Ditt namn: "+nameField.getText()+"\n\n";
            emailBody += "Plats: "+locationField.getText()+"\n\n";
            emailBody += "Tidpunkt: "+dateField.getText()+"\n\n";
            emailBody += "Beskrivning: "+bodyField.getText();

            Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);

            ArrayList<Uri> uris = new ArrayList<Uri>();
            for (Uri file : userSelectedImageUriList)
            {
                File fileIn = new File(file.toString());
                fileIn.setReadable(true, false);
                Uri u = Uri.fromFile(fileIn);
                uris.add(u);
            }

            // set the type to 'email'
            emailIntent.setType("text/plain");
            String to[] = {emailField.getText().toString()};
            emailIntent.putExtra(Intent.EXTRA_EMAIL, to);

            // the attachment
            emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);

            // the mail
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Rapport från Hamnarbetarappen");
            emailIntent.putExtra(Intent.EXTRA_TEXT, emailBody);

            startActivity(Intent.createChooser(emailIntent , "Skicka med..."));
            finish();
        } else {
            Toast.makeText(this, getString(R.string.field_error), Toast.LENGTH_SHORT).show();
        }
    }
}

report_view.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ScrollView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp">        
        <EditText
            android:id="@+id/EditTextName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="@string/report_name"
            android:inputType="textPersonName" >
        </EditText>
        <EditText
            android:id="@+id/EditTextEmail"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="@string/report_email"
            android:inputType="textEmailAddress" >
        </EditText>
        <EditText
            android:id="@+id/EditTextLocation"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="@string/report_location" >
        </EditText>
        <EditText
            android:id="@+id/EditTextDate"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="@string/report_date"
            android:inputType="datetime" >
        </EditText>
        <EditText
            android:id="@+id/EditTextBody"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="@string/report_description"
            android:inputType="textMultiLine"
            android:lines="5" >
        </EditText>        
        <LinearLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginBottom="5dp">
            <Button
                android:id="@+id/buttonAddPicture"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/blue_button"
                android:drawableRight="@drawable/ic_action_camera"
                android:padding="10dp"
                android:text="@string/report_takepicture"
                android:textAlignment="center"
                android:textColor="@color/actionbar_text" />
       </LinearLayout>
    <LinearLayout
        android:id="@+id/imageHolderLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginBottom="5dp">
    </LinearLayout>
</ScrollView>

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zaewin.reports" android:versionCode="1" android:versionName="1.0">
    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="22" />
    <uses-feature android:name="android.hardware.camera" android:required="true" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:required="true" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:required="true" />
    <uses-permission android:name="android.permission.INTERNET" android:required="true"/>

    <application android:theme="@style/CustomActionBarTheme" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:allowBackup="true">        
        <activity android:label="ReportCard" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden" android:name=".ReportCard">
            <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".ReportList" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>        
    </application>
</manifest>

Solution

  • I've solved it. When the images are chosen they are put into the ArrayList "userSelectedImageUriList" in onActivityResult.

    Instead of parsing this list in the sendReport method, I just add this list to the intent.

    The working method looks like this:

    public void sendReport(Context context) {
        EditText nameField = (EditText)findViewById(R.id.EditTextName);
        EditText emailField = (EditText)findViewById(R.id.EditTextEmail);
        EditText locationField = (EditText)findViewById(R.id.EditTextLocation);
        EditText dateField = (EditText)findViewById(R.id.EditTextDate);
        EditText bodyField = (EditText)findViewById(R.id.EditTextBody);
    
        if(!nameField.getText().toString().matches("") && !emailField.getText().toString().matches("") && !locationField.getText().toString().matches("") && !dateField.getText().toString().matches("") && !bodyField.getText().toString().matches("")) {
            PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("report_email", emailField.getText().toString()).apply();
            PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("report_name", nameField.getText().toString()).apply();
    
            String emailBody = "Name: "+nameField.getText()+"\n\n";
            emailBody += "Location: "+locationField.getText()+"\n\n";
            emailBody += "Time: "+dateField.getText()+"\n\n";
            emailBody += "Description: "+bodyField.getText();
    
            Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
    
            // set the type to 'email'
            emailIntent.setType("text/plain");
            String to[] = {emailField.getText().toString()};
            emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
    
            // the attachment - ArrayList populated in onActivityResult
            emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, userSelectedImageUriList);
    
            // the mail
            emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Report);
            emailIntent.putExtra(Intent.EXTRA_TEXT, emailBody);
    
            startActivity(Intent.createChooser(emailIntent , "Send with..."));
            //finish();
        } else {
            Toast.makeText(this, getString(R.string.field_error), Toast.LENGTH_SHORT).show();
        }
    }