系统默认的推送能解决大多数需求,自定义推送通知栏,主要是推送图片。不同手机通知栏背景颜色不一样,就要动态改变通知文字的颜色,不然会出现文字显示不出来现象。如华为手机通知栏背景是黑色的,就要把文字设置为白色,OPPO手机通知栏背景是灰色的,就要把文字设置为白色。我已经写了工具类,判断系统通知栏背景颜色,直接拷贝用酒匂。

本博客不啰嗦,直接上代码,喜欢就关注一下,谢谢支持

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="20dp"android:paddingLeft="5dp"><ImageViewandroid:id="@+id/iconImageView"android:layout_width="15dp"android:layout_height="20dp"android:layout_marginLeft="5dp"/><TextViewandroid:id="@+id/appNameTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:text="玉委会会刊"/></LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="5dp"android:paddingRight="5dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_marginRight="60dp"android:paddingLeft="5dp"android:layout_gravity="center_vertical"><TextViewandroid:id="@+id/title_TextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="end"android:text="标题"/><TextViewandroid:id="@+id/content_TextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="end"android:text="我是内容"/></LinearLayout><ImageViewandroid:id="@+id/ImageView"android:gravity="right"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:src="@mipmap/ic_launcher"/></RelativeLayout>
</LinearLayout>

代码

//判断系统通知栏背景颜色boolean darkNotiFicationBar = NotificationsUtils.isDarkNotiFicationBar(this);RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.baidu_message);//设置通知栏背景remoteViews.setTextColor(R.id.appNameTextView, darkNotiFicationBar == true?Color.WHITE:Color.BLACK);remoteViews.setTextColor(R.id.title_TextView,  darkNotiFicationBar == true?Color.WHITE:Color.BLACK);remoteViews.setTextColor(R.id.content_TextView,  darkNotiFicationBar == true?Color.WHITE:Color.BLACK);//设置文字大小remoteViews.setTextViewTextSize(R.id.title_TextView, COMPLEX_UNIT_SP ,16);remoteViews.setTextViewTextSize(R.id.content_TextView, COMPLEX_UNIT_SP ,14);//添加内容remoteViews.setImageViewResource(R.id.iconImageView, R.drawable.icon);remoteViews.setTextViewText(R.id.appNameTextView, "紫禁城" );remoteViews.setTextViewText(R.id.title_TextView, "紫禁城放假了" );remoteViews.setTextViewText(R.id.content_TextView, "紫禁城免费了" );//实例化通知栏构造器。NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);//系统收到通知时,通知栏上面显示的文字。mBuilder.setTicker("通知栏上面显示的文字");mBuilder.setContent(remoteViews);//获得Notification定高mBuilder.setCustomBigContentView(remoteViews);//显示在通知栏上的小图标mBuilder.setSmallIcon(R.drawable.icon);//设置大图标,即通知条上左侧的图片(如果只设置了小图标,则此处会显示小图标)mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon));//添加声音mBuilder.setDefaults(Notification.DEFAULT_VIBRATE);Intent intent = new Intent(this, MainActivity.class);//点击通知,进入应用PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);mBuilder.setContentIntent(pendingIntent);//点击通知栏后的意图mBuilder.setAutoCancel(true);//设置这个标志当用户单击面板就可以让通知将自动取消//设置为不可清除模式
//        mBuilder.setOngoing(true);//显示通知,id必须不重复,否则新的通知会覆盖旧的通知(利用这一特性,可以对通知进行更新)NotificationManager mm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);Notification notification = mBuilder.build();mm.notify(1, notification);Picasso.with(this).load( message )//message 就是图片链接地址.resize(200,200).centerCrop().memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE).into(remoteViews, R.id.ImageView, 1, notification);

判断系统通知栏颜色工具类

/*** 通知栏的帮助类,提供查询手机是否禁止通知栏,判断通知栏背景颜色* Created by dengqu on 2016/12/12.*/
public class NotificationsUtils {private final static String TAG = NotificationsUtils.class.getSimpleName();private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";private static final double COLOR_THRESHOLD = 180.0;private static int titleColor;/*** 判断应用通知栏是否开启权限** @param context* @return*/
//    public static boolean isNotificationEnabled(Context context) {
//        try {
//            if (AndroidConfig.getAndroidVersion() >= Build.VERSION_CODES.KITKAT) {
//                AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
//                ApplicationInfo appInfo = context.getApplicationInfo();
//                String pkg = context.getApplicationContext().getPackageName();
//                int uid = appInfo.uid;
//                Class appOpsClass = null;
//                appOpsClass = Class.forName(AppOpsManager.class.getName());
//                Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, Integer.TYPE, String.class);
//                Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
//                int value = (int) opPostNotificationValue.get(Integer.class);
//                return ((int) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager.MODE_ALLOWED);
//            }
//        } catch (Exception e) {
//           // XLLog.e(TAG, e);
//        }
//        return true;
//    }/*** 判断通知栏背景颜色,现在手机通知栏大部分不是白色就是黑色背景** @param context* @return*/public static boolean isDarkNotiFicationBar(Context context) {return !isColorSimilar(Color.BLACK, getNotificationColor(context));}private static int getNotificationColor(Context context) {if (context instanceof AppCompatActivity) {return getNotificationColorCompat(context);} else {return getNotificationColorInternal(context);}}private static boolean isColorSimilar(int baseColor, int color) {int simpleBaseColor = baseColor | 0xff000000;int simpleColor = color | 0xff000000;int baseRed = Color.red(simpleBaseColor) - Color.red(simpleColor);int baseGreen = Color.green(simpleBaseColor) - Color.green(simpleColor);int baseBlue = Color.blue(simpleBaseColor) - Color.blue(simpleColor);double value = Math.sqrt(baseRed * baseRed + baseGreen * baseGreen + baseBlue * baseBlue);if (value < COLOR_THRESHOLD) {return true;}return false;}private static int getNotificationColorInternal(Context context) {final String DUMMY_TITLE = "DUMMY_TITLE";NotificationCompat.Builder builder = new NotificationCompat.Builder(context);builder.setContentText(DUMMY_TITLE);Notification notification = builder.build();RemoteViews contentView = notification.contentView;if ( contentView == null ) {return 0;}ViewGroup notificationRoot = (ViewGroup) contentView.apply(context, new FrameLayout(context));final TextView titleView = (TextView) notificationRoot.findViewById(android.R.id.title);if (titleView == null) {iteratoryView(notificationRoot, new Filter() {@Overridepublic void filter(View view) {if (view instanceof TextView) {TextView textView = (TextView) view;if (DUMMY_TITLE.equals(textView.getText().toString())) {titleColor = textView.getCurrentTextColor();}}}});return titleColor;} else {return titleView.getCurrentTextColor();}}private static int getNotificationColorCompat(Context context) {NotificationCompat.Builder builder = new NotificationCompat.Builder(context);Notification notification = builder.build();RemoteViews contentView = notification.contentView;if ( contentView == null ) {return 0;}int layoutId = contentView.getLayoutId();ViewGroup notificationRoot = (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null);final TextView titleView = (TextView) notificationRoot.findViewById(android.R.id.title);if (titleView == null) {final List<TextView> textViews = new ArrayList<>();iteratoryView(notificationRoot, new Filter() {@Overridepublic void filter(View view) {textViews.add((TextView) view);}});float minTextSize = Integer.MIN_VALUE;int index = 0;for (int i = 0, j = textViews.size(); i < j; i++) {float currentSize = textViews.get(i).getTextSize();if (currentSize > minTextSize) {minTextSize = currentSize;index = i;}}return textViews.get(index).getCurrentTextColor();} else {return titleView.getCurrentTextColor();}}private static void iteratoryView(View view, Filter filter) {if (view == null || filter == null) {return;}filter.filter(view);if (view instanceof ViewGroup) {ViewGroup container = (ViewGroup) view;for (int i = 0, j = container.getChildCount(); i < j; i++) {View child = container.getChildAt(i);iteratoryView(child, filter);}}}private interface Filter {void filter(View view);}
}

android自定义通知栏_推送图片相关推荐

  1. SpringCloud工作笔记067---消息推送_推送视频_推送图片_在通知栏里显示图片视频_自定义点击消息后的动作

    JAVA技术交流QQ群:170933152 http://docs.getui.com/getui/server/java/template/ 个推 ,这里有文档,看看就能搞,另外: 在hbuilde ...

  2. Android之集成极光推送消息

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式: 通知 自定义消息 富媒体 本地通知 1.通知 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通 ...

  3. android开发之消息推送

    本人想把Android所要运用到的所有的东西都好好的梳理一遍,那今个儿就和大伙说说消息推送:想必大家都玩过小米手机,细心的人会发现,小米手机时不时的就会发一些通知告诉你要系统升级了.某某App有新版本 ...

  4. java后台与android端集成信鸽推送和华为推送通道

    时间比较紧,并未调试. 需求:后端可以针对指定账号或者列表进行通知栏信息推送,优先使用华为通道.点击通知栏消息打开指定activity 后端版本V3,android sdk 3.2.7 一.后端部分代 ...

  5. Android 阿里云移动推送厂商辅助通道集成详解

    厂商通道配置 1.添加额外依赖项 implementation 'com.aliyun.ams:alicloud-android-push:3.1.9.1'implementation 'com.al ...

  6. iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐

    代码地址如下: http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APN ...

  7. android极光推送判断消息,通过极光推送给Android所有用户发送推送消息

    https://www.cnblogs.com/yueguanguanyun/p/8485381.html 所需jar包,在maven中添加下列依赖: cn.jpush.api jpush-clien ...

  8. android 8.0 nexus7,Android 7.0即将推送 Nexus用户最迟8月22日更新

    原标题:Android 7.0即将推送 Nexus用户最迟8月22日更新 [丫丫网]Android N终于来了.今年5月,谷歌正式发布最新的Android N系统.7月1日,谷歌都会在位于加州山景城的 ...

  9. 一加升级android p,一加6氢OS获得更新:Android P正式版推送

    原标题:一加6氢OS获得更新:Android P正式版推送 [Pconline 资讯]经过多个Beta版的测试,一加在10月11日向一加6推送了氢OS的Android P正式版更新,该版本也是氢OS的 ...

  10. android应用接入第三方推送实践

    本文由来和目的 由来:昨天技术群里有人问到推送,作为一个亲自踩过坑的的人,回答了一些问题,有人就说,你应该写一篇博客啊.其实在做完公司的项目集成之后,是想写的,但是因为懒就一直没写,但昨天经人这么一说 ...

最新文章

  1. AbstractFactory抽象工厂模式
  2. 西南民大oj(矩阵快速幂)
  3. [问答题] 考SQL语句的题,题太长了,实在不好回忆了。
  4. mybatis-查询过程
  5. c与指针 从一个字符串中提取子串_python实现找出来一个字符串中最长不重复子串...
  6. 黑马程序员_Java学习日记num4
  7. python框架优化方法_Python 遗传算法框架 GAFT 优化小记
  8. iOS应用支持IPV6及阿里云相关配置
  9. oracle call 存储过程 带out_详解oracle数据库存储过程调试方法
  10. 纯MSDOS操作系统下的计算机重启与关机
  11. win10taskkill强行结束进程_win10强制关闭进程快捷键
  12. 六级考研单词之路-十六
  13. 软件测试之与大厂测试经理的问答
  14. 闲置交易,二手交易,二手商城,同城交易,社交商城类APP源码
  15. 雷军:人因梦想而伟大 金山骨子里重视技术尊重程序员
  16. java录制声音(采集声卡音频数据)
  17. `泷泽萝拉.png .exe`
  18. 查看安装的tensorflow是哪个版本,查看Tensorflow是GPU还是CPU
  19. 通过API执行AutoCAD命令来
  20. 高级人像调色效果Lr预设

热门文章

  1. Python进阶(九) -- 操作excel文件
  2. linux下如何模拟按键输入和模拟鼠标
  3. 文件共享服务器(CIFS协议)
  4. 'javac'不是内部或外部命令,也不是可运行的程序或批处理文件.
  5. 1.8.9适用的java,Java 7、8、9+版本的一些新特性
  6. Pysot训练自己数据集前的预处理
  7. Console口和Telnet远程登陆
  8. elastix2.5vtigercrm5.2.1来电弹屏和点击呼叫的配置
  9. html调用暴风影音,暴风影音4大使用设置技巧
  10. GRE Over IPSec技术