2011-06-30 37 views
5

Tôi phải mở tệp đính kèm từ ứng dụng gmail qua ứng dụng của tôi.Ứng dụng Gmail dành cho Android-Thư đính kèm Sự cố URI

tôi nhận được liên kết trong mô hình như nội dung: //gmail-ls/messages/mailid%40gmail.com/4/attachments/0.1/BEST/false

Vấn đề của tôi là liên kết không phải là duy nhất cho mỗi tệp trong ứng dụng thư khách .. Một hoặc nhiều tệp có cùng số Uri.

Có cách nào để lấy tên tệp hoặc ngày gửi email để tôi có thể gặp vấn đề này không.

Xin cảm ơn trước.

Trả lời

2

Tôi đã giải quyết vấn đề này một cách gián tiếp.

Tôi đã xác định tính duy nhất bằng cách sử dụng kích thước tệp.

Trong hợp cụ thể, nếu bạn cần mã ở đây nó là

InputStream is = getContentResolver().openInputStream(uri); 
FILE_SIZE=is.available(); 
+1

tôi muốn lấy hình ảnh đính kèm từ ứng dụng Gmail để ứng dụng của tôi qua ý định share nhưng tôi không thể giải mã uri của tập tin như u quy định trong bài đăng "content: //gmail-ls/messages/mailid%40gmail.com/4/attachments/0.1/BEST/false" Xin vui lòng giúp đỡ. –

0

Tôi vừa mới đi qua cùng một vấn đề và tìm ra cách để có được tên file:

public static String getContentName(ContentResolver resolver, Uri uri){ 
    Cursor cursor = resolver.query(uri, new String[]{MediaStore.MediaColumns.DISPLAY_NAME}, null, null, null); 
    cursor.moveToFirst(); 
    int nameIndex = cursor.getColumnIndex(cursor.getColumnNames()[0]); 
    if (nameIndex >= 0) { 
     return cursor.getString(nameIndex); 
    } else { 
     return null; 
    } 
} 

Để sử dụng :

String fileName = getContentName(getContentResolver(), getIntent().getData()); 

Kính trọng.

7

Như được hiển thị bên dưới, bạn có thể tạo một bản sao cục bộ của cùng một tệp đính kèm và làm việc trên tệp đó. Trực tiếp bạn sẽ không thể truy cập tệp đó trên máy chủ gmail.

Uri uri = getIntent().getData(); 
    if (uri != null) { 
    try { 
     InputStream attachment = getContentResolver().openInputStream(uri); 
     if (attachment == null) 
      Log.e("GMAIL ATTACHMENT", "Mail attachment failed to resolve"); 
     else { 

      FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile"); 
      byte[] buffer = new byte[1024]; 
      while (attachment.read(buffer) > 0) 
       tmp.write(buffer); 
      tmp.close(); 
      attachment.close(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 
    return getCacheDir().getPath() + "/temp.myfile"; 

Hãy thêm lại để thêm điều này vào tệp kê khai của bạn.

<intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <action android:name="android.intent.action.EDIT" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data 
       android:host="*" 
       android:mimeType="application/octet-stream" 
       android:pathPattern=".*\\.tsconfig" /> 
      <!-- To handle gmail attachments --> 
    </intent-filter> 
0

Cảm ơn bạn Lokesh Kumar, mã của bạn đã giúp rất nhiều! Tuy nhiên, tôi muốn nêu bật vấn đề với giải pháp của bạn.

Khi cố gắng sử dụng mã này của bạn:

FileOutputStream tmp = new FileOutputStream(getCacheDir().getPath() + "/temp.myfile"); 
     byte[] buffer = new byte[1024]; 
     while (attachment.read(buffer) > 0) 
      tmp.write(buffer); 
     tmp.close(); 
     attachment.close(); 

nó đã sao chép vào toàn bộ tập tin, nhưng tôi nghĩ có một vấn đề. Khi thực hiện attachment.read(buffer), bạn đang đọc 1024 byte mỗi lần và cho phép nói rằng bạn có tệp 2000 byte. Trong lần đọc đầu tiên, bạn sẽ nhận được 1024 đầu tiên, sau đó vào lần đọc tiếp theo và cuối cùng, bạn sẽ nhận được 976 byte cuối cùng và từ những gì tôi thấy, trong trường hợp này, bộ đệm không làm sạch các byte cuối cùng. từ các bản xem trước, phần cuối của tệp sẽ là 976 byte từ lần đọc cuối cùng và 48 phần còn lại từ bài đọc trước lần đọc cuối cùng. Điều này sẽ làm cho phần cuối của tệp không chính xác.

Trong trường hợp của tôi, Tệp đính kèm là tệp kml (tệp dữ liệu vị trí dưới dạng xml) mà tôi phải sao chép. Bằng cách cố gắng sử dụng mã này tôi luôn luôn có kết thúc của kml không chính xác. sau khi đóng thẻ, tôi nhận được một số văn bản được đọc từ trước khi đọc.

Something như thế này:

</Document> 
</kml> 
278 
34.81186031,31.96118044 
34.81184437,31.96122622 
34.81181701,31.96127052 
34.81182701,31.9612875 

Tất nhiên, đây không phải là một kml hợp lệ, và nó sẽ gây ra lỗi khi cố gắng pars nó.

Vì vậy, tôi đã sử dụng một số mã khác để đọc từ luồng đầu vào đã làm công việc tốt hơn.

Đây là mã của tôi để sao chép các tập tin:

InputStream attachment = getContentResolver().openInputStream(container.uri); 
      FileOutputStream tmp = new FileOutputStream(container.fileName); 

      BufferedInputStream bis = new BufferedInputStream(attachment); 
      StringBuffer b = new StringBuffer(); 

      while (bis.available() != 0) { 
       char c = (char) bis.read(); 
       b.append(c); 
      } 

      bis.close(); 
      attachment.close(); 
      tmp.write(String.valueOf(b).getBytes()); 
      tmp.close(); 
Các vấn đề liên quan