Android Notification如何顯示錶情?

如題,如果可以,告訴我如何實現?如果不可以,為什麼淘寶的通知里會顯示錶情?


謝邀 @xu sir
這題放著我來,這種題目我最喜歡了,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。

遇到這種分析用什麼實現的,肯定要祭出大殺器Android Device Monitor(AS在Tools-&>Android)
打開之後,選中連接的設備,然後點擊小手機圖標,即可導出UI層次圖。
咱們來看下淘寶通知的UI層次圖。

看右側,我擦嘞,居然是TextView,上面那個有個飛機的也是圖片。
那是不是TextView的圖文混排呢?
寫段代碼試下唄,測試發現沒有卵用(具體為什麼不可行,大家有興趣可以分析下Android源碼)。

那該怎麼辦,不知道你發現沒有,淘寶使用的幾乎都是emoji表情。
既然這樣就好辦了,在傳入Notification的數據裡面寫入emoji數據試試。
果然,真的可以使用。而且,不限制放多少表情,客官隨便放。

第一張圖是鎚子T1,第二張是一加2(氧系統)。

這種實現有3個問題:
一是只能只用Unicode範圍內的表情(其實就是字體文字,只是系統渲染出來看著像表情),當然不一定限定於Emoji範圍(比如Unicode 0x2708是個灰機?);
二是不同系統顯示的表情不一樣;
三是貌似4.0系統以下不支持。

那我要顯示其他表情該怎麼辦。那就只有自定義通知欄布局了。
看到那個搜狗市場的更新圖標了么?布局大致如右側。也就是 @hi大頭鬼hi 同學所說的icon。
那如果真的要圖文混排怎麼辦,那就整個通知欄一個ImageView,然後把文字、圖片繪製到一個Bitmap上,然後再設置進去。理論可行。

最後,上淘寶通知欄顯示錶情的測試代碼。
Emoji Unicode編碼可參考附錄。

String originalStr = "emoji-" + newString(0x1f602) +newString(0x1f684)+"--over";
Notifier.getInstance().notify(originalStr,originalStr,"tickerText2",Notifier.TYPE_COMMON,false);

public static final String newString(int codePoint) {
return new String(Character.toChars(codePoint));
}

/**
* Notification
*/
public class Notifier {

private static Notifier instance = null;

private NotificationManager notificationManager;

private static Object INSTANCE_LOCK = new Object();

public static final int TYPE_COMMON = 1;

private static final String TAG = "Notifier";

Intent mLauncherIntent = null;
Notification notification = null;

int count = 0;

public static Notifier getInstance() {
if (instance == null)
synchronized (INSTANCE_LOCK) {
if (instance == null) {
instance = new Notifier();
}
}
return instance;
}

private Notifier() {
this.notificationManager = (NotificationManager) ZanPhoneRecorderApplication.getInstance().getSystemService(Context.NOTIFICATION_SERVICE);
}

/**
* 清除所有通知
* */
public void cleanAll() {
if (notificationManager != null) {
notificationManager.cancelAll();
}
}

public void cancelByType(int type) {
if (notificationManager != null) {
notificationManager.cancel(type);
}
}

/**
*/
public void notify(CharSequence title, CharSequence message, String tickerText, int type, boolean canClear) {
try {
Context context = ZanPhoneRecorderApplication.getInstance();
Notification notification = new Notification();
notification.icon = R.mipmap.ic_launcher;
notification.defaults = Notification.DEFAULT_LIGHTS;
// notification.defaults |= Notification.DEFAULT_SOUND;
// notification.defaults |= Notification.DEFAULT_VIBRATE;
if (canClear)
notification.flags |= Notification.FLAG_AUTO_CANCEL;
else
notification.flags |= Notification.FLAG_NO_CLEAR;

if (android.os.Build.VERSION.SDK_INT &>= 16) {// Android 4.1之後才有
notification.priority = Notification.PRIORITY_MAX;
}
notification.tickerText = tickerText;

notification.when = System.currentTimeMillis();
Intent intent = new Intent();
PendingIntent contentIntent = null;
switch (type) {
case TYPE_COMMON:
intent.setClass(context, HomeActivity.class);
contentIntent = PendingIntent.getActivity(context, TYPE_COMMON, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(context, title, message, contentIntent);
break;
}
if (contentIntent != null) {
notification.contentIntent = contentIntent;
notificationManager.notify(type, notification);
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

附錄:

  • emoji表情列表

http://unicode.org/emoji/charts/full-emoji-list.html
http://apps.timwhitlock.info/emoji/tables/unicode

  • unicode列表

http://www.ssec.wisc.edu/~tomw/java/unicode.html


icon


Notifications


推薦閱讀:

為什麼很多女生都喜歡發挖鼻屎的表情?
steam上有哪些好用的表情?
安卓如何使用iOS9.1所更新的新版emoji表情?
求幾套哄女朋友可以用的表情?
大家有沒有有趣的爐石傳說表情包分享?

TAG:Android開發 | 表情 | Notifications |