2017-02-13 15 views
0

假設我有一個保存文件saves.xyz,並且我想通過郵件共享它。使用Intent.ACTION_SEND發送重命名的文件

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

我會很感激,如果我要在這裏啓發。

+0

'我現在想要能夠重命名附件'。多麼大驚小怪。首先重命名文件。然後附上它。 – greenapps

+0

發送意圖沒有指定名稱。 – greenapps

+0

@greenapps也許我不清楚。我希望附加文件具有不同的名稱,但我不想更改我的文件名,也沒有剩餘文件 – Irhala

回答

0

我發現一個比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(); 
} 

我想這個方法是不是最安全的,但它應該是安全的和我的用途不夠乾淨。

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

希望這會有所幫助。

+0

感謝您的回答。我嘗試過'getUriForFile',可惜無濟於事。另外,複製分機中的文件。緩存可以工作,但我想避免留下無用的文件,所以我會保留它作爲最後的手段選項 – Irhala

+0

此外,'getUriForFile'不會拋出異常,所以沒有必要抓住它 – Irhala