【问题标题】:Share text file via Intent from internal storage通过 Intent 从内部存储共享文本文件
【发布时间】:2017-12-23 19:48:20
【问题描述】:

我创建了一堆我在下面的代码中创建的文本文件。我将这些文件保存在内部存储中。我现在的目标是在 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());
    }
}

现在我想通过例如发送文件来共享其中一个文件。电子邮件。如何通过意图从内部存储发送文本文件?

//编辑:

我创建了一个 Intent,它会从 Gmail 应用程序返回 toast“您无法添加此文件”消息。

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);

【问题讨论】:

标签: android android-intent internal-storage android-internal-storage


【解决方案1】:

我找到了解决此问题的方法之一。 @CommonsWare 如何建议我使用 FileProvider。我关注这个example。但是在 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);

【讨论】:

    【解决方案2】:

    您使用openFileOutput() 存储您的文件,这确实在您的应用程序的内部私有内存中。喜欢getFilesDir()

    没有其他应用可以访问。

    如果您想共享文件,则必须使用文件提供程序来提供它们。

    对于其他人来说,共享文件是一种标准操作。

    您可以在各处找到代码。

    【讨论】:

    • 你能帮我解决这个问题吗?因为我从不使用文件提供程序,也不知道如何使用它。
    • 谷歌为它。您可以在各处找到代码。
    • 您可以从共享意图的代码开始。请发帖。 Google for Intent.ACTION.SEND 和 Intent.EXTRA_STREAM。
    • 我尝试使用以下代码发送它:my code。但是当我选择一个 gmail 应用程序时,我得到一个“你不能添加这个文件”。
    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多