2016-12-27 2 views
0

У меня есть alertDialogBuilder, который создает намерение отправить электронное письмо.«java.lang.SecurityException: Permission Denial: start Intent», отправив электронное письмо на Android

Он работал хорошо, но так как на прошлой неделе он перестал работать и дает следующее сообщение об ошибке:

java.lang.SecurityException: Permission Denial: starting Intent

Я использую один и тот же прибор все время с Android 4.4.2 и версия на моем Gradle я нахожусь поддерживает следующие версии:

minSdkVersion 16 
targetSdkVersion 23 

Мой код:

alertDialogBuilder 
    .setMessage("Do you want to send an email to " + getString(R.string.companyName) + "?") 
    .setCancelable(false) 
    .setPositiveButton("Send",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int id) { 

       Intent gmail = new Intent(Intent.ACTION_SEND); 
       gmail.setClassName("com.google.android.gm","com.google.android.gm.ComposeActivityGmail"); 
       gmail.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); 
       gmail.setData(Uri.parse("[email protected]")); 
       gmail.setType("plain/text"); 
       startActivity(gmail); 
      } 
    }) 
    .setNegativeButton("Cancel",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
      } 
    }); 

Я KNO ж, что есть два вопроса, непосредственно связанных с этим вопросом:

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

Что мне не хватает? Я могу вставить полный стек, если это необходимо, я поместил только имя ошибки, чтобы уменьшить размер вопроса.

EDIT: Моя ошибка StackTrace заключается в следующем:

12-27 17:38:15.507 7816-7816/com.project.user.product E/AndroidRuntime: FATAL EXCEPTION: main 
     Process: com.project.user.product, PID: 7816 
     java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.SEND typ=plain/text cmp=com.google.android.gm/.ComposeActivityGmail (has extras) } from ProcessRecord{428b7c68 7816:com.project.user.product/u0a107} (pid=7816, uid=10107) not exported from uid 10048 
      at android.os.Parcel.readException(Parcel.java:1472) 
      at android.os.Parcel.readException(Parcel.java:1426) 
      at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2222) 
      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1425) 
      at android.app.Activity.startActivityForResult(Activity.java:3480) 
      at android.app.Activity.startActivityForResult(Activity.java:3432) 
      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:842) 
      at android.app.Activity.startActivity(Activity.java:3683) 
      at android.app.Activity.startActivity(Activity.java:3651) 
      at com.project.user.product.LoginActivity$7$2.onClick(LoginActivity.java:284) 
      at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157) 
      at android.os.Handler.dispatchMessage(Handler.java:110) 
      at android.os.Looper.loop(Looper.java:193) 
      at android.app.ActivityThread.main(ActivityThread.java:5333) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
      at dalvik.system.NativeStart.main(Native Method) 

Заранее спасибо!

+1

«Я могу вставить полную стеклу, если потребуется» - это, вероятно, хорошая идея. Лучшая идея - избавиться от 'gmail.setClassName (« com.google.android.gm »,« com.google.android.gm.ComposeActivityGmail »);', поскольку AFAIK это действие больше не экспортируется (что приведет к вашему сообщению об ошибке), и в первую очередь это была враждебная пользователю идея. – CommonsWare

+0

@CommonsWare Спасибо за ответ, но я не совсем понимаю, что вы имеете в виду со второй частью вашего комментария. И вместо этой функции, что я должен использовать? Или просто избавиться от него? –

+0

«Я не совсем понимаю, что вы имеете в виду со второй частью вашего комментария» - не все используют Gmail. Ваш код предполагает, что все это делают. Для пользователей, не относящихся к Gmail, ваше приложение может потерпеть крах (Gmail не существует) или маршрутизировать пользователей в Gmail, которые они не хотят. «Или просто избавиться от него?» -- верный. – CommonsWare

ответ

1
gmail.setClassName("com.google.android.gm","com.google.andro‌​id.gm.ComposeActivit‌​yGmail"); 

Это утверждение говорит, что ваше приложение требует что пользователь использовать Gmail, и более конкретно, что пользователь использовать некоторые более старую версию Gmail. Таким образом, ваш код не поддерживает:

  • пользователей устройств, на которых Gmail просто не установлен (что может или не может быть возможность, в зависимости от ваших каналов распространения приложений)

  • Пользователи устройств, на которых они не имеют доступа к Gmail (например, пользователи вторичных устройств)

  • пользователи устройств, где у них есть Gmail отключены, потому что они используют какой-либо другой учетной записи электронной почты (например, меня)

  • Пользователи устройств, на которых у них есть Gmail, но обычно не используют его или предпочитают не использовать его для этой конкретной ситуации

  • Пользователи устройств с текущей версией Gmail, так как com.google.andro‌​id.gm.ComposeActivit‌​yGmail больше не доступны для прямых запуск сторонних приложений, таких как ваши

Последнее, что приводит к вашему исключению.

Итак, удалите это заявление. Также:

  • plain/text не является допустимым MIME-типом. Используйте text/plain. Или, еще лучше, полностью избавиться от gmail.setType("plain/text");, так как вы не используете EXTRA_TEXT или EXTRA_STREAM, и это то, к чему привязан тип MIME ACTION_SENDIntent.

  • Удалить gmail.setData(Uri.parse("[email protected]"));, так как ACTION_SEND не использует фасет данных Intent.

+0

Большое спасибо! Хорошее объяснение. Тем не менее, это не дает мне никакой проблемы, используя 'plain/text'. Это просто совпадение? –

+0

@ Error404: Приложения, которые отвечают на ваш «Intent», вероятно, имеют фильтр типа MIME типа '*/*'. Любой, у которого были «text/plain» или «text/*», не отображался в качестве опции для вас. – CommonsWare

+0

Я попытался удалить строку 'gmail.setType (" plain/text ")', и он дает мне следующую ошибку: 'android.content.ActivityNotFoundException: для Activity Intent' не найдено никаких действий. Если я использую 'text/plain', вместо этого я получаю больше приложений для выбора, чем когда я использовал' plain/text'. –

Смежные вопросы