问题描述
假设我有一个保存文件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
)。
我想过复制文件,发送,然后将其删除,但还没有找到一种方法来删除干净之后(见 )。
我也试图实现自己的FileProvider
(如建议 ),并重定向saves-*.xyz
到saves.xyz
,但我不能让FileProvider
工作(我可能没有完全掌握它们的功能):
manifest.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>
file_provider_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path
name="saves_folder"
path="/"
/>
</paths>
MyFileProvider类
public class MyFileProvider extends FileProvider {
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
//doesn't print anything
Log.d(MyFileProvider.class.getSimpleName(), uri.toString());
return super.openFile(uri, mode);
}
}
如果我能在这里得到启发,我将不胜感激。
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);
}
希望这可以帮助。
2楼
我发现了一种比FileProvider
更干净的方法(感觉太FileProvider
了,无论如何我都无法使它工作),使用startActivityForResult
和onSaveInstanceState
。
将文件复制到所需名称:
try {
copyFile(saves_file, saves_tmp_file);
} catch (IOException ex) {
return false;
}
Uri saves_uri = Uri.fromFile(saves_tmp_file) ;
使用startActivityForResult
启动意图的活动:
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();
}
我猜这种方法不是最安全的,但对于我的使用来说应该足够安全和??干净。