三星的TWLauncher允許應用程序在應用程序圖標上創建徽章數量。如何在三星手機上使用BadgeProvider進行連接以將計數添加到應用圖標?
這是完全沒有記錄的! 任何地方都沒有提及,只有少數應用正在使用它(例如Facebook,eBay)。
如何使用此功能爲您的應用程序圖標添加計數?
這是三星設備特有的。一般來說,我並沒有問及Android。我只問三星的Touchwhiz接口是否允許徽章。 Android不。
三星的TWLauncher允許應用程序在應用程序圖標上創建徽章數量。如何在三星手機上使用BadgeProvider進行連接以將計數添加到應用圖標?
這是完全沒有記錄的! 任何地方都沒有提及,只有少數應用正在使用它(例如Facebook,eBay)。
如何使用此功能爲您的應用程序圖標添加計數?
這是三星設備特有的。一般來說,我並沒有問及Android。我只問三星的Touchwhiz接口是否允許徽章。 Android不。
首先,您需要將以下權限添加到您的AndroidManifest.xml文件中。
<uses-permission android:name="com.sec.android.provider.badge.permission.READ" />
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE" />
該柱結構如下:
(integer) _id, (text) package, (text) class, (integer) badgecount, (blob) icon, (???) extraData
爲了查詢從BadgeProvider所有結果執行以下操作:
// This is the content uri for the BadgeProvider
Uri uri = Uri.parse("content://com.sec.badge/apps");
Cursor c = getContentResolver().query(uri, null, null, null, null);
// This indicates the provider doesn't exist and you probably aren't running
// on a Samsung phone running TWLauncher. This has to be outside of try/finally block
if (c == null) {
return;
}
try {
if (!c.moveToFirst()) {
// No results. Nothing to query
return;
}
c.moveToPosition(-1);
while (c.moveToNext()) {
String pkg = c.getString(1);
String clazz = c.getString(2);
int badgeCount = c.getInt(3);
Log.d("BadgeTest", "package: " + pkg + ", class: " + clazz + ", count: " + String.valueOf(cnt));
}
} finally {
c.close();
}
爲了添加徽章計數到您的應用程序圖標
ContentValues cv = new ContentValues();
cv.put("package", getPackageName());
// Name of your activity declared in the manifest as android.intent.action.MAIN.
// Must be fully qualified name as shown below
cv.put("class", "com.example.badge.activity.Test");
cv.put("badgecount", 1); // integer count you want to display
// Execute insert
getContentResolver().insert(Uri.parse("content://com.sec.badge/apps"), cv);
如果你想清楚自己的圖標
ContentValues cv = new ContentValues();
cv.put("badgecount", 0);
getContentResolver().update(Uri.parse("content://com.sec.badge/apps"), cv, "package=?", new String[] {getPackageName()});
新
我已經創建了一個開源項目,您可以導入爲庫,以協助這個徽章計數。它的許可證爲Apache,因此可以隨意使用它。
這就像FB在那裏使用應用程序一樣工作? –
可以請你更詳細的...? –
是的,這正是Facebook做徽章的標誌 –
在Android中,我們沒有徽章式的方法爲iOS的但有些製造商都支持顯示在應用程序圖標徽章。
支持索尼和HTC。
Example for badge style icon on app in android
索尼和HTC支持添加徽章應用圖標。
索尼
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
Intent intent= new Intent("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", Class Name);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE",number);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", packageName);
sendBroadcast(intent);
對於HTC:
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT" />
Intent updateIntent = new Intent("com.htc.launcher.action.UPDATE_SHORTCUT");
updateIntent.putExtra("packagename", packageName);
updateIntent.putExtra("count", number);
this.sendBroadcast(updateIntent);
Intent setNotificationIntent = new Intent("com.htc.launcher.action.SET_NOTIFICATION");
ComponentName localComponentName = new ComponentName(packageName, className);
setNotificationIntent.putExtra("com.htc.launcher.extra.COMPONENT", localComponentName.flattenToShortString());
setNotificationIntent.putExtra("com.htc.launcher.extra.COUNT", number);
this.sendBroadcast(setNotificationIntent);
有支持不同設備的另一個很酷的開源庫: https://github.com/leolin310148/ShortcutBadger/
太棒了!最好的解決方案。 – NOlivNeto
這正是我正在尋找的。真棒!謝謝 –
還有一種工具,可用於Xperia設備
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", "com.yourdomain.yourapp.MainActivity");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "99");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", "com.yourdomain.yourapp");
sendBroadcast(intent);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", "10");
更多細節如下
http://www.marcusforsberg.net/blog/android-notification-badge-app-icon-sony/
我使用這個類爲三星和索尼的設備(也可https://gist.github.com/Tadas44/cdae2f5995f21bf1c27f)。不要忘記添加<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" />
到AndroidManifest.xml中
public class BadgeUtils {
public static void setBadge(Context context, int count) {
setBadgeSamsung(context, count);
setBadgeSony(context, count);
}
public static void clearBadge(Context context) {
setBadgeSamsung(context, 0);
clearBadgeSony(context);
}
private static void setBadgeSamsung(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);
}
private static void setBadgeSony(Context context, int count) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
return;
}
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", true);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(count));
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
context.sendBroadcast(intent);
}
private static void clearBadgeSony(Context context) {
String launcherClassName = getLauncherClassName(context);
if (launcherClassName == null) {
return;
}
Intent intent = new Intent();
intent.setAction("com.sonyericsson.home.action.UPDATE_BADGE");
intent.putExtra("com.sonyericsson.home.intent.extra.badge.ACTIVITY_NAME", launcherClassName);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.SHOW_MESSAGE", false);
intent.putExtra("com.sonyericsson.home.intent.extra.badge.MESSAGE", String.valueOf(0));
intent.putExtra("com.sonyericsson.home.intent.extra.badge.PACKAGE_NAME", context.getPackageName());
context.sendBroadcast(intent);
}
private static String getLauncherClassName(Context context) {
PackageManager pm = context.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : resolveInfos) {
String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
if (pkgName.equalsIgnoreCase(context.getPackageName())) {
String className = resolveInfo.activityInfo.name;
return className;
}
}
return null;
}
}
非常感謝你! Xamarin Forms/Android也很棒。 – hvaughan3
添加這些權限來體現
<!--for android badge-->
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS"/>
<!--for Samsung badge-->
<uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>
<!--for htc badge-->
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT"/>
<!--for sony badge-->
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE"/>
<!--for apex badge-->
<uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/>
這些軟件包名稱添加到您的類:
final String HOME_PACKAGE_SONY = "com.sonyericsson.home";
final String HOME_PACKAGE_SAMSUNG = "com.sec.android.app.launcher";
final String HOME_PACKAGE_LG = "com.lge.launcher2";
final String HOME_PACKAGE_HTC = "com.htc.launcher";
final String HOME_PACKAGE_ANDROID = "com.android.launcher";
final String HOME_PACKAGE_APEX = "com.anddoes.launcher";
final String HOME_PACKAGE_ADW = "org.adw.launcher";
final String HOME_PACKAGE_ADW_EX = "org.adwfreak.launcher";
final String HOME_PACKAGE_NOVA = "com.teslacoilsw.launcher";
使用:
// just put your pachage and main activity class path
String classPath = "ir.faasaa.resa.MainActivity";
ContentValues cv = new ContentValues();
cv.put("package", context.getPackageName());
cv.put("class", classPath);
cv.put("badgecount", count);
context.getContentResolver().insert(Uri.parse(HOME_PACKAGE_SAMSUNG), cv);
t hank到ShortcutBadger
我相信你的意思是「無證無處」。除非你的意思是「記錄在這裏」。未記錄任何地方?那是什麼意思? – sammyg
@sammyg好點,做出了改變。基本上只是說當我寫這篇文章的時候,互聯網上沒有關於如何與BadgeProvider進行交互的文檔。 –
[有沒有辦法將徽章添加到Android中的應用程序圖標?](https://stackoverflow.com/questions/2905542/is-there-a-way-to-add-a-badge- to-an-application-icon-in-android) –