it-swarm.com.de

Wie kann ich mit dem BadgeProvider auf Samsung-Handys verbunden werden, um dem App-Symbol einen Zähler hinzuzufügen?

Mit dem TWLauncher von Samsung können Apps Kennziffern für App-Symbole erstellen.

Das ist völlig undokumentiert! Es gibt keine Erwähnung von irgendwo, und nur eine Handvoll Apps verwenden es (z. B. Facebook, eBay).

Wie verwenden Sie diese Funktion, um Ihrem App-Symbol eine Zählung hinzuzufügen?

Dies ist sehr spezifisch für Samsung-Geräte. Ich frage nicht allgemein nach Android. Ich frage nur nach dem Badging von Samsungs Touchwhiz-Oberfläche, das derzeit das Badging zulässt. Android nicht. 

35
Daniel Ochoa

Als Erstes müssen Sie Ihrer AndroidManifest.xml-Datei die folgenden Berechtigungen hinzufügen.

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

Die Spaltenstruktur sieht wie folgt aus:

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

Um ALLE Ergebnisse vom BadgeProvider abzufragen, führen Sie folgende Schritte aus:

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

, Um Ihrem Anwendungssymbol eine Ausweisanzahl hinzuzufügen

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

Wenn Sie die Ausweisanzahl auf Ihrem Symbol löschen möchten

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

NEU
Ich habe ein Open Source-Projekt erstellt, das Sie als Bibliothek importieren können, um dies zu unterstützen. Es ist als Apache lizenziert, Sie können es also nach Belieben verwenden.

Sie können es von hier erhalten: https://github.com/shafty023/SamsungBadger

68
Daniel Ochoa

Es gibt eine weitere coole Open Source-Bibliothek, die verschiedene Geräte unterstützt: https://github.com/leolin310148/ShortcutBadger/

21
Vlad Yarovyi

fügen Sie diese Berechtigungen zum Manifest hinzu 

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

fügen Sie Ihrer Klasse diese Paketnamen hinzu: 

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

für den Einsatz : 

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

dank an ShortcutBadger

15
Hamidreza

In Android haben wir keinen Badge-Style-Ansatz wie iOS, aber einige Hersteller unterstützen die Anzeige von Badge auf App-Icons.

Unterstützung für Sony und HTC.

Beispiel für ein Abzeichen-Symbol in der App in Android

Sony und HTC unterstützen das Hinzufügen eines Abzeichens zum App-Symbol.

Für 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);

für 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

Ich verwende diese Klasse für Samsung- und Sony-Geräte (ebenfalls verfügbar https://Gist.github.com/Tadas44/cdae2f5995f21bf1c27f ). Vergessen Sie nicht, <uses-permission Android:name="com.sonyericsson.home.permission.BROADCAST_BADGE" /> zu AndroidManifest.xml hinzuzufügen

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

Es gibt ein weiteres Tool, das Sie für Xperia-Geräte verwenden können

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

Weitere Details siehe unten

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

0
Ahmed Salem

Für Android 8.0 Oreo Users-

Für diejenigen, die Probleme beim Anzeigen der Ausweisanzahl für Samsung S8, S9 oder Pixel Geräte mit Oreo haben, gilt: ShortcutBadger Bibliothek unterstützt nicht API>26 für Samsung Berichtet hier in Ausgaben . Hier muss zuerst geprüft werden, ob isBadgeCounterSupported so ist -

public boolean isBadgeCounterSupported() {
    // Workaround for bug in ShortcutBadger in version 1.1.19, registered as
    // https://github.com/leolin310148/ShortcutBadger/issues/266
    if (Build.MANUFACTURER.equalsIgnoreCase("Samsung") && Build.VERSION.SDK_INT >= 26) {
        Log.d("LOG_TAG", "Launcher icon badge (ShortcutBadger) is not supported on Samsung devices running Android 8 (or newer).");
        return false;
    }

    return ShortcutBadger.isBadgeCounterSupported(context);
}

Die einzige Möglichkeit besteht darin, Abzeichen aus Benachrichtigung . Informationen zum Anwenden von Ausweisen aus Ihren Benachrichtigungen finden Sie in der Android-Dokumentation und im Abschnitt "Festlegen der Anzahl benutzerdefinierter Benachrichtigungen".

Notification notification = new NotificationCompat.Builder(MainActivity.this, "my_channel_01")
    .setContentTitle("New Messages")
    .setContentText("You've received 3 new messages.")
    .setSmallIcon(R.drawable.ic_notify_status)
    .setNumber(messageCount) //this badge count
    .build();

enter image description here

Weitere Informationen zu Benachrichtigungen in Android 8.0) finden Sie unter diese Antwort .