【问题标题】:Toast Notification not being displayed in certain phones某些手机​​中未显示 Toast 通知
【发布时间】:2018-10-10 16:34:08
【问题描述】:

我正在开发一个应用程序,其中包括显示各种信息的 toast 通知。在这款手机上进行测试时:Nokia 6.1 (Android 8),我意识到没有显示任何 toast。

我按照 Android 官方开发者指南中所述的正常方式使用 Toast 通知。

我仔细检查了我的应用是否具有通知权限。

然后为了测试手机端是否有异常,我决定看看Gmail中“已发送消息”的通知是如何在这台手机上实现的。通常,它显示为吐司,但在这款手机上,它显示为小吃店。

我猜这是 Android 的自定义实现。假设它是自定义实现,如何在我的应用程序中适应任何此类异常?我应该切换到小吃店还是有其他替代方法可以解决这个问题?

我个人喜欢 toast 来显示信息,切换到快餐栏会导致应用程序发生很多潜在的变化。在支持大多数 Android 手机的同时,我能做些什么来最大程度地减少影响?

我使用下面的方法来显示toast:

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 块没有被执行。

【问题讨论】:

  • 诺基亚是否允许来自您应用的通知?阻止通知也会阻止 Toast。
  • @TheWanderer 我仔细检查了我的应用程序是否具有通知权限。是的,诺基亚允许来自我的应用程序的通知。
  • 在详细模式下检查 logcat 并过滤您的包名称。 Toast 没有显示可能是有原因的。
  • @TheWanderer logcat 中没有信息。我尝试调试有问题的行,发现 Android 在内部抛出异常,内容如下: setView 必须被调用。可能仅在此电话中调用了此异常。
  • 您可以将完整的警告编辑到您的问题中吗?

标签: android android-toast


【解决方案1】:

我认为诺基亚实施 Toasts 的方式可能存在问题。

在 AOSP 中,这就是 makeText() 所做的(公共方法只是用 null 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 设置为内部视图。

我的理论是诺基亚以某种方式破坏了这种方法(也许他们删除了该布局,或者他们根本没有设置视图)。我正在下载一个诺基亚 6.1 库存 ROM,看看我是否能找到,如果我找到任何东西,我会更新它。

同时,这里有一个潜在的解决方法:

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2016-09-27
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多