android自定义通知栏_推送图片
系统默认的推送能解决大多数需求,自定义推送通知栏,主要是推送图片。不同手机通知栏背景颜色不一样,就要动态改变通知文字的颜色,不然会出现文字显示不出来现象。如华为手机通知栏背景是黑色的,就要把文字设置为白色,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自定义通知栏_推送图片相关推荐
- SpringCloud工作笔记067---消息推送_推送视频_推送图片_在通知栏里显示图片视频_自定义点击消息后的动作
JAVA技术交流QQ群:170933152 http://docs.getui.com/getui/server/java/template/ 个推 ,这里有文档,看看就能搞,另外: 在hbuilde ...
- Android之集成极光推送消息
极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式: 通知 自定义消息 富媒体 本地通知 1.通知 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通 ...
- android开发之消息推送
本人想把Android所要运用到的所有的东西都好好的梳理一遍,那今个儿就和大伙说说消息推送:想必大家都玩过小米手机,细心的人会发现,小米手机时不时的就会发一些通知告诉你要系统升级了.某某App有新版本 ...
- java后台与android端集成信鸽推送和华为推送通道
时间比较紧,并未调试. 需求:后端可以针对指定账号或者列表进行通知栏信息推送,优先使用华为通道.点击通知栏消息打开指定activity 后端版本V3,android sdk 3.2.7 一.后端部分代 ...
- Android 阿里云移动推送厂商辅助通道集成详解
厂商通道配置 1.添加额外依赖项 implementation 'com.aliyun.ams:alicloud-android-push:3.1.9.1'implementation 'com.al ...
- iOS原生推送(APNS)进阶iOS10推送图片、视频、音乐
代码地址如下: http://www.demodashi.com/demo/13208.html 前言 我们首先要在AppDelegate里面进行iOS的适配,可以参考这篇文章 iOS原生推送(APN ...
- android极光推送判断消息,通过极光推送给Android所有用户发送推送消息
https://www.cnblogs.com/yueguanguanyun/p/8485381.html 所需jar包,在maven中添加下列依赖: cn.jpush.api jpush-clien ...
- android 8.0 nexus7,Android 7.0即将推送 Nexus用户最迟8月22日更新
原标题:Android 7.0即将推送 Nexus用户最迟8月22日更新 [丫丫网]Android N终于来了.今年5月,谷歌正式发布最新的Android N系统.7月1日,谷歌都会在位于加州山景城的 ...
- 一加升级android p,一加6氢OS获得更新:Android P正式版推送
原标题:一加6氢OS获得更新:Android P正式版推送 [Pconline 资讯]经过多个Beta版的测试,一加在10月11日向一加6推送了氢OS的Android P正式版更新,该版本也是氢OS的 ...
- android应用接入第三方推送实践
本文由来和目的 由来:昨天技术群里有人问到推送,作为一个亲自踩过坑的的人,回答了一些问题,有人就说,你应该写一篇博客啊.其实在做完公司的项目集成之后,是想写的,但是因为懒就一直没写,但昨天经人这么一说 ...
最新文章
- AbstractFactory抽象工厂模式
- 西南民大oj(矩阵快速幂)
- [问答题] 考SQL语句的题,题太长了,实在不好回忆了。
- mybatis-查询过程
- c与指针 从一个字符串中提取子串_python实现找出来一个字符串中最长不重复子串...
- 黑马程序员_Java学习日记num4
- python框架优化方法_Python 遗传算法框架 GAFT 优化小记
- iOS应用支持IPV6及阿里云相关配置
- oracle call 存储过程 带out_详解oracle数据库存储过程调试方法
- 纯MSDOS操作系统下的计算机重启与关机
- win10taskkill强行结束进程_win10强制关闭进程快捷键
- 六级考研单词之路-十六
- 软件测试之与大厂测试经理的问答
- 闲置交易,二手交易,二手商城,同城交易,社交商城类APP源码
- 雷军:人因梦想而伟大 金山骨子里重视技术尊重程序员
- java录制声音(采集声卡音频数据)
- `泷泽萝拉.png .exe`
- 查看安装的tensorflow是哪个版本,查看Tensorflow是GPU还是CPU
- 通过API执行AutoCAD命令来
- 高级人像调色效果Lr预设
热门文章
- Python进阶(九) -- 操作excel文件
- linux下如何模拟按键输入和模拟鼠标
- 文件共享服务器(CIFS协议)
- 'javac'不是内部或外部命令,也不是可运行的程序或批处理文件.
- 1.8.9适用的java,Java 7、8、9+版本的一些新特性
- Pysot训练自己数据集前的预处理
- Console口和Telnet远程登陆
- elastix2.5vtigercrm5.2.1来电弹屏和点击呼叫的配置
- html调用暴风影音,暴风影音4大使用设置技巧
- GRE Over IPSec技术