Android通过Intent将文件大于1 MB发送到邮件应用程序

时间:2015-02-23 15:02:30

标签: android performance email android-intent android-activity

我得到"失败的Binder交易错误"当我想从TextView中获取文本并将其像文本一样放在Intent中 对于小文本它可以工作,我正确地获取文本,并在我的邮件应用程序中。

有没有办法将TextView中的文本大小放入Mail应用程序? 何时以及如何跟踪文件并确保它们已被删除而不是向设备发送垃圾邮件。解决方案的设计是什么?

我的代码以及少量文本的代码如下所示。

private void sendLogMail() {
        try {
            if ("".equals(logTextView.getText().toString().trim())) {
                Toast.makeText(getApplicationContext(), "Sorry, no log information to send", Toast.LENGTH_LONG).show();
            }
            else {
                String[] mailReceiver = new String[] { getString(R.string.logviewer_mailto)};
                startActivity( Intent.createChooser(
                        new Intent(Intent.ACTION_SEND).setData(Uri.parse("mail:to")).setType("text/plain")
                                .putExtra(Intent.EXTRA_EMAIL, mailReceiver)
                                .putExtra(Intent.EXTRA_SUBJECT, "Log:  " + Utils.formatReadableTimestamp( System.currentTimeMillis()))
                                .putExtra(Intent.EXTRA_TEXT, getInfo() + "\n" + "\n" + "Log: "+ "\n"+logTextView.getText()),
                                 "Please config your  mail account") );
            }
        }
        catch (Exception e) {
            getLog().error("Error sending logfile as email", e);
        }
    }

    private String getInfo() throws Exception {
        return new StringBuilder()
                .append("Terminal ID: " + getCore().getID())
                .append("\n")
                .append("License ID: " + getCore().getLicense())
                .append("\n")
                .append("Outlet ID: " + getCore().getOtherID())
                .append("\n")
                .append("Name: "+" "+getLoggedIn().getFormattedName())
                .append("/")
                .append(" ")
                .append(getLoggedIn().getId())
                .toString();
    }
}

2 个答案:

答案 0 :(得分:0)

  

有没有办法将文本的大小从TextView放入Mail应用程序?

选项包括:

  • 将其写入内部存储上的文件并使用FileProvider将其提供给邮件客户端,将Uri放入EXTRA_STREAM

  • 创建一些ContentProvider以便将其从RAM提供给邮件客户端,将Uri放入EXTRA_STREAM

  • 将其写入外部存储上的文件以将其提供给邮件客户端,将Uri放入EXTRA_STREAM中的文件

  

您何时以及如何跟踪这些文件,并确保我们已将其删除,并且不会将设备发送垃圾邮件。

我会将文件保存在内部存储中,可能在getCacheDir()中,然后在24小时后将其删除。或者等等。

答案 1 :(得分:0)

我发现了如何实施解决方案 在最后打开标准Android ICS预安装邮件应用程序,附带文件到邮件。

希望这对某些人也有帮助

代码在

之下

一般方法

 private void sendLogMail() {
            try {
                if ("".equals(logTextView.getText().toString().trim())) {
                    Toast.makeText(getApplicationContext(), "Sorry, no log information to send", Toast.LENGTH_LONG).show();
                }
                else {
                    String[] mailReceiver = new String[] { getString(R.string.logviewer_mailto)};
                    Intent emailIntent = new Intent(Intent.ACTION_SEND);

                    StringBuilder logBuffer = new StringBuilder();
                    logBuffer.append( getTerminalInfo() ).append( "\n\n" );
                    logBuffer.append( "Log attached!" );

                    File logFile = writeLogFile( getInfo() );
                    Uri uri = Uri.fromFile( logFile );

                    emailIntent.setData(Uri.parse("mail:to"));
                    emailIntent.putExtra(Intent.EXTRA_EMAIL, mailReceiver);
                    emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Log:  " + Utils.formatReadableTime( System.currentTimeMillis()));
                    emailIntent.putExtra(Intent.EXTRA_TEXT, logBuffer.toString() );

                    emailIntent.setType("text/plain");
                    if (uri != null) {
                        emailIntent.putExtra(Intent.EXTRA_STREAM, uri);
                    }

                    startActivity( Intent.createChooser( emailIntent, "Please choose the mail client to use" ) );

                }
            }

这里我只是将其写入文件

private File writeLogFile( String terminalInfo ) throws IOException {
        File dir = Logger.getInstance().getPublicLogDirectory();

        File logFile = new File( dir.getAbsolutePath(),+Utils.getFormattedTime( System.currentTimeMillis()) + ".log" );
        OutputStream os = new BufferedOutputStream( new FileOutputStream( logFile ) );

        try {
            os.write( terminalInfo.getBytes() );
            os.write( "\n\n".getBytes() );
            os.write( logTextView.getText().toString().getBytes() );
            os.flush();
        }
        finally {
            os.close();
        }

        return logFile;
    }

private String getInfo() throws Exception {
        return new StringBuilder()
                .append("Terminal ID: " + getCore().getID())
                .append("\n")
                .append("License ID: " + getCore().getLicense())
                .append("\n")
                .append("Outlet ID: " + getCore().getOtherID())
                .append("\n")
                .append("Name: "+" "+getLoggedIn().getFormattedName())
                .append("/")
                .append(" ")
                .append(getLoggedIn().getId())
                .toString();
    }

Make directory



     public File getPublicLogDirectory() {
                File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
                dir.mkdirs();

                File logDir = new File( dir, "logs" );
                logDir.mkdirs();

                return logDir;
            }

    check if files exist
        public void cleanPublicLogDirectory() throws IOException {
            File dir = getPublicLogDirectory();

            File logFiles[] = dir.listFiles();

            if( logFiles != null && logFiles.length > 0 ) {
                for( File logFile : logFiles ) {
                    if( logFile.getName().endsWith( ".log" ) ) {
                        long lastModified = logFile.lastModified();

                        // Delete files older than 24 hours
                        if( (System.currentTimeMillis() - lastModified) > 1 ) { // 1000*60*60*24 ) { 
                            logFile.delete();
                        }
                    }
                }
            }
        }