Android: Intent.ACTION_SEND с EXTRA_STREAM не прикрепляет изображения при выборе приложения Gmail в htc Hero
На эмуляторе с почтовым приложением по умолчанию все работает нормально. Но у меня нет прикрепленных файлов, когда я получаю письмо, которое я отправил от своего Героя с помощью приложения Gmail. Почтовое приложение по умолчанию на герое работает нормально.
Как сделать так, чтобы этот код работал с приложением Gmail на Hero?
Вы можете увидеть код ниже.
private void startSendIntent() {
Bitmap bitmap = Bitmap.createBitmap(editableImageView.getWidth(), editableImageView.getHeight(), Bitmap.Config.RGB_565);
editableImageView.draw(new Canvas(bitmap));
File png = getFileStreamPath(getString(R.string.file_name));
FileOutputStream out = null;
try {
out = openFileOutput(getString(R.string.file_name), MODE_WORLD_READABLE);
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");
startActivity(Intent.createChooser(emailIntent, getString(R.string.send_intent_name)));
}
в логах вижу следующее:
02-05 17:03:37.526: DEBUG/Gmail(11511): URI FOUND:file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.535: DEBUG/Gmail(11511): ComposeActivity added to message:0 attachment:|IMAG0001.jpg|image/jpeg|0|image/jpeg|LOCAL_FILE|file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg size:0
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> Attachment uri: file:///sdcard/DCIM/100MEDIA/IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> type: image/jpeg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> name: IMAG0001.jpg
02-05 17:03:37.585: INFO/Gmail(11511): >>>>> size: 0
Спасибо за ответ.
3 ответа
Для меня проблема была решена с помощью следующих строк кода:
Bitmap screenshot = Bitmap.createBitmap(_rootView.getWidth(), _rootView.getHeight(), Bitmap.Config.RGB_565);
_rootView.draw(new Canvas(screenshot));
String path = Images.Media.insertImage(getContentResolver(), screenshot, "title", null);
Uri screenshotUri = Uri.parse(path);
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.putExtra(Intent.EXTRA_STREAM, screenshotUri);
emailIntent.setType("image/png");
startActivity(Intent.createChooser(emailIntent, "Send email using"));
Главное, что я сохраняю снимок экрана в медиа-библиотеке, а затем он может успешно отправить файл оттуда.
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();
}
}
У меня были такие же симптомы. В моем случае это было потому, что я изначально сохранял вложение с разрешениями MODE_PRIVATE
, Как только я изменил это на MODE_WORLD_READABLE
похоже, что Gmail смог получить доступ к файлу и правильно отправить вложение. Хотя я вижу в вашем фрагменте кода, который вы использовали MODE_WORLD_READABLE
... странно
http://developer.android.com/reference/android/content/Context.html