从内部存储通过意图共享文本文件

3

我创建了一堆文本文件,就像下面的代码一样。我将这些文件保存在内部存储中。现在我的目标是在ListView中显示它们,如果用户点击其中一个条目,应该通过意图(例如电子邮件)打开或发送文件。

static void createFile (Context context) {
    mTimeStamp = String.valueOf(System.currentTimeMillis()/1000);
    try {
        String fileName = "File_" + mTimeStamp + ".txt";
        mContext = context;
        mOutputStreamWriter = new 
        OutputStreamWriter(context.openFileOutput(fileName ,Context.MODE_PRIVATE));
        String path = mContext.getFilesDir().getAbsolutePath();
        Toast.makeText(mContext, "Creating file: " +  path, 
        Toast.LENGTH_LONG).show();

    } catch (FileNotFoundException e) {
        Log.e(TAG,"Error with creating file writer...");
        e.printStackTrace();
    }
}

static void writeToFileData(String dataToSave) {
    try {
        Toast.makeText(mContext, "Saving data to file: " +  dataToSave, Toast.LENGTH_SHORT).show();
        mOutputStreamWriter.write(dataToSave);
    } catch (IOException e) {
        Log.e(TAG,"Error with writing to file...");
        e.printStackTrace();
    }
}

static void closeFileWriter() {
    try {
        Toast.makeText(mContext, "Closing file... ", Toast.LENGTH_SHORT).show();
        mOutputStreamWriter.close();

    } catch (IOException e) {
        Log.e(TAG,"Error with closing file writer...");
        e.printStackTrace();
    }
}

然后我像这样列出了我的所有文件(现在不是在ListView中,只是为了测试):
static void testDispFiles (Context context) {
    mContext = context;
    String path = mContext.getFilesDir().getAbsolutePath();
    Log.v(TAG, "testDisp path: " + path);
    File dirFile = new File(path);

    File[] files = dirFile.listFiles();
    Log.v(TAG, "testDisp length: " + files.length);

    for (File f: files) {
        Log.v(TAG, "testDisp file: " + f.getName());
    }
}

我想通过发送电子邮件等方式分享一个文件。如何通过意图从内部存储发送文本文件?

//编辑:

我创建了一个意图,Gmail 应用程序返回“无法添加此文件”的提示消息。

String path = mContext.getFilesDir().getAbsolutePath();
File f = new File(path);
File[] files = f.listFiles();
Uri data = Uri.fromFile(files[0]);
Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_STREAM,data);
i.setType("plain/text");
i.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
i.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivity(i);

你可以使用TinyDB将字符串存储在内部存储器中,然后可以获取它:TinyDB.class 在此处 - Tarlan Ahad
使用 FileProvider:https://developer.android.com/reference/android/support/v4/content/FileProvider.html - CommonsWare
@CommonsWare,你能帮我一下吗?我从来没有使用过FileProvider。 - chebad
1
我给你提供了文档,并且这里还有更多这是一个示例应用程序,来自我的一本书,展示了如何在ACTION_IMAGE_CAPTUREACTION_VIEW中使用FileProvider。如果您对如何使用FileProvider有其他疑问,并且找不到相关的资料,请在Stack Overflow上提出单独的问题,说明您的具体问题。 - CommonsWare
对于 Kotlin,您可以尝试这个链接:https://dev59.com/H2Ml5IYBdhLWcg3w966L#62928442 - Shailendra Madda
2个回答

15

我找到了解决这个问题的其中一种方法。就像@CommonsWare建议的那样,我使用了FileProvider。我遵循了这个示例。但是在provider_paths.xml文件中,我放置了以下代码,因为我使用了内部存储。

<Paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="files" path="."/>
</Paths>

然后在我的活动中,我通过意图发送一个文件,就像这样:

       Uri path = FileProvider.getUriForFile(this,"same_authoritory_which_was_in_manifest", new File(FILE_TO_SAVE.getPath()));
       Intent i = new Intent(Intent.ACTION_SEND);
       i.putExtra(Intent.EXTRA_TEXT, "Test");
       i.putExtra(Intent.EXTRA_STREAM, path);
       i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
       i.setType("plain/*");
       startActivity(i);

1
你可以使用openFileOutput()将文件存储在应用程序的内部私有存储空间中,例如getFilesDir()
其他应用程序无法访问这些文件。
如果您想共享这些文件,则需要使用文件提供程序进行服务。
对于共享文件,这是一个标准操作。
您可以在各个地方找到代码。

你能帮我解决这个问题吗?因为我从未使用过文件提供程序,也不知道如何处理它。 - chebad
谷歌一下吧,你可以在各个地方找到代码。 - greenapps
你可以直接从分享意图的代码开始。请发布。谷歌搜索Intent.ACTION.SEND和Intent.EXTRA_STREAM。 - greenapps
我试图使用这段代码发送它:我的代码。 但是当我选择Gmail应用程序时,我会收到一个“您无法添加此文件”的错误。 - chebad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接