2013-08-31 89 views
0

我見過幾個例子,但仍然不明白爲什麼,當我編輯郵件時,我看到附加的.xml文件,但是當我收到它沒有附件!Android發送xml文件不發送附件

這裏是我的代碼

File f = new File("data/data/xxx/files/xxx.xml"); 
        Boolean b1 = f.exists(); 
        Boolean b2 = f.canRead(); 
         if (b1 && b2) { 
          Intent sendIntent = new Intent(Intent.ACTION_SEND); 
          sendIntent.setType("text/plain"); 
          sendIntent.putExtra(Intent.EXTRA_EMAIL, ""); 
          sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + 
          f.getAbsolutePath())); 
          sendIntent.putExtra(Intent.EXTRA_SUBJECT, "XXX"); 
          sendIntent.putExtra(Intent.EXTRA_TEXT, R.string.mail_body); 
          startActivity(Intent.createChooser(sendIntent, "Email:")); 
         } else { 
... 

啊,只有一個細節......當我選擇該應用發送沒有主題或正文中,即使我寫putExtra(Intent.EXTRA_SUBJECT)和putExtra( Intent.EXTRA_TEXT),但這是一個細節...

編輯:我只是打擊了我的意圖:它表示「未緩存」的值的流,如何解決它?

enter image description here

回答

1

我見過幾個exemples,但仍然不知道爲什麼,當我編輯我看到的.xml連接,但是當我收到療法沒有附件的郵件!

首先,第三方應用程序無法讀取應用程序的內部存儲。

其次,這可能不是您的應用程序內部存儲的正確路徑。 千萬不要硬編碼路徑。例如,您的應用將無法在Android 4.2平板電腦上使用輔助帳戶和受限個人資料。請始終使用方法(如getFilesDir())來獲取內部存儲的一部分。

您需要將文件複製到外部存儲器,或者更好的方法是通過content://Uri來更新use FileProvider to serve up your file from internal storage

+0

它實際上是正確的道路。而且當我創建文件時,我使用了FileOutputStream fileOS = c.openFileOutput(FILE_NAME,Context.MODE_WORLD_READABLE);我相信,給其他應用程序讀取我的應用程序數據的權利,是不是? – Michele

+1

@Michele:「它實際上是正確的道路」 - 並非針對所有設備和所有用戶。 「我相信,給別人的應用程序讀取我的應用程序數據的權利,是不是?」 - 這應該。你的'Uri'也是格式不正確的,因爲你硬編碼了一個路徑,然後轉過身來搞亂了字符串連接。使用'getFileStreamPath(FILE_NAME)'獲取'File',然後使用'Uri.fromFile()'可靠地生成一個指向這個文件的'Uri'。您最好使用'FileProvider'服務,因爲您可以將對此文件的讀取訪問權限限制在此'startActivity()'調用中,而不是讓任何人訪問該文件。 – CommonsWare

+0

是的,這似乎對我好,我會嘗試這種方式:) – Michele

4

您不能附加從內部存儲文件直接爲一些安全的目的,所以首先你如果你願意,你可以刪除外部存儲該文件到該文件從內部複製到外部目錄,然後郵寄後onActivityResult()方法。

這裏有一個代碼:

private File copyFileToExternal(String fileName) { 
     File file = null; 
     String newPath = Environment.getExternalStorageState()+"/folderName/"; 
     try { 
      File f = new File(newPath); 
      f.mkdirs(); 
      FileInputStream fin = openFileInput(fileName); 
      FileOutputStream fos = new FileOutputStream(newPath + fileName); 
      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      while ((len1 = fin.read(buffer)) != -1) { 
       fos.write(buffer, 0, len1); 
      } 
      fin.close(); 
      fos.close(); 
      file = new File(newPath + fileName); 
      if (file.exists()) 
       return file; 
     } catch (Exception e) { 

     } 
     return null; 
    } 

方法電子郵件:

private void sendEmail(String email) { 

     File file = new File(Environment.getExternalStorageState()+"/folderName/" + fileName+ ".xml"); 
     Uri path = Uri.fromFile(file); 
     Intent intent = new Intent(android.content.Intent.ACTION_SEND); 
     intent.setType("application/octet-stream"); 
     intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject); 
     String to[] = { email }; 
     intent.putExtra(Intent.EXTRA_EMAIL, to); 
     intent.putExtra(Intent.EXTRA_TEXT, message); 
     intent.putExtra(Intent.EXTRA_STREAM, path); 
     startActivityForResult(Intent.createChooser(intent, "Send mail..."), 
       1222); 
    } 

然後

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == 1222) { 
      File file = new File(Environment.getExternalStorageState()+"/folderName/" + fileName+ ".xml"); 
      file.delete(); 
} 
} 

調用此方法是這樣的:

copyFileToExternal(filename + ".xml"); 
sendEmail(EmailId); 
+0

你如何分配'onActivityResult'回調'startActivityForResult'? –

+1

@JoshPinter舊的問題,但如果你仍然需要一個答案:'onActivityResult'回調是一個框架回調,這是'Activity'的一部分。當由'startActivityForResult'啓動的'Activity'返回/結束時它會自動被調用,並返回他使用的任意代碼「1222」。他沒有製作方法,但實際上@Override它們。 –

+0

@Turbo非常好,感謝您的跟進! –