Android - 文件提供程序 - 通过电子邮件发送文件

时间:2017-05-22 08:36:41

标签: android email-attachments android-fileprovider

我目前正在寻找一种方法将文件保存在设备的内部存储器中,然后通过邮件发送。为此,我使用 FileProvider

所以在Android Manifest上,我在清单中添加了这些行:



 <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="exploration.syte.fr.sendbymail4.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/paths" />

    </provider>
&#13;
&#13;
&#13;

在res / xml路径上,我添加了这个文件路径: paths.xml

&#13;
&#13;
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="files" path="files/"/>

</paths>
&#13;
&#13;
&#13;

以下是我用来创建文件的代码 - 一个非常简单的文本文件,其中包含单词&#34; test&#34;。

&#13;
&#13;
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  String textToWrite = "test";
  try {
    File path = this.getFilesDir();
    File file = new File(path, "myfile.txt");
    String chemin = file.getAbsolutePath().toString();
    Log.i("MainActivity", chemin);
    Toast.makeText(this, chemin, Toast.LENGTH_LONG).show();
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(textToWrite.getBytes());
    fos.close();
    //Toast.makeText(this, "File correctly saved", Toast.LENGTH_LONG).show();
  } catch (Exception e) {
    Log.d("Main", "Exception", e);
  }
  try {
    sendFile(this);
  } catch (Exception e) {
    Log.d("Main", "Exception", e);
  }
}
&#13;
&#13;
&#13;

我用来通过电子邮件发送文件的代码

&#13;
&#13;
 public static void sendFile(Context context){
        Intent intent=new Intent(Intent.ACTION_SEND);
        intent.setType("text/plain");
        String directory=(String.valueOf(context.getFilesDir())/*+File.separator+"directory"*/);
        File file=new File(directory+File.separator+"myfile.txt");

        Uri uri = FileProvider.getUriForFile(context, "exploration.syte.fr.sendbymail4.fileprovider", file);
        intent.putExtra(Intent.EXTRA_STREAM, uri);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        context.startActivity(intent);
    }
&#13;
&#13;
&#13;

**我目前遇到的问题是:**

  • 我的文件未保存在正确的目录中:它保存在/data/user/0/exploration.syte.fr.sendbymail4/files/myfile.txt

我希望我的文件保存在:/data/data/exploration.syte.fr.sendbymail4/files/myfile.txt

如何正确保存文件,我该如何设置路径?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我将保存图像

(defun is-cube-p (n)
  (let* ((real-root (expt n 1/3))
         (real-root-int-part (round real-root))
         (m (expt real-root-int-part 3)))
    (= n m)))

file_provider_paths.xml

    public static String saveImage(Context context, Bitmap finalBitmap) {
        String root = context.getFilesDir().getAbsolutePath();
//        String root = context.getCacheDir().getAbsolutePath();
        File myDir = new File(root + subFolder);
        if (!myDir.exists()) {
            myDir.mkdirs();
        }
        File file = new File(myDir, dateFilenameFormat.format(new Date()) + ".jpg");
        try {
            FileOutputStream out = new FileOutputStream(file);
            downScale(finalBitmap).compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
            return file.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

并发送(从“缓存”或“文件”目录获取getFilesDir或getFilesDir)

<paths>
    <cache-path name="cache" path="/" />
    <files-path name="files" path="/" />
</paths>

}