通过 Intent 从内部存储共享文本文件
Share text file via Intent from internal storage
我创建了一堆文本文件,这些文件是我在下面的代码中创建的。我将这些文件保存在内部存储器中。我现在的目标是在 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 应用程序返回 toast "You can't add this file" 消息的 Intent。
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);
您使用 openFileOutput()
存储您的文件,这确实在您应用程序的内部私有内存中。喜欢 getFilesDir()
.
没有其他应用程序可以访问。
如果您想共享文件,则必须使用文件提供商来提供这些文件。
对于其他人来说,共享文件是一个标准动作。
代码随处可见。
我找到了解决这个问题的方法之一。 @CommonsWare 如何建议我使用 FileProvider。我关注这个example。但是在provider_paths.xml我放了这段代码,因为我用的是内部存储。
<Paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="."/>
</Paths>
然后在 activity 我通过这样的意图发送一个文件:
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);
我创建了一堆文本文件,这些文件是我在下面的代码中创建的。我将这些文件保存在内部存储器中。我现在的目标是在 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 应用程序返回 toast "You can't add this file" 消息的 Intent。
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);
您使用 openFileOutput()
存储您的文件,这确实在您应用程序的内部私有内存中。喜欢 getFilesDir()
.
没有其他应用程序可以访问。
如果您想共享文件,则必须使用文件提供商来提供这些文件。
对于其他人来说,共享文件是一个标准动作。
代码随处可见。
我找到了解决这个问题的方法之一。 @CommonsWare 如何建议我使用 FileProvider。我关注这个example。但是在provider_paths.xml我放了这段代码,因为我用的是内部存储。
<Paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="."/>
</Paths>
然后在 activity 我通过这样的意图发送一个文件:
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);