2013-06-30 3 views
5

У меня есть приложение, которое использует специально созданный файл двоичного файла (.gcsb). Эти файлы хранятся в папке на SD-карте.Как получить доступ к данным вложения gmail в моем приложении

В настоящий момент они перемещаются и выключаются с помощью ES-файла-проводника или производителя телефона, который ведет себя как USB-накопитель. Неуклюжий. Я хочу, чтобы я мог отправлять файлы по электронной почте, а затем открывать файлы в виде вложений из gmail, которые должны запускать приложение, которое затем сохранит их в соответствующей папке SD-карты.

Я нашел кое-что о настройке намерений - надеюсь, - запустите приложение, нажав «Предварительный просмотр» в gmail (в частности, Open custom Gmail attachment in my Android app), но я не уверен в том, как получить доступ к данным файла ! Я предполагаю, что это должно быть с одной из функций Intent.get ... Extra(), но которая и как ее использовать?

ответ

20

Обнаружено, как это сделать. Надеюсь, это может помочь кому-то другому. Сторона моя, частично от других должностей. Он предназначен для обработки прикрепленных файлов .gcsb.

Намерение-фильтр

<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> 

и код в деятельности OnCreate()/onRestart() является

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(); 
    } 
} 

Это, кажется, работает в стандартных Gmail для Android и почтовых приложений. Имя файла получается два разных способа, в зависимости от того, была ли нажата «загрузка» (файл схемы) или «предварительный просмотр» (содержимое схемы) в gmail.

Обратите внимание, что чрезвычайно важно, чтобы действие не было единым экземпляром.

+0

Спасибо так много! Я несколько часов задерживался на этом. – sigmabeta

+0

Кстати, вы знаете, необходимы ли какие-либо разрешения для выполнения вышеуказанного кода? – sigmabeta

+0

Спасибо, работал прямо! – mifthi

2

nwm01223 ответ правильный! Небольшое добавление: Его ответ работает только для ACTION_VIEW. если добавить

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); 
} 

он также будет работать для ACTION_SEND

Смежные вопросы