getFileStreamPath()
или openFileOutput()
создаст файлы в личном каталоге, недоступном для других приложений (например, Gmail). Используйте внешнее хранилище для создания общедоступных файлов:
private static final int REQUEST_SHARE = 39714;
private File png = null;
private void startSendIntent() {
png = new File(new File(Environment.getExternalStorageDirectory(), "Pictures"), getString(R.string.file_name));
FileOutputStream out = null;
try {
out = new FileOutputStream(png);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) out.close();
}
catch (IOException ignore) {}
}
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(png));
emailIntent.setType("image/png");
startActivityForResult(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)), REQUEST_SHARE);
}
}
Это не будет работать, когда внешнее хранилище недоступно, например, когда оно подключено как USB-накопитель. См. Руководство по API хранилища для получения дополнительной информации о том, как определить, доступно ли внешнее хранилище.
Если ваш минимальный уровень API равен 8 или выше, вы можете использовать Context.getExternalCacheDir()
или Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
в качестве родительского каталога.
Если вы не используете getExternalCacheDir()
, убедитесь, что вы используете уникальное имя файла, чтобы предотвратить случайную перезапись одного из файлов пользователя.
Наконец, вы можете переопределить onActivityResult()
, чтобы удалить файл после завершения операции общего доступа:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUEST_SHARE) {
if(this.png == null) {
return;
}
this.png.delete();
}
}