web-dev-qa-db-fra.com

Comment établir une interface avec BadgeProvider sur les téléphones Samsung pour ajouter un compte à l'icône de l'application

TWLauncher de Samsung permet aux applications de créer un nombre de badges sur les icônes des applications.

C'est complètement sans papiers! Il n'y en a aucune mention nulle part et seule une poignée d'applications l'utilise (par exemple, Facebook, eBay).

Comment utilisez-vous cette fonctionnalité pour ajouter un compte à l'icône de votre application?

Ceci est très spécifique aux appareils Samsung. Je ne parle pas d'Android en général. Je ne parle que de badger l'interface Touchwhiz de Samsung, qui permet actuellement le badging. Android ne le fait pas. 

35
Daniel Ochoa

Vous devez d’abord ajouter les autorisations suivantes à votre fichier AndroidManifest.xml.

<uses-permission Android:name="com.sec.Android.provider.badge.permission.READ" />
<uses-permission Android:name="com.sec.Android.provider.badge.permission.WRITE" />

La structure de la colonne est la suivante:

(integer) _id, (text) package, (text) class, (integer) badgecount, (blob) icon, (???) extraData

Pour interroger TOUS les résultats de BadgeProvider, procédez comme suit:

// 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();
}

Pour ajouter un nombre de badges à l'icône de votre application

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

Si vous souhaitez effacer le nombre de badges sur votre icône

ContentValues cv = new ContentValues();
cv.put("badgecount", 0);
getContentResolver().update(Uri.parse("content://com.sec.badge/apps"), cv, "package=?", new String[] {getPackageName()});  

NOUVEAU
J'ai créé un projet open source que vous pouvez importer en tant que bibliothèque pour vous aider. Il est sous licence Apache, alors n'hésitez pas à l'utiliser comme bon vous semble.

Vous pouvez l'obtenir à partir d'ici: https://github.com/shafty023/SamsungBadger

68
Daniel Ochoa

Il existe une autre bibliothèque open source qui prend en charge différents périphériques: https://github.com/leolin310148/ShortcutBadger/

21
Vlad Yarovyi

ajouter ces autorisations au manifeste 

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

ajoutez ces noms de paquets à votre classe: 

    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";

pour utilisation : 

  // 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);

grâce à ShortcutBadger

15
Hamidreza

Sous Android, l'approche par style de badge n'est pas celle d'iOS, mais certains fabricants prennent en charge l'affichage des badges sur les icônes d'application.

Support pour Sony et HTC.

Exemple d'icône de style de badge sur l'application sous Android

Sony et HTC prennent en charge l’ajout d’un badge à l’icône de l’application.

Pour Sony

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

pour 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);
8
Harsha Vardhan

J'utilise cette classe pour les appareils Samsung et Sony (également disponible https://Gist.github.com/Tadas44/cdae2f5995f21bf1c27f ). N'oubliez pas d'ajouter <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;
    }
}
5
Tadas Valaitis

Il existe un autre outil que vous pouvez utiliser pour les périphériques 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");

Plus de détails comme ci-dessous

http://www.marcusforsberg.net/blog/Android-notification-badge-app-icon-sony/

0
Ahmed Salem