其他手機正常顯示 Toast,魅族 MX4 (Flyme 5.6.8.16beta, Android 5.1) 不顯示,無報錯日誌。
Flyme 系統**默認禁止應用彈出 Toast**,需用戶手動在「安全中心 → 權限管理 → 通知/彈窗權限」中為該應用開啟「顯示彈窗/Toast」權限。這是廠商定製 ROM 的安全/體驗策略,非系統 Bug。
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS))。Snackbar (Material Design) 依賴 CoordinatorLayout,不受 Toast 權限限制。Dialog 或 WindowManager.addView(TYPE_APPLICATION_OVERLAY) (需 SYSTEM_ALERT_WINDOW 權限) 可強制彈出,但體驗需謹慎。
public static boolean isToastAllowed(Context context) {
try {
AppOpsManager ops = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
Method method = AppOpsManager.class.getDeclaredMethod("checkOpNoThrow", int.class, int.class, String.class);
int res = (int) method.invoke(ops, AppOpsManager.OP_TOAST, Binder.getCallingUid(), context.getPackageName());
return res == AppOpsManager.MODE_ALLOWED;
} catch (Exception e) { return true; } // 非定製ROM默認允許
}
// 使用
if (!isToastAllowed(this)) {
new AlertDialog.Builder(this)
.setMessage("請在設置中允許本應用顯示彈窗/Toast")
.setPositiveButton("去設置", (d, w) -> startActivity(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + getPackageName()))))
.show();
}
參考資源:Flyme Toast 權限適配詳解
總結:**Toast 不顯示非代碼 Bug,是廠商權限管控**,採用「檢測→引導→降級替代」三步走策略可全面兼容。