2017-02-13 3 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-*.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); 
    } 
} 

Я был бы признателен, если бы я должен был быть просветленным здесь.

+0

'Теперь я хочу иметь возможность переименовать прикрепленный файл'. Какая суета. Сначала переименуйте файл. Затем прикрепите его. – greenapps

+0

Нет ничего для отправки намерения указать имя. – greenapps

+0

@greenapps Возможно, я не был ясен. Я хочу, чтобы вложенный файл имел другое имя, но я не хочу менять имя моего файла и не оставлять файлы – Irhala

ответ

0

Я нашел более чистый способ, чем 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(); 
} 

Я думаю, этот метод не является безопасным, но оно должно быть безопасным и достаточно чистым для моих целей.

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, а затем использовать этот способ, чтобы получить Ури.

try { 
    return FileProvider.getUriForFile(context, authority, viewFile); 
} catch (Exception ex) { 
    return Uri.fromFile(viewFile); 
} 

Надеюсь, это поможет.

+0

Спасибо за ваш ответ. Я попробовал 'getUriForFile', к сожалению, безрезультатно. Кроме того, копирование файла в файл ext. кеш мог бы работать действительно, но я бы хотел, чтобы не оставлять в нем бесполезные файлы, поэтому я сохраню его как последнее средство. – Irhala

+0

Кроме того, 'getUriForFile' не генерирует исключений, поэтому от него не нужно улавливать – Irhala