【问题标题】:Android app file cannot be attached and send as an emailAndroid 应用程序文件无法附加并作为电子邮件发送
【发布时间】:2018-01-22 23:42:52
【问题描述】:

“无法附加文件” 我正在尝试从我的应用程序中附加图像并通过电子邮件将其作为附件发送。但是,一旦我从图库中选择图像,应用程序就会崩溃。它曾经在我第一次执行该应用程序时工作,但现在由于某种原因它似乎不起作用。但后来我通过将代码行更新为:

        attachmentFile = cursor.getString(columnIndex);
        Log.d("Attachment Path: "," " + attachmentFile);

从我的 Logcat 中,我找不到导致此问题的语句。

最初,我指的是这个问题并尝试了这个给出的答案。
“java.lang.NullPointerException: println needs a message”。

“我的 DespatchActivity”

package com.example.despatch4.resiscafftest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.net.Uri;
import android.widget.Button;
import android.provider.MediaStore;
import android.database.Cursor;
import android.util.Log;
import android.widget.EditText;

import android.widget.CheckBox;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DespatchActivity extends AppCompatActivity {
private Activity activity;

Button Attachment;
String attachmentFile;
Uri URI = null;
int columnIndex;
private static final int PICK_FROM_GALLERY = 101;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_despatch);
    this.setTitle("Residential Scaffold - Despatch");


    final EditText your_name = (EditText) findViewById(R.id.your_name);
    final EditText company_name = (EditText) findViewById(R.id.company_name);
    final EditText your_phone = (EditText) findViewById(R.id.your_ph);
    final EditText your_jobno = (EditText) findViewById(R.id.your_jobno);
    final EditText your_e_d =   (EditText) findViewById(R.id.your_e_d);
    final EditText job_details = (EditText) findViewById(R.id.job_details);
    final EditText your_date = (EditText) findViewById(R.id.your_date);

    Button email = (Button) findViewById(R.id.post_desp_message);
    Attachment = (Button) findViewById(R.id.bt_attach);

    email.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String name = your_name.getText().toString();
            String companyname = company_name.getText().toString();
            String phone = your_phone.getText().toString();
            String jobno = your_jobno.getText().toString();
            String ed = your_e_d.getText().toString();
            String jobdetails = job_details.getText().toString();
            String date = your_date.getText().toString();

            Intent sendEmail = new Intent(Intent.ACTION_SEND);



            sendEmail.setType("plain/text");
            sendEmail.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"Zamil@residentialscaffold.com.au"});

            sendEmail.putExtra(android.content.Intent.EXTRA_TEXT, "Name: " + name + '\n' + '\n'  + "Company Name: " + companyname + '\n' + '\n'
                    + '\n' + "Contact Number: " + phone + '\n' + '\n'  + "Job Number: " + jobno + '\n' + '\n'  +  "Erect/Dismantle: " + ed + '\n' + '\n'  + "Job Details: "
                    + jobdetails + '\n' + '\n'  + "Date Required: " + date);
                if (URI != null) {
                sendEmail.putExtra(Intent.EXTRA_STREAM, selectedImage);
            }
            startActivity(Intent.createChooser(sendEmail, "Send mail..."));

        }
    });


    //attach images
    Attachment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            openFolder();
        }
    });

}

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
Uri selectedImage = null;    
if (requestCode == PICK_FROM_GALLERY && resultCode == RESULT_OK) {
        selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };
        Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
        cursor.moveToFirst();
        columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        attachmentFile = cursor.getString(columnIndex);
        //Log.e("Attachment Path:", " " , attachmentFile);
        Log.d("Attachment Path: ","null" attachmentFile);
        URI = Uri.parse("file://" + attachmentFile);
        cursor.close();
    }
}

@Override
public void onResume() {
    super.onResume();
}

@Override
protected void onStart() {
    super.onStart();

}

@Override
protected void onStop() {
    super.onStop();

}

private boolean isValidEmail(String email) {
    String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

    Pattern pattern = Pattern.compile(EMAIL_PATTERN);
    Matcher matcher = pattern.matcher(email);
    return matcher.matches();
}

public void openFolder()
{
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    intent.putExtra("return-data", true);
    startActivityForResult(Intent.createChooser(intent, "Complete action using"), PICK_FROM_GALLERY);
}

}

当我尝试附加文件时,我的 Logcat 中就会发生这种情况:

 01-23 10:23:48.123 4334-4334/com.example.despatch4.resiscafftest 
 D/Attachment Path:: nullnull

电子邮件客户端已成功启动,并显示“无法附加文件”消息。

提前致谢。

【问题讨论】:

  • 将代码行更新为:String err = attachmentFile = cursor.getString(columnIndex); Log.d("附件路径:","null" + err);现在,该应用程序不会崩溃。但是没有附件。
  • 好吧,如果路径为空,那么您期望什么?为什么你称路径为err?不要尝试获取路径,而是直接使用获取的 uri。
  • 我尝试了Log.d("Attachment Path: "," " + err);,而不是null,它也没有给我附件。但是,如果我取下“”,应用程序会因 logcat “println 需要声明”而崩溃。
  • selectedImage = data.getData(); onActivityResult();删除那里的其余代码。也不要在你的代码中使用那些其他参数了。

标签: java android image-uploading email-attachments


【解决方案1】:
sendEmail.putExtra(Intent.EXTRA_STREAM, URI);

将该行更改为

sendEmail.putExtra(Intent.EXTRA_STREAM, data.getData());

data.getData() 是你在onActivityResult() 中得到的那个。`

不要乱找路径。

改为直接使用 uri。

代码也少得多;-)。

【讨论】:

  • 我试过了。但我的onClick 无法识别来自onActivityResult、data.getData() 的路径; “无法解析数据”
  • 您应该先将其保存在变量中。就像您将其存储在Uri selectedImage = data.getData(); 中一样。将其更改为 selectedImage = data.getData(); 并在您的活动开始时 Uri selectedImage = null;。然后在 onClick() 中使用selectedImage 如果它不为空。
  • 更新到 Uri selectedImage = null; Uri selectedImage = data.getData(); 在我的情况下 !null: ` if (URI != null) ` { sendEmail.putExtra(Intent.EXTRA_STREAM, selectedImage); } 但现在,未检测到所选图像。我还更新了我的问题中的代码,请您也检查一下。
  • Updated to Uri selectedImage = null; Uri selectedImage = data.getData(); 错误!!!那应该是Uri selectedImage = null; selectedImage = data.getData();。再次阅读我的说明!
  • Uri selectedImage = null; 你把它放在 onActivityResult() 中。把它拿出来!它应该放在活动代码的开头。而且你已经有了一个,否则你的代码将无法编译。你不应该像现在这样拥有两个。
猜你喜欢
  • 1970-01-01
  • 2013-07-11
  • 2014-07-04
  • 2016-04-29
  • 2019-10-12
  • 2011-11-28
  • 2011-07-21
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多