华为、三星等机型禁用通知权限后Toast不弹出
原因
查看Toast源码后发现,Toast显示要通过INotificationManager类来实现,而当通知禁用后,调用此类会返回异常,所以导致通知不显示,源码如下:
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) {
// 权限禁用后走这里,这里是空方法,所以会发生既不crash又无响应的情况
}
}
这是一个google的bug,部分小米手机重写了Toast代码,所以可以正常执行,我们可以通过反射的方式来暴力绕过,也就有了如下解决方式: