2012-04-29 6 views
1

Я работаю над приложением для Android, которое должно позволить пользователям делиться своим контентом через Gmail. Я использую версию Android 2.2 (Froyo). Проблема в том, что я не могу найти никакого рабочего решения для этого, я пробовал почти все, но не повезло. это код, я использую:Android: Share zip-файл через Gmail

Intent sharingIntent = new Intent(Intent.ACTION_SEND);; 
sharingIntent.setType("application/zip"); 

sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, 
getString(R.string.share_subject)); 
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, getString(R.string.share_body)); 

String zipFile = FileProvider.URI_AUTHORITY + File.separator + mItemSelected.getLibraryName() + File.separator + mItemSelected.getZipFileName(); 

sharingIntent.putExtra(Intent.EXTRA_STREAM, android.net.Uri.parse(zipFile)); 
startActivity(Intent.createChooser(sharingIntent, (getString(R.string.share_chooser)))); 
} 

Проблема в данном случае является то, что приложение Gmail, без всякой видимой причины, меняет тип пантомимы файла, и показать файл как текст/html , а затем мое приложение не отображается в списке приложений, который может работать с этим типом файла. Другое ограничение состоит в том, что я не хочу использовать text/html в своем фильтре намерений, потому что я хочу, чтобы он был сфокусирован как можно больше, и если бы это было возможно, я бы определил свой собственный тип mime ...

Я сделал небольшое исследование и нашел этот question, но без ответов ...

Других типов мима я пытался:

application/x-compressed, application/x-zip-compressed 
multipart/x-zip and application/octet-stream 

есть ли решение этой проблемы ??

Спасибо.

ответ

3

после многих неприятностей, я обнаружил, что Gmail, запущенный через Intent, не любит вложения, префикс которых - .zip. Итак, мне удалось отправить вложения после переименования «.vip». Вот кусок кода (Outfile является архивный файл переименован в «.vip»):

enter 
    private void sendMail(File outFile) { 
     Uri uriToZip = Uri.fromFile(outFile); 
     String sendText = "Dear friend,\n\n..."; 

     Intent sendIntent = new Intent(Intent.ACTION_SEND); 
     sendIntent.putExtra(android.content.Intent.EXTRA_EMAIL, 
      new String[] { "[email protected]" }); 
     sendIntent.putExtra(android.content.Intent.EXTRA_TEXT, sendText); 
     sendIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Log of the test " + expFilename); 

    // sendIntent.setType("image/jpeg"); 
    // sendIntent.setType("message/rfc822"); 
     sendIntent.setType("*/*"); 
     sendIntent.putExtra(android.content.Intent.EXTRA_STREAM, uriToZip); 
     startActivity(Intent.createChooser(sendIntent, "Send Attachment !:")); 
    } 

Пожалуйста, дайте мне знать, если это помогает. С уважением FD

+1

Это работает для отправки KMZ-файлов. Удивительно ... но (к сожалению) он предлагает множество дополнительных приложений, которые не имеют особого отношения к приложению gmail. – nyaray

+0

Woop woop, я нашел [этот другой ответ] (http://stackoverflow.com/questions/2197741/how-to-send-email-from-my-android-application), что я мог бы просто добавить 'EXTRA_STREAM' в и получить его до GMail, Google Диска и Skype в качестве приложений-кандидатов – nyaray

0

Я улучшаю свой предыдущий ответ для части, касающейся «застежки-молнии». Теперь нет проблем с вложениями .zip, отправленными через GMail или что-то еще. Попробуйте следующее:

{ 
       int lung; 
       FileInputStream in; 
       FileOutputStream out; 
       byte[] buffer = new byte[DIM_BUFFER]; 
    // compress the file to send 
       String inPath = ctx.getApplicationContext().getFilesDir().getAbsolutePath(); 
       outFile = new File(outPath,TestEdit.ZIPNAME); 
       // outFile = new File(outPath,filename + ".vip"); 
       in = new FileInputStream(inFile); 
       ZipEntry entry = new ZipEntry(filename + ".csv"); 
       try{ 
        out = new FileOutputStream(outFile); 
       // GZIPOutputStream zos; 
        ZipOutputStream zos; 
        zos = new ZipOutputStream(new BufferedOutputStream(out)); 
        zos.putNextEntry(entry); 
        try { 
         while ((lung=in.read(buffer)) > 0) { 
          Log.v(TAG, "Lunghezza di in=" + lung + ". Lungh di buffer=" + buffer.length); 
          if (buffer.length == lung) { 
           zos.write(buffer); 
          } else { 
           // Gestione del caso in cui il buffer non sia pieno 
           for (int b = 0; b < lung; b++) { 
            zos.write(buffer[b]); 
           } 
          } 
         } 
        } finally { 
         zos.closeEntry(); 
         zos.close(); 
         in.close(); 
         out.close(); 
        } 
    } 
    }