2013-04-03 43 views
6

Tôi đang gửi email có tệp đính kèm bằng Trình tạo nội dung.Gửi email bằng email có đính kèm không phải lúc nào cũng hoạt động

  1. Thứ nhất, tôi ghi tệp vào thư mục bộ nhớ cache.
  2. Sau đó, tôi tạo email có chứa url cho mỗi tệp được cung cấp bởi nhà cung cấp nội dung
  3. Sau đó, tôi bắt đầu một hoạt động mới với mục đích ACTION_SEND_MULTIPLE.
  4. Tôi chọn gmail và sau đó nhấn nút gửi.

Điều này đôi khi hoạt động, có vẻ như hoạt động lần đầu tiên trong một thời gian, nhưng không hoạt động sau lần thử tiếp theo ... nhưng không phải lúc nào cũng như vậy.

Khi không hoạt động, email bị kẹt khi gửi trong gmail. Điều này xảy ra trên 2.3.3 và 4.0.1, mở thư trong ứng dụng khách gmail và nhấn nút gửi để thường xuyên làm cho thư được gửi gần như ngay lập tức, nhưng không phải mọi lần.

Mở Mục đích bằng Google Drive có hành vi tương tự như gmail.

Mở Mục đích bằng ứng dụng khách thư trao đổi được tích hợp sẵn luôn hoạt động cho đến nay.

Đây là đoạn mã để gửi email:

  Intent sendIntent = new Intent(Intent.ACTION_SEND_MULTIPLE); 
      sendIntent.putExtra(Intent.EXTRA_EMAIL, exportParams.emailAddresses); 
      sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Leader Activity Report"); 
      sendIntent.putExtra(Intent.EXTRA_TEXT, "Leader Activity Report, see attached file."); 
      Uri fileUri = CachedFileProvider.createFileUri(result.fileName); 
      if (L.dbg()) 
       L.dbg("Using uri:" + fileUri.toString()); 
      ArrayList<Uri> uris = new ArrayList<Uri>(); 
      uris.add(fileUri); 
      Uri fileUri2 = CachedFileProvider.createFileUri(result.fileNameDayByDay); 
      uris.add(fileUri2); 
      if (L.dbg()) 
       L.dbg("Using uri2:" + fileUri2.toString()); 
      sendIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); 
      sendIntent.setType("text/plain"); 
      parent.startActivity(sendIntent); 

Dưới đây là các nhà cung cấp nội dung

public class CachedFileProvider extends ContentProvider { 

private static final String CLASS_NAME = "CachedFileProvider"; 
public static final String AUTHORITY = "com.josh.lll.file.provider"; 

private UriMatcher uriMatcher; 

@Override 
public boolean onCreate() { 
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
    uriMatcher.addURI(AUTHORITY, "*", 1); 
    return true; 
} 


@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) 
     throws FileNotFoundException { 
    try { 
     String LOG_TAG = CLASS_NAME + " - openFile"; 
     Log.v(LOG_TAG, 
       "Called with uri: '" + uri + "' - " + uri.getLastPathSegment()); 
     switch (uriMatcher.match(uri)) { 
     case 1: 
      String fileLocation = getContext().getCacheDir() + File.separator 
        + uri.getLastPathSegment(); 
      Log.i(CLASS_NAME,"Returning file :"+fileLocation); 
      ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(
        fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); 
      return pfd; 
     default: 
      Log.v(LOG_TAG, "Unsupported uri: '" + uri + "'."); 
      throw new FileNotFoundException("Unsupported uri: " 
        + uri.toString()); 
     } 
    } catch (FileNotFoundException t) { 
     Bug.major(this, t, "Could not return file descriptor"); 
     throw t; 
    } catch (RuntimeException t) { 
     Bug.major(this, t, "Could not return file descriptor"); 
     throw t; 
    } catch (Error t) { 
     Bug.major(this, t, "Could not return file descriptor"); 
     throw t; 
    } 
} 

public static String createFullyQualifiedFileName(Context c, String fileNamePart) { 
    File cacheDir = c.getCacheDir(); 
    Log.i(CLASS_NAME,"Using cache dir:"+cacheDir); 
    return cacheDir + File.separator + fileNamePart; 
} 

public static Uri createFileUri(String fileNamePart) { 
    return Uri.parse("content://" + AUTHORITY + "/"+ fileNamePart); 
} 

public int update(Uri uri, ContentValues contentvalues, String s, 
     String[] as) { 
    return 0; 
} 

@Override 
public int delete(Uri uri, String s, String[] as) { 
    return 0; 
} 

@Override 
public Uri insert(Uri uri, ContentValues contentvalues) { 
    return null; 
} 

@Override 
public String getType(Uri uri) { 
    return null; 
} 

@Override 
public Cursor query(Uri uri, String[] projection, String s, String[] as1, 
     String s1) { 
    return null; 
} 

}

Đối với cả thành công và 'bị đình trệ' email gửi thông điệp đăng nhập sau được in bằng gmail:

04-03 22:17:35.027: I/Gmail(13206): >>>>> Attachment uri: content://com.josh.lll.file.provider/report_20100401_20130402_LeadetJosh_3_1364980653516.csv 
04-03 22:17:35.035: I/Gmail(13206): >>>>>   type: text/plain 
04-03 22:17:35.035: I/Gmail(13206): >>>>>   size: 0 
04-03 22:17:35.054: I/Gmail(13206): >>>>> Attachment uri: content://com.josh.lll.file.provider/backup_20100401_20130402_LeadetJosh_3_1364980653516_day_by_day.lll 
04-03 22:17:35.054: I/Gmail(13206): >>>>>   type: text/plain 
04-03 22:17:35.054: I/Gmail(13206): >>>>>   size: 0 
+0

Sự cố này sẽ biến mất nếu tôi thêm một chuỗi duy nhất vào mỗi tên tệp. Đó không phải là điều tôi muốn làm. – placebojim

+0

Vâng. Trên thực tế nó không hoàn toàn biến mất nó chỉ là ít có khả năng. – placebojim

+2

Xin chào, bạn đã giải quyết được vấn đề này chưa? Tôi đang chạy vào một cái gì đó tương tự, nhưng trong trường hợp của tôi các email được gửi nhưng các tập tin đính kèm bị thiếu. Tôi nhận được cùng một thông điệp tường trình, nhưng kích thước là chính xác. – Pin

Trả lời

-3

Tìm thấy cách chữa bệnh:

  • Tắt Gmail.
  • Đặt lại về mặc định ban đầu.
  • Khởi động lại điện thoại như tắt và bật lại.
  • Bật Gmail.

nên làm việc cho file đính kèm lại

1

nó sẽ xảy ra cho các tập tin được lưu trữ trong các thư mục hệ thống như/data/app hoặc/hệ thống.

Giải pháp cho việc này là: Sao chép các tệp đó vào vị trí sdcard và đính kèm/sử dụng chúng từ đó.

Các vấn đề liên quan