Android: ActivityNotFoundException иногда возникает при попытке отправить MMS на определенных устройствах

#android #mms

#Android #mms

Вопрос:

Я использую замечательную библиотеку ACRA, чтобы сообщать о любых ошибках, с которыми пользователи сталкиваются в бета-версии моего приложения. Пока что это показало, что у некоторых пользователей возникают проблемы с отправкой MMS-сообщений, а у большинства — нет. В частности, я обнаружил, что пользователь, использующий устройство Droid Bionic, столкнулся с этой ошибкой, но когда я запускаю эмулятор Droid Bionic локально, у меня нет проблем. Код, который я использую для запуска действия MMS, является…

 File imageFile = new File(getContext().getFilesDir()   File.separator   fileName);
Uri uri = Uri.fromFile(imageFile);
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
sendIntent.putExtra("sms_body", ""); 
sendIntent.putExtra(Intent.EXTRA_STREAM, uri);
sendIntent.setType("image/png");
getContext().startActivity(sendIntent);
  

Ошибка, которую я вижу — только очень редко — это :

android.content.ActivityNotFoundException: не удается найти явный класс activity {com.android.mms/com.android.mms.ui.ComposeMessageActivity}; вы объявили это действие в своем AndroidManifest.xml ?

Я подозреваю, что, возможно, некоторые операторы модифицировали Android и переопределили / отключили действие MMS по умолчанию. На самом деле у меня нет хорошего способа протестировать это, поскольку все физические устройства и носители, на которых я лично тестировал, не имеют проблем с этим кодом. И, как я уже упоминал, эмулятор Droid Bionic работает нормально, но это было одно из устройств в этой области, у которого возникла проблема.

Мне интересно, испытал ли кто-нибудь нечто подобное и предложил обходной путь? Или если у кого-то есть способ отправки MMS на Android, который работает на всех устройствах / носителях.

(На данный момент я просто перехватываю исключение и сообщаю пользователю, что я не смог отправить MMS с их устройства.)

ps. Я видел на другом форуме, как кто-то предлагал просто удалить classname для намерения. Проблема в том, что когда вы делаете это, все разные типы приложений говорят, что они могут обрабатывать намерение (например, Evernote), когда на самом деле я просто хочу MMS или ничего.

Комментарии:

1. Действительно, производители не могут изменять приложение MMS или вообще не устанавливать его. Вместо запуска определенного действия (com.android.mms … и т. Д.) Попробуйте запустить intents без него. Если установлено другое приложение для отправки SMS, оно будет указано в диалоговом окне выбора.

2. Спасибо, я попытался запустить intent без определенного класса, но я обнаружил, что приложения слишком «жадные» в отношении того, какие намерения они могут обрабатывать. Многие приложения заявили, что могут обрабатывать MMS (приложения, которые не имеют ничего общего с MMS). В частности, Evernote, похоже, хочет обрабатывать все. Возможно, кто-то знает определенный mime-тип xmlns, который действительно гарантирует, что только подлинные приложения MMS отвечают на намерение?

3. Да, вы правы. В этом случае, я думаю, единственное, что вы можете сделать, это… (проверьте мой ответ).

4. Привет, эванеус, я столкнулся с той же проблемой, с которой столкнулись вы, и я попробовал способ, предложенный Кристианом. Но моя проблема в том, что, когда я разрешаю пользователю выбирать приложение, из которого он может отправлять MMS, в списке нет приложения для обмена сообщениями. Пожалуйста, помогите.

5. А также как я могу проверить, установлено ли у клиента определенное приложение для обмена сообщениями или нет.

Ответ №1:

записывайте с НАМЕРЕНИЕМ

 intent.setPackage("com.android.mms");
  

вместо

 intent.setClassName("com.android.mms", "com.android.mms.ui.ComposeMessageActivity");
  

Ответ №2:

Вы можете сделать…

  1. Продолжайте пробовать этот подход, но поймайте ActivityNotFoundException.
  2. Если вы получаете ActivityNotFoundException, попробуйте запустить другие приложения, которые могли быть установлены пользователем (VZMessages, Zlango Messaging, Handcent, chompSMS и т. Д.).
  3. Если все они терпят неудачу, сообщите своему пользователю, что вы хотите отправить MMS, а затем запустите intent без указания класса. Таким образом, пользователи сами выбирают приложение, которое фактически отправляет MMS-сообщения.