2013-08-31 43 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非常好,感谢您的跟进! –