当前位置: 代码迷 >> Android >> 使用Intent.ACTION_SEND发送重命名的文件
  详细解决方案

使用Intent.ACTION_SEND发送重命名的文件

热度:74   发布时间:2023-08-04 10:33:31.0

假设我有一个保存文件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-*.xyzsaves.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);
    }
}

如果我能在这里得到启发,我将不胜感激。

您可能想尝试这种方式

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

希望这可以帮助。

我发现了一种比FileProvider更干净的方法(感觉太FileProvider了,无论如何我都无法使它工作),使用startActivityForResultonSaveInstanceState

将文件复制到所需名称:

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

我猜这种方法不是最安全的,但对于我的使用来说应该足够安全和??干净。

  相关解决方案