我们说我有一个保存文件saves.xyz
,我希望通过邮件分享。
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, content.getShareSubject());
intent.putExtra(Intent.EXTRA_TEXT, content.getShareText());
File savesFile = new File(Environment.getExternalStorageDirectory(), filePath);
Uri savesUri = Uri.fromFile(savesFile);
intent.putExtra(Intent.EXTRA_STREAM, savesUri);
String fileType = activity.getString(R.string.saves_file_type); //"text/xyz"
intent.setType(fileType);
String chooserMessage = activity.getString(R.string.saves_chooser_message);
activity.startActivity(Intent.createChooser(intent, chooserMessage));
这很好用。
但是,我现在希望能够重命名附件(比如saves-01-01-2017.xyz
)。
我已经考虑过复制文件,发送文件,然后将其删除,但之后没有找到方法将其删除干净(参见this)。
我还尝试实施自己的FileProvider
(建议here)并将saves-*.xyz
重定向到saves.xyz
,但我无法获得{{1}工作(我可能没有完全掌握他们的功能):
的manifest.xml
FileProvider
file_provider_paths.xml
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mydomain.myapp"
>
...
<application
...
>
<provider
android:name="com.mydomain.myapp.MyFileProvider"
android:authorities="com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
>
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"
/>
</provider>
...
</application>
</manifest>
MyFileProvider类
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path
name="saves_folder"
path="/"
/>
</paths>
如果我在这里开悟,我将感激不尽。
答案 0 :(得分:1)
你可能想尝试这种方式
File savesFile = new File(Environment.getExternalStorageDirectory(), filePath);
//rename your file here
File rename = new File(context.getCacheDir(), "renameithere.txt");
if (savesFile.exists()) {
savesFile.renameTo(rename);
}
此外,如果您使用的是FileProvider,请使用此方式获取Uri。
try {
return FileProvider.getUriForFile(context, authority, viewFile);
} catch (Exception ex) {
return Uri.fromFile(viewFile);
}
希望这有帮助。
答案 1 :(得分:1)
我使用FileProvider
和startActivityForResult
找到了一种比onSaveInstanceState
更清晰的方法(感觉太过分,而且无论如何都无法让它工作)。
将文件复制到所需名称:
try {
copyFile(saves_file, saves_tmp_file);
} catch (IOException ex) {
return false;
}
Uri saves_uri = Uri.fromFile(saves_tmp_file) ;
使用startActivityForResult
启动intent的活动:
activity.startActivityForResult(Intent.createChooser(intent, chooserMessage),
MY_REQUEST_CODE);
将临时文件的名称保存在活动的状态中:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outstate.putCharArray(TO_DELETE_PATH_BUNDLE_KEY, tmpFilePath.toCharArray());
}
恢复它:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//...
if (savedInstanceState != null) {
char[] array = savedInstanceState.getCharArray(TO_DELETE_PATH_BUNDLE_KEY);
if (array != null)
tmpFilePath = new String(array);
{
}
删除文件:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MY_REQUEST_CODE && tmpFilePath != null)
new File(Environment.getExternalStorageDirectory(), tmpFilePath).delete();
}
我想这种方法并不是最安全的,但它应该足够安全和清洁,以供我使用。