不需要在清单文件中声明任何权限的Toast
来源:互联网 发布:vim设置python语法高亮 编辑:程序博客网 时间:2024/05/02 02:30
前言
由于项目需要,需要再用户禁止通知权限之后仍然能弹出Toast.网上现成的尝试了三种方法测试之后发现都不太符合公司的需求而没有使用,其中机型适配(点名小米MIUI8)占了很大部分原因.而且要求是不能加任何权限!!!
下面看效果图:
(源码在文章结尾)
- 使用方法很简单,没有做二次封装.上代码
public void showToast(View view){ if(CustomToast.isNotificationEnabled(this)){ //通知可用使用原生Toast Toast.makeText(getApplicationContext(), "系统Toast", Toast.LENGTH_SHORT).show(); }else{ CustomToast.makeText(getApplicationContext(),"自定义Toast", CustomToast.LENGTH_SHORT).show(); } }
首先判断用户是否禁止了通知(有的时候其实用户只是想屏蔽推送通知),如果未禁止直接使用系统原生的Toast,否则用我们自定义的
判断是否有权限的代码就不贴了,跟本文关系不大.需要注意的是,API19以上才可以判断权限,所以可以加一个判断
public static boolean isNotificationEnabled(Context context) { //API 19以下的直接使用自定义的Toast if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT) { //这里19以下的我直接使用了CustomToast return false; } AppOpsManager mAppOps = null; mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); //此处省略N行代码 ************;}
public static CustomToast makeText(Context context, CharSequence text, int duration) { Toast toast = Toast.makeText(context, text, duration); CustomToast exToast = new CustomToast(context); exToast.toast = toast; exToast.setDuration(duration); exToast.setText(text); //添加到集合中,自己维护队列 equeue.add(exToast); return exToast; }
makeText就返回了一个实例对象,并把这个对象加到了equeue集合中.为了仿照系统弹Toast的时候一个显示完毕再弹出第二个.下面看show方法了.
public void show() { //正在展示 或者 要展示的view为null if (isShow || mView == null) { return; } isShow = true; toast.setView(mView); //这里通过反射拿到toast的TN对象 initTN(); try { //展示toast show.invoke(mTN); } catch (Exception e) { e.printStackTrace(); } //Toast到时间隐藏 handler.postDelayed(hideRunnable, mDuration == LENGTH_SHORT ? LENGTH_SHORT : LENGTH_LONG); }
hideRunnable只是调了一个hide方法
private void hide() { if (!isShow) return; try { hide.invoke(mTN); } catch (Exception e) { e.printStackTrace(); } isShow = false; equeue.remove(0); //队列中还有消息则继续show if (equeue.size() > 0) { equeue.get(0).show(); } }
该方法出自 突破小米悬浮窗权限控制–不需要权限的悬浮窗
private void initTN() { try { Field tnField = toast.getClass().getDeclaredField("mTN"); tnField.setAccessible(true); mTN = tnField.get(toast); show = mTN.getClass().getMethod("show"); hide = mTN.getClass().getMethod("hide"); Field tnParamsField = mTN.getClass().getDeclaredField("mParams"); tnParamsField.setAccessible(true); WindowManager.LayoutParams params = (WindowManager.LayoutParams) tnParamsField.get(mTN); params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; /**调用tn.show()之前一定要先设置mNextView*/ Field tnNextViewField = mTN.getClass().getDeclaredField("mNextView"); tnNextViewField.setAccessible(true); tnNextViewField.set(mTN, toast.getView()); } catch (Exception e) { e.printStackTrace(); } //这里设置toast的位置 toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 200); }
简单的介绍到这里了.欢迎交流,
参考文章:http://www.codexiu.cn/android/blog/25708/
源码地址:https://github.com/jackyZuo/CustomToastDemo
0 0
- 不需要在清单文件中声明任何权限的Toast
- 不需要在清单文件中注册的Acrivity的启动方式--Hook技术
- 不需要任何权限获得Android设备的唯一ID
- 不需要任何权限获得Android设备的唯一ID
- Android清单文件详解(二) ---- 应用程序权限声明
- Android清单文件详解(二) ---- 应用程序权限声明
- Toast之悬浮窗(不需要权限)
- 不需要任何权限获得Android设备的唯一ID,权限android设备id
- 不需要任何权限获得Android设备的唯一ID,权限android设备id
- 在清单列表需要加入的权限
- 权限声明在android中是非常重要的…
- 权限声明在android中是非常重要的…
- Android Service---在清单中声明一个服务
- Android Service---在清单中声明一个服务
- TXT文件合并,不需要任何软件
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- 给文件只有everyone的所有权限,没任何权限
- Android中AndroidManifest清单文件以及权限详解!
- js限制输入框输入为数字,replace()方法
- 在java项目中的mongodb的_id被fastjson转为json时竟然丢失了
- WebGL Lighting
- 算法训练 Car的旅行路线 蓝桥杯
- 一个静态初始化器的应用--避免创造不必要的对象
- 不需要在清单文件中声明任何权限的Toast
- Delphi操作excel说明
- 蓝桥杯 ALGO-13 算法训练 拦截导弹 Java版
- Service
- Lcx的多种用法:3个功能+9个参数,你会怎么玩?
- 怎么认识json对象和json字符串,以及相互转换
- 任务调度系统-任务依赖的设计
- AI学习之路(6): NumPy的使用
- MongoDB3.2---Profiling慢查询详解