2010-12-12 4 views
9

Ранее я задал вопрос о том, что появляется в IntentChooser, когда я отправляю Intent с ACTION_SEND и MIME-типом «image/png». Проблема в том, что на некоторых телефонах есть приложение для обмена сообщениями по умолчанию, которое не отображается в списке, включая мой (myTouch 4G), а также пользователь, с которым я разговариваю по электронной почте (используя HTC EVO). Если я выбираю параметр «Отправить» или «Поделиться» из встроенного приложения галереи или другого приложения на том же изображении, которое я сохраняю и пытаюсь отправить непосредственно из своего приложения, в нем отображаются сообщения. Из моего приложения это не так. У других телефонов нет этой проблемы, поэтому это явно определенная платформа. Но это не значит, что я должен просто игнорировать проблему.Отладочные намерения

Итак, я пытаюсь устранить проблему. Я регистрирую одно из действий в своем приложении, чтобы получить тот же тип намерения, а затем ударил точку останова, чтобы проанализировать объект Intent, отправляемый с двух разных способов его отправки.

Проблема в том, что намерение, которое я отправляю, и намерение, отправленное из галереи или AndroZip (там, где сообщения отображаются в выборе), похоже, одинаковы. Оба они имеют одинаковое действие, одни и те же категории, одни и те же флаги, один и тот же тип mime. Что еще я могу проверить в Intent из Gallery или AndroZip, чтобы узнать, есть ли какая-то дополнительная информация, которую я могу добавить к своему намерению, чтобы получить приложение обмена сообщениями по умолчанию, чтобы оно отображалось в выборщике в тех случаях, когда это не так?

+3

Я рекомендую москитную сетку при отладке палаток. –

ответ

8

Проблема специфична для телефонов HTC Sense, и это возникает потому, что их Галерея и сообщения приложения отличаются от фондовых единиц.

В частности, намерение, отправленное из галереи в сообщение, имеет действие android.intent.action.SEND_MSG, которое отличается от android.intent.action.SEND. Приложение Sense messaging не обрабатывает SEND, в отличие от приложения для обмена запасами.

Итак, вопрос в том, как приложение Sense Gallery создает диалог выбора действий, который объединяет SEND и SEND_MSG?

Я провел некоторое исследование и получил там все ... код ниже работает, но запись «Сообщения» в диалоговом окне отображается вверху, а не в алфавитном порядке, как в Галерее. Несомненным еще некоторое исследование намерений бы исправить это, но по крайней мере это работает:

// Create a chooser for things that can ACTION_SEND images 
    Intent intent = new Intent(Intent.ACTION_SEND); 
    Uri data = Uri.parse("content://media/external/images/media/98"); 
    intent.putExtra(Intent.EXTRA_STREAM, data); 
    intent.setType("image/jpeg"); 
    Intent chooser = Intent.createChooser(intent, "Blah"); 

    // Add the stupid HTC-Sense-specific secondary intent 
    Intent htcIntent = new Intent("android.intent.action.SEND_MSG"); 
    htcIntent.putExtra(Intent.EXTRA_STREAM, data); 
    htcIntent.setType("image/jpeg"); 
    chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent }); 

    // Show the chooser 
    startActivity(chooser); 
+0

Блестящий! +1. Я должен был изменить ваш код, чтобы заставить его работать. См. Мой ответ ниже. – user432209

+0

Я не знаю, как я пропустил вторую строку putExtra() ... это в моем исходном коде.Восстановил его сейчас, ура. –

0

Вместо того, чтобы отлаживать намерения, почему бы не попытаться сравнить, как вы начинаете выбор с тем, как галерея делает это. Это открытый источник, поэтому вместо того, чтобы пытаться угадать проблему с результатом, вы можете отлаживать причину.

https://android.googlesource.com/platform/packages/apps/Gallery3D

+0

Это приложение для галереи. Проблема, похоже, появляется только на телефонах Sense, у которых есть разные приложения для галереи и обмена сообщениями. Я воспроизвел его на Desire HD. –

1

Прежде всего, +1 Рубену, он гений, а не я. Но мне пришлось немного изменить его код, чтобы заставить его работать. В основном мне пришлось наложить элемент() на htcIntent или изображение никогда не застревало в намерении.

Протестировано и проверено на Droid X и HTC Incredible (с той же проблемой до сих пор благодаря Реубену).

Uri uri = Uri.fromFile(new File(mFile)); 
Intent intent = new Intent(Intent.ACTION_SEND); 
intent.putExtra(Intent.EXTRA_STREAM, uri); 
intent.setType("image/png"); 

Intent htcIntent = new Intent("android.intent.action.SEND_MSG"); 
htcIntent.setType("image/png"); 
htcIntent.putExtra(Intent.EXTRA_STREAM, uri); 

Intent chooser = Intent.createChooser(intent, "Send Method"); 
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { htcIntent }); 
startActivity(chooser); 

Edit: Я понимаю, что я помещаю изображение на двух намерениях, но я не мог заставить его работать иначе.

+0

Добавление данных для обоих намерений - это действительно то, что нужно сделать. Все еще озадачивающе, как критическая линия была вырезана из копии-пасты в моем примере. –