Запустите почтовый клиент Android в Unity, указав получателя, тему и текст сообщения в качестве дополнения к намерению ... получая NoSuchFieldError - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь запустить почтовый клиент Android (ну, технически, независимо от того, что пользователь решит выбрать по запросу, но на самом деле ... почтовый клиент) из Unity Player, чтобы позволить пользователю отправлять электронную почту получателю,Тема и тело предварительно заполнены (они могут отредактировать его, если захотят, но ожидается, что они просто запустят его как есть).

Я получил следующий код для работы ...но ТОЛЬКО когда закомментирована строка, которая устанавливает параметр EXTRA_EMAIL.В противном случае он выдает NoSuchFieldError

        AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
        AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");

        string[] recipient = { "bugreport@mydomain.net" };
        string subject = "bug report";
        string body = errorDump();

        intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SENDTO"));
        intentObject.Call<AndroidJavaObject>("setType", "text/plain");

        // intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string[]>("EXTRA_EMAIL"), recipient);
        intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), subject);
        intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), body);

        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("startActivity", intentObject);

Насколько я могу судить, я все сделал правильно ...

  • GetStatic указывает <string[]>?Проверьте.
  • Имя поля EXTRA_EMAIL?Проверьте.
  • "получатель" равен a string[] (только с одним элементом)?Проверьте.

Что я делаю не так?Согласно официальным документам Google на https://developer.android.com/guide/components/intents-common#Email, EXTRA_EMAIL равен допустимым типом поля для ACTION_SENDTO.


Обновление: принятый правильный ответ, но исправление этой проблемы выявило новую проблему, которую я смог решить самостоятельно.

По сути, я неправильно прочитал первоначально закомментированную строку. получатель является (по праву) строкой [], но <string> в GetStatic<String> сообщает компилятору, что литерал «ACTION_SENDTO» является строкой, а не получатель являетсястрока).

История на этом не закончилась.Из моего прочтения документации Google у меня сложилось впечатление, что ACTION_SENDTO предназначен для простой текстовой электронной почты, а ACTION_SEND предназначен для электронной почты с одним вложением.

На самом деле, похоже, что ни GMail, ни какая-либо другая почтаклиент на моем телефоне регистрируется как обработчик намерений для ACTION_SENDTO ... только ACTION_SEND.Когда я попытался запустить действие для ACTION_SENDTO, я получил сообщение «Не найдено действий для обработки намерения».Изменение на ACTION_SEND устранило проблему.

Очевидно, ACTION_SEND позволяет вам указать вложение, но не требует это ... и многие / большинство /все почтовые клиенты Android больше не удосуживаются объявить себя обработчиками для ACTION_SENDTO.

Правильная версия исходного кода:

        AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
        AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");

        string[] recipient = { "bugreport@mydomain.net" };
        string subject = "bug report";
        string body = errorDump();

        /* fixed, is now ACTION_SEND */
        intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
        intentObject.Call<AndroidJavaObject>("setType", "text/plain");

        /* fixed, now has GetStatic<string>("EXTRA_EMAIL") */
        intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_EMAIL"), recipient);
        intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_SUBJECT"), subject);
        intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), body);

        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("startActivity", intentObject);

1 Ответ

0 голосов
/ 29 ноября 2018

Вы сказали, что здесь происходит ошибка NoSuchFieldError:

intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string[]>("EXTRA_EMAIL"), recipient);

Не удается найти EXTRA_EMAIL, поскольку в Android doc переменная EXTRA_EMAIL объявлена ​​какпростая строка:

public static final String EXTRA_EMAIL

, но вы выполняете поиск в виде строкового массива, когда сделали:

intentClass.GetStatic<string[]>("EXTRA_EMAIL")

Обратите внимание на [], который вы добавили после string.

Это сработало бы, если бы EXTRA_EMAIL был также объявлен как массив, подобный этому:

public static final String[] EXTRA_EMAIL

, но это не так, удалите [] или замените:

intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string[]>("EXTRA_EMAIL"), recipient);

с

intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_EMAIL"), recipient);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...