【问题标题】:Android send email with attachment via intent serviceAndroid 通过意图服务发送带有附件的电子邮件
【发布时间】:2017-05-08 07:22:46
【问题描述】:

我正在尝试从我的应用程序发送一封电子邮件。 此电子邮件应包含附件。 我的 MainActiviry 调用意图服务并寻找权限。它看起来像这样 -

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) &&
                    (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) )
                startCommaSeparatedService();
            else  {
                if(shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) &&
                        shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE) )
                    Toast.makeText(this, "Track your nevi required access to external storage", Toast.LENGTH_LONG).show();
                requestPermissions(PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
            }
        } else {
            startCommaSeparatedService();
        }
}



private void startCommaSeparatedService() {
    ArrayList<ResultsExport> toExport = mDataBaseHelper.getAllDataParsed();
    if(toExport.size() > 0) {
            Intent intent = new Intent(MainActivity.this, CommaSeparatedValuesService.class);
            intent.setAction(CommaSeparatedValuesService.ACTION_EXPORT_TO_MAIL);
            intent.putParcelableArrayListExtra(CommaSeparatedValuesService.EXTRA_RESULT, toExport);
            startService(intent);
    } else
        Toast.makeText(getApplicationContext(), getResources().getString(R.string.no_results_to_export)
                , Toast.LENGTH_SHORT).show();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == REQUEST_EXTERNAL_STORAGE)
        if((grantResults[0] != PackageManager.PERMISSION_GRANTED) &&
                (grantResults[1] != PackageManager.PERMISSION_GRANTED))
            Toast.makeText(getApplicationContext(), "This application need permissions to external storage", Toast.LENGTH_LONG).show();
}

我的 CommaSeparatedValuesService 看起来像这样 -

package com.example.user.trackyournevi.services;

import android.app.IntentService;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.Nullable;

import com.example.user.trackyournevi.bl.ResultsExport;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

public class CommaSeparatedValuesService extends IntentService{

public static final String ACTION_EXPORT_TO_MAIL = "com.example.user.trackyournevi.services.action.ACTION_EXPORT_TO_MAIL";

public static final String EXTRA_RESULT = "com.example.user.trackyournevi.services.extra.PARENT";
public static final String EXTRA_TRASHED = "com.example.user.trackyournevi.services.extra.TRASHED";

public static final String COMMA_DELIMITER = ",";
public static final String NEW_LINE_SEPERATOR = "\n";

public static final String CSV_FILE_HEADER = "Scan date" + COMMA_DELIMITER + "Organ" + COMMA_DELIMITER
        + "Side" + COMMA_DELIMITER + "Recommendation" + COMMA_DELIMITER + "Changes" + NEW_LINE_SEPERATOR;

/**
 * Creates an IntentService.  Invoked by your subclass's constructor.
 *
 * @param name Used to name the worker thread, important only for debugging.
 */
public CommaSeparatedValuesService(String name) {
    super(name);
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    if(intent != null) {
        final String action = intent.getAction();
        if(ACTION_EXPORT_TO_MAIL.equals(action)) {
            boolean trashed = intent.getBooleanExtra(EXTRA_TRASHED, false);
            ArrayList<ResultsExport> results = intent.getParcelableArrayListExtra(EXTRA_RESULT);
            handleActionExport(results, trashed);
        }
    }
}


public void handleActionExport(ArrayList<ResultsExport> results, boolean trashed) {

    String path = null;
    try {
        path = writeToCSVFile(results);
    } catch (IOException e) {
        e.printStackTrace();
    }
    sentAttachedMail(path);
}

private static  String writeToCSVFile(ArrayList<ResultsExport> results) throws IOException {

    File patternDirectory = new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()+"/com.example.pattern1/myfile.txt");
    patternDirectory.mkdirs();

    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream (new File(patternDirectory.getAbsolutePath().toString()), true); // true will be same as Context.MODE_APPEND
        fos.write(CSV_FILE_HEADER.getBytes());
        fos.write("\n".getBytes());
        Iterator<ResultsExport> it = results.iterator();

        while (it.hasNext()) {
            ResultsExport r = it.next();
            fos.write(r.getScanDate().getBytes());
            fos.write(COMMA_DELIMITER.getBytes());
            fos.write(r.getOrgan().toString().getBytes());
            fos.write(COMMA_DELIMITER.getBytes());
            fos.write(r.getSide().getBytes());
            fos.write(COMMA_DELIMITER.getBytes());
            fos.write(r.getRecommendation().getBytes());
            fos.write(COMMA_DELIMITER.getBytes());
            fos.write(r.getChanges().getBytes());
            fos.write(NEW_LINE_SEPERATOR.getBytes());
            fos.close();
        }
    } catch (FileNotFoundException e) {e.printStackTrace();}


    return patternDirectory.getAbsolutePath().toString();
}

private void sentAttachedMail(String path) {
    Intent email = new Intent(Intent.ACTION_SEND);
    email.setType("text/plain");
    email.putExtra(Intent.EXTRA_SUBJECT, "My Scannings");
    email.putExtra(Intent.EXTRA_STREAM, Uri.parse(path));
    email.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(Intent.createChooser(email , "Email:"));
}


}

有人可以解释我在这段代码中穿了什么吗? 天呐

【问题讨论】:

  • someone can explain my whats worng in this code?。 ??你应该告诉你的代码出了什么问题。您为电子邮件发送问题发布了太多代码。

标签: android android-service email-attachments android-intentservice


【解决方案1】:

试试这个:添加 setType 并确保您的 uri 不为空

    Intent email = new Intent(Intent.ACTION_SEND);
    email.setType("text/plain");
    email.putExtra(Intent.EXTRA_SUBJECT, "My Scannings");
    email.putExtra(Intent.EXTRA_STREAM, Uri.parse(path));
    email.setType("message/rfc822");
    startActivity(Intent.createChooser(email , "Email:"));

【讨论】:

  • 我按照你的建议添加了这一行,但没有任何反应
猜你喜欢
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
相关资源
最近更新 更多