android 小米角标,关于 小米手机 角标的问题

本文详细介绍了在小米手机上实现应用角标显示的方法,包括通过发送通知和使用反射设置角标数。讨论了在MIUI不同版本上的兼容性问题,并提供了相关代码示例。同时指出,由于系统版本变化,建议开发者遵循默认行为,避免过度依赖特定系统特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平常可能都会看到 比如 三星,小米, 系统有类似 ios上app消息通知效果的 右上角 消息角标

在网络上 也有相关方面的资料,但是也有一点是有问题的

就比如在 miui 6 上

这个查了相关资料后,其实是这样的

小米应用开发者文档

默认的情况

当app 向通知栏发送了一条通知 (通知不带进度条并且用户可以删除的),那么桌面app icon角标就会显示1.此时app显示的角标数是和通知栏里app发送的通知数对应的,即向通知栏发送了多少通知就会显示多少角标。

通知可以定义角标数

例如 有5封未读邮件,通知栏里只会显示一条通知,但是想让角标显示5. 可以在发通知时加个标示。

第三方app需要用反射来调用,参考代码:

NotificationManager mNotificationManager = (NotificationManager) this

.getSystemService(Context.NOTIFICATION_SERVICE);

Notification.Builder builder = new Notification.Builder(this)

.setContentTitle(“title”).setContentText(“text”).setSmallIcon(R.drawable.icon);

Notification notification = builder.build();

try {

Field field = notification.getClass().getDeclaredField(“extraNotification”);

Object extraNotification = field.get(notification);

Method method =extraNotification.getClass().getDeclaredMethod(“setMessageCount”, int.class);

method.invoke(extraNotification, mCount);

} catch (Exception e) {

e.printStackTrace();

}

mNotificationManager.notify(0,notification);

相关链接

http://dev.xiaomi.com/doc/p=3904/index.html

不过说实话,这个功能真的挺鸡肋了,

确实 很多 apk是按照 第一种方式 默认的,想想也对,有时候完全没有必要因为小米系统的变化,一直去修改这方面角标显示的代码,默认应该是最好的了。

第2种, 我当时用 小米 note测试了,

在第一次转上时,执行代码,确实有了角标,但是当我点进去,或者清除状态栏角标消失后,我清除后台,

我重新进入apk,虽然代码是调用了,但是并没有角标生成,这个就很奇怪了,具体原因也真的不知道,

为什么第一次就好好的,重新进入切调用了代码却没有角标的生成,如果有知道的人,看到了请给我评论里说下

65a1e7efcb2f76416a58ac5b8b0c362e.png

获取判断 miui 版本

String miui = “ro.miui.ui.version.name”;

参考Android源码:

https://code.google.com/p/cyanogen-updater/source/browse/trunk/src/cmupdaterapp/utils/SysUtils.java#19

在Android shell模式下输入 getprop 就能获取系统属性值

如果Rom是miUI那么就会有以下字段.

public static String getSystemProperty(String propName){

String line;

BufferedReader input = null;

try{

Process p = Runtime.getRuntime().exec("getprop " + propName);

input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);

line = input.readLine();

input.close();

}catch (Exception ex){

Log.e("miui", "Unable to read sysprop " + propName, ex);

return null;

}finally{

if(input != null){

try{

input.close();

}catch (Exception e){

Log.e("miui", "Exception while closing InputStream", e);

}

}

}

return line;

}

测试后获取到的 V5 V6

参考:http://blog.csdn.net/devilkin64/article/details/19415717

再就是 网络上都有的一种 miui 6 前的 角标实现的方式

测试过还是可以用的,但是他判断 miui6 的代码貌似是不对的

在 5 上测试过是可以成功的

public class Miutil{

/**

* Set badge count

* 针对 Samsung / xiaomi / sony 手机有效

*@param context The context of the application package.

*@param count Badge count to be set

*/

public static void setBadgeCount(Context context, int count) {

if (count <= 0) {

count = 0;

} else {

count = Math.max(0, Math.min(count, 99));

}

if (Build.MANUFACTURER.equalsIgnoreCase("Xiaomi")) {

System.out.println("1111111111111111111111");

sendToXiaoMi(context, count);

} else if (Build.MANUFACTURER.equalsIgnoreCase("sony")) {

sendToSony(context, count);

} else if (Build.MANUFACTURER.toLowerCase().contains("samsung")) {

sendToSamsumg(context, count);

} else {

Toast.makeText(context, "Not Support", Toast.LENGTH_LONG).show();

}

}

/**

* 向小米手机发送未读消息数广播

*@param count

*/

private static void sendToXiaoMi(Context context, int count) {

try {

////////////这段代码是有问题的///////////////////////////////////////////

Class miuiNotificationClass = Class.forName("android.app.MiuiNotification");

Object miuiNotification = miuiNotificationClass.newInstance();

Field field = miuiNotification.getClass().getDeclaredField("messageCount");

field.setAccessible(true);

field.set(miuiNotification, String.valueOf(count == 0 ? "" : count)); // 设置信息数-->这种发送必须是miui 6才行

} catch (Exception e) {

e.printStackTrace();

// miui 6之前的版本

Intent localIntent = new Intent(

"android.intent.action.APPLICATION_MESSAGE_UPDATE");

System.out.println("===luancher ppp="+ context.getPackageName() + "/" + getLauncherClassName(context));

localIntent.putExtra(

"android.intent.extra.update_application_component_name",

context.getPackageName() + "/" + getLauncherClassName(context));

localIntent.putExtra(

"android.intent.extra.update_application_message_text", String.valueOf(count == 0 ? "" : count));

context.sendBroadcast(localIntent);

System.out.println("5555555555555555");

}

}

/**

* 向索尼手机发送未读消息数广播

* 据说:需添加权限: [未验证]

*@param count

*/

private static void sendToSony(Context context, int count){

String launcherClassName = getLauncherClassName(context);

if (launcherClassName == null) {

return;

}

boolean isShow = true;

if (count == 0) {

isShow = false;

}

Intent localIntent = new Intent();

localIntent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");

localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE",isShow);//是否显示

localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME",launcherClassName );//启动页

localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));//数字

localIntent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());//包名

context.sendBroadcast(localIntent);

}

/**

* 向三星手机发送未读消息数广播

*@param count

*/

private static void sendToSamsumg(Context context, int count){

String launcherClassName = getLauncherClassName(context);

if (launcherClassName == null) {

return;

}

Intent intent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");

intent.putExtra("badge_count", count);

intent.putExtra("badge_count_package_name", context.getPackageName());

intent.putExtra("badge_count_class_name", launcherClassName);

context.sendBroadcast(intent);

}

/**

* 重置、清除Badge未读显示数

*@param context

*/

public static void resetBadgeCount(Context context) {

setBadgeCount(context, 0);

}

/**

* Retrieve launcher activity name of the application from the context

*

*@param context The context of the application package.

*@return launcher activity name of this application. From the

* "android:name" attribute.

*/

private static String getLauncherClassName(Context context) {

PackageManager packageManager = context.getPackageManager();

Intent intent = new Intent(Intent.ACTION_MAIN);

// To limit the components this Intent will resolve to, by setting an

// explicit package name.

intent.setPackage(context.getPackageName());

intent.addCategory(Intent.CATEGORY_LAUNCHER);

// All Application must have 1 Activity at least.

// Launcher activity must be found!

ResolveInfo info = packageManager

.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);

// get a ResolveInfo containing ACTION_MAIN, CATEGORY_LAUNCHER

// if there is no Activity which has filtered by CATEGORY_DEFAULT

if (info == null) {

info = packageManager.resolveActivity(intent, 0);

}

return info.activityInfo.name;

}

}

调用的代码

Miutil.setBadgeCount(getApplicationContext(), 10);

所以综上看,还是不要去管这些, 他自己变系统版本就自己变好了,看了很多app 也都是这样做的。因为这个标准并不是所有人都会去遵守的,一更新miui的版本可能相应的代码需要修改,就需要出个新的版本更新迭代。

<think>好的,用户想了解小米手机Android系统上的桌面角标适配问题。首先,我得明确什么是桌面角标,也就是应用图标上显示的通知数量的小红点或数字。这个问题可能涉及不同Android版本的适配,特别是MIUI的定制带来的差异。 接下来,我需要回忆一下Android原生的角标机制。通常,Android使用NotificationListenerService来管理通知,应用可以通过发送带有数字的Notification来触发角标显示。但MIUI作为深度定制的系统,可能有自己的实现方式,比如需要特殊权限或者特定的Intent。 然后,用户可能遇到的问题是,他们的应用在小米手机上无法正确显示角标,或者显示不一致。这可能是因为MIUI限制了后台启动Activity,或者需要用户手动授权应用发送通知的权限。此外,不同MIUI版本可能有不同的处理方式,导致适配困难。 还需要考虑小米角标API是否有文档支持,或者是否有隐藏的Intent可以用来触发角标。比如,有些厂商会提供特定的广播Action,发送这些广播可以更新角标。例如,发送一个特定的Intent,包含包名和数字,可能可以更新角标。 另外,用户可能需要检查应用的通知渠道设置是否正确,因为MIUI可能会将某些通知渠道默认静音,导致角标不显示。还有应用是否被省电策略限制,需要在后台运行权限里允许应用自启动和相关权限。 可能还需要查阅小米的开放平台文档,或者开发者论坛,看看有没有官方推荐的适配方法。如果没有,可能需要通过反射或者其他Hack方式来实现,但这样可能存在兼容性问题,尤其是MIUI版本更新后可能失效。 总结下来,适配小米的桌面角标需要注意以下几点:检查通知权限是否开启,使用正确的Notification构造方法,处理MIUI的后台限制,可能需要发送特定的广播或使用小米提供的SDK,以及测试不同MIUI版本的兼容性。</think>在Android开发中,适配小米手机桌面角标(应用图标未读消息数)需要注意以下关键点: **一、MIUI特性差异** 1. MIUI系统存在特殊权限控制: - 需用户手动开启`显示悬浮窗`权限(路径:设置→应用设置→权限管理→悬浮窗) - 需开启`自启动`权限避免进程被清理 **二、原生适配方案** ```java // 标准Notification构建方式 NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setContentTitle("新消息") .setContentText("您有未读消息") .setNumber(5) // 关键角标数值设置 .setSmallIcon(R.drawable.ic_notification); ``` **三、MIUI专属适配策略** 1. 反射调用系统服务(兼容旧版本MIUI): ```java try { Bundle extras = new Bundle(); extras.putString("package", context.getPackageName()); extras.putString("class", launcherClassName); extras.putInt("badgenumber", count); context.getContentResolver().call( Uri.parse("content://com.android.badge/badge"), "setAppBadgeCount", null, extras); } catch (Exception e) { // 处理兼容性异常 } ``` 2. 广播方式(推荐新版本): ```java Intent intent = new Intent("android.intent.action.APPLICATION_MESSAGE_UPDATE"); intent.putExtra("android.intent.extra.update_application_component_name", context.getPackageName() + "/" + launcherClassName); intent.putExtra("android.intent.extra.update_application_message_text", count); context.sendBroadcast(intent); ``` **四、注意事项** 1. 动态获取启动类: ```java // 获取默认启动Activity Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName); String className = launchIntent.getComponent().getClassName(); ``` 2. 版本兼容检测: ```java if (Build.MANUFACTURER.equalsIgnoreCase("xiaomi")) { // 执行MIUI专属适配逻辑 handleMiuiBadge(count); } else if (...) { // 其他厂商适配 } ``` 3. 需在清单文件声明权限: ```xml <uses-permission android:name="com.xiaomi.permission.UPDATE_APP_ICON"/> ``` **五、常见问题排查** 1. 角标不生效时检查: - 是否开启`通知管理`权限 - 是否开启`悬浮窗`权限 - 是否被系统电池优化限制 - 应用是否被强制停止 2. 桌面兼容问题: - 不同MIUI版本(如MIUI12/13)实现差异 - 不同桌面主题可能覆盖角标样式 - 第三方桌面应用(如Nova Launcher)的特殊处理 建议在实际开发中结合小米开放平台最新文档,并测试覆盖主流机型(Redmi K系列、Note系列等)。可通过`Build.VERSION.INCREMENTAL`字段获取具体MIUI版本号进行精准适配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值