2013-06-30 41 views
5

Tôi có một ứng dụng sử dụng loại tệp nhị phân được tạo cụ thể (.gcsb). Những tập tin này được lưu giữ trong một thư mục trên sdcard.Cách truy cập dữ liệu đính kèm gmail trong ứng dụng của tôi

Hiện tại, chúng được di chuyển và tắt bằng cách sử dụng trình khám phá tệp ES hoặc nhà sản xuất điện thoại 'hoạt động giống như các tiện ích truyền của ổ USB'. Clunky. Những gì tôi muốn là có thể gửi email các tập tin vào điện thoại, sau đó để mở các tập tin như tập tin đính kèm từ bên trong gmail, mà nên cháy lên các ứng dụng, sau đó sẽ lưu chúng vào thư mục thẻ SD thích hợp.

Tôi đã tìm thấy một số nội dung về việc thiết lập mục đích - hy vọng - khởi động ứng dụng bằng cách nhấp vào 'xem trước' trong gmail (cụ thể là Open custom Gmail attachment in my Android app), nhưng điều tôi không chắc chắn là cách truy cập dữ liệu tệp ! Tôi đoán nó phải được với một trong những Intent.get ... Extra() chức năng, nhưng đó, và làm thế nào để sử dụng nó?

Trả lời

20

Tìm hiểu cách thực hiện. Hy vọng rằng điều này có thể giúp người khác. Mỏ bên, một phần từ các bài viết khác. Nó nhằm mục đích xử lý các tệp đính kèm .gcsb.

Mục đích-lọc là

<intent-filter> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
    <data android:mimeType="application/octet-stream" /> 
</intent-filter> 

và mã trong hoạt động onCreate()/onRestart() là

Intent intent = getIntent(); 
InputStream is = null; 
FileOutputStream os = null; 
String fullPath = null; 

try { 
    String action = intent.getAction(); 
    if (!Intent.ACTION_VIEW.equals(action)) { 
     return; 
    } 

    Uri uri = intent.getData(); 
    String scheme = uri.getScheme(); 
    String name = null; 

    if (scheme.equals("file")) { 
     List<String> pathSegments = uri.getPathSegments(); 
     if (pathSegments.size() > 0) { 
      name = pathSegments.get(pathSegments.size() - 1); 
     } 
    } else if (scheme.equals("content")) { 
     Cursor cursor = getContentResolver().query(uri, new String[] { 
      MediaStore.MediaColumns.DISPLAY_NAME 
     }, null, null, null); 
     cursor.moveToFirst(); 
     int nameIndex = cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME); 
     if (nameIndex >= 0) { 
      name = cursor.getString(nameIndex); 
     } 
    } else { 
     return; 
    } 

    if (name == null) { 
     return; 
    } 

    int n = name.lastIndexOf("."); 
    String fileName, fileExt; 

    if (n == -1) { 
     return; 
    } else { 
     fileName = name.substring(0, n); 
     fileExt = name.substring(n); 
     if (!fileExt.equals(".gcsb")) { 
      return; 
     } 
    } 

    fullPath = ""/* create full path to where the file is to go, including name/ext */; 

    is = getContentResolver().openInputStream(uri); 
    os = new FileOutputStream(fullPath); 

    byte[] buffer = new byte[4096]; 
    int count; 
    while ((count = is.read(buffer)) > 0) { 
     os.write(buffer, 0, count); 
    } 
    os.close(); 
    is.close(); 
} catch (Exception e) { 
    if (is != null) { 
     try { 
      is.close(); 
     } catch (Exception e1) { 
     } 
    } 
    if (os != null) { 
     try { 
      os.close(); 
     } catch (Exception e1) { 
     } 
    } 
    if (fullPath != null) { 
     File f = new File(fullPath); 
     f.delete(); 
    } 
} 

Nó xuất hiện để làm việc trong gmail và email các ứng dụng tiêu chuẩn của Android. Tên tệp được lấy theo hai cách khác nhau tùy thuộc vào việc 'tải xuống' (tệp lược đồ) hoặc 'xem trước' (nội dung chương trình) đã được nhấn trong gmail.

Lưu ý rằng điều cực kỳ quan trọng là hoạt động không được đặt là một trường hợp duy nhất.

+0

Cảm ơn bạn rất nhiều! Tôi đã bị mắc kẹt trên một cái gì đó như thế này trong nhiều giờ. – sigmabeta

+0

Ngẫu nhiên, bạn có biết liệu có bất kỳ quyền nào được yêu cầu để làm cho mã trên hoạt động không? – sigmabeta

+0

Cảm ơn bạn, đã làm việc ngay! – mifthi

2

nwm01223 'câu trả lời là chính xác! Phụ lục nhỏ: Câu trả lời của anh chỉ hoạt động cho ACTION_VIEW. nếu bạn thêm

Uri uri = null; 
if(Intent.ACTION_VIEW.equals(action)){ 
    uri = intent.getData(); 
} else if(Intent.ACTION_SEND.equals(action)){ 
    uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 
} 

nó cũng sẽ làm việc cho ACTION_SEND

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