Android:Намерение.ACTION_SEND с EXTRA_STREAM не прикрепляет никаких изображений при выборе приложения Gmail на htc Hero
-
18-09-2019 - |
Вопрос
На эмуляторе с почтовым приложением по умолчанию все работает нормально.Но у меня нет прикрепления, когда я получаю письмо, которое я отправил от моего Героя с помощью приложения Gmail.Почтовое приложение по умолчанию на hero работает нормально.
Как я могу заставить этот код работать с приложением 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
Спасибо вам за ответ.
Решение
Для меня проблема была решена с помощью следующих строк кода:
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#MODE_WORLD_READABLE