Уведомление о тостах не отображается на некоторых телефонах - PullRequest
0 голосов
/ 10 октября 2018

Я занимаюсь разработкой приложения, которое включает отображение уведомления о тостах для различной информации.При тестировании на этом телефоне: Nokia 6.1 (Android 8) , я понял, что тосты не отображаются.

Я использую тост-уведомления обычным способом, как указано в официальном руководстве Android-разработчика.

Я дважды проверил, что у моего приложения есть разрешение на уведомление.

Затем, чтобы проверить наличие каких-либо отклонений в работе телефона, я решил посмотреть, как в этом мобильном телефоне реализовано уведомление для «Сообщение отправлено» в Gmail.Обычно это выглядит как тосты, но на этом телефоне это выглядело как закусочная.

Полагаю, это пользовательская реализация Android.Предполагая, что это пользовательская реализация, как приспособиться к таким отклонениям в моем приложении?Стоит ли переходить на закусочную или есть какие-то другие альтернативы для решения этой проблемы?

Лично мне нравится, когда тост отображает информацию, и переключение на снэк-бар приведет к значительным потенциальным изменениям в приложении.Что я могу сделать, чтобы минимизировать влияние при поддержке большинства телефонов Android?

Я использую следующий метод для отображения тоста:

public static void showLongToast(Context context, String message) {
        Toast t = Toast.makeText(context, message, Toast.LENGTH_LONG);
        t.show();
}

Я отладил t.show ()и указатель вошел в этот код в Toast.java.

 public void show() {
        if (mNextView == null) {
            throw new RuntimeException("setView must have been called");
        }

        INotificationManager service = getService();
        String pkg = mContext.getOpPackageName();
        TN tn = mTN;
        tn.mNextView = mNextView;

        try {
            service.enqueueToast(pkg, tn, mDuration);
        } catch (RemoteException e) {
            // Empty
        }
    }

Указатель вошел в throw new RuntimeException("setView must have been called");.Кроме того, блок try не был выполнен.

1 Ответ

0 голосов
/ 10 октября 2018

Я думаю, что может быть проблема в том, как Nokia реализовала Toasts.

В AOSP это то, что делает makeText() (публичный метод просто вызывает этот метод с нулевым Looper):

public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
        @NonNull CharSequence text, @Duration int duration) {
    Toast result = new Toast(context, looper);

    LayoutInflater inflate = (LayoutInflater)
            context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
    TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
    tv.setText(text);

    result.mNextView = v;
    result.mDuration = duration;

    return result;
}

Обратите внимание, как он устанавливает mNextView для внутреннего просмотра.

Моя теория заключается в том, что Nokia каким-то образом сломала этот метод (возможно, они удалили этот макет, или, возможно, они вообще не установили вид),Я загружаю стандартное ПЗУ Nokia 6.1, чтобы узнать, смогу ли я узнать, и обновлю ли это, если что-нибудь найду.

А пока вот возможный обходной путь:

public static void showLongToast(Context context, String message) {
    Toast t = Toast.makeText(context, message, Toast.LENGTH_LONG);
    if (t.getView() == null) {
        int layoutRes = context.getResources().getIdentifier("transient_notification", "layout", "android");
        int tvRes = context.getResources().getIdentifier("message", "id", "android");
        View layout = LayoutInflater.from(context).inflate(layoutRes, null);
        TextView textView = layout.findViewById(tvRes);

        textView.setText(message);
        t.setView(layout);
    }
    t.show();
}
...