2013-11-22 201 views
35

三星的TWLauncher允許應用程序在應用程序圖標上創建徽章數量。如何在三星手機上使用BadgeProvider進行連接以將計數添加到應用圖標?

這是完全沒有記錄的! 任何地方都沒有提及,只有少數應用正在使用它(例如Facebook,eBay)。

如何使用此功能爲您的應用程序圖標添加計數?

這是三星設備特有的。一般來說,我並沒有問及Android。我只問三星的Touchwhiz接口是否允許徽章。 Android不。

+0

我相信你的意思是「無證無處」。除非你的意思是「記錄在這裏」。未記錄任何地方?那是什麼意思? – sammyg

+0

@sammyg好點,做出了改變。基本上只是說當我寫這篇文章的時候,互聯網上沒有關於如何與BadgeProvider進行交互的文檔。 –

+0

[有沒有辦法將徽章添加到Android中的應用程序圖標?](https://stackoverflow.com/questions/2905542/is-there-a-way-to-add-a-badge- to-an-application-icon-in-android) –

回答

67

首先,您需要將以下權限添加到您的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,因此可以隨意使用它。

你可以從這裏得到它:https://github.com/shafty023/SamsungBadger

+0

這就像FB在那裏使用應用程序一樣工作? –

+0

可以請你更詳細的...? –

+0

是的,這正是Facebook做徽章的標誌 –

8

在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); 
0

還有一種工具,可用於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/

4

我使用這個類爲三星和索尼的設備(也可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; 
    } 
} 
+0

非常感謝你! Xamarin Forms/Android也很棒。 – hvaughan3

14

添加這些權限來體現

<!--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

相關問題