如何在Facebook等通知区域和桌面通知中设置通知计数?

时间:2014-12-20 06:27:07

标签: android notifications google-cloud-messaging

我已按照这些tutorial进行了通知。但我想设置计数并使用图标使其可见,我想拖动和关闭facebook这样的通知。

这是我的代码。为了增加通知,我遵循了link

 @Override 
  public void onCreate() {
    super.onCreate();
    context = this;
    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    Bitmap bm = BitmapFactory.decodeResource(getResources(),
              R.drawable.ic_launcher);
    chatHead = new ImageView(this);
    chatHead.setImageBitmap(getCircleBitmap(bm, 200));
    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_PHONE,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
        PixelFormat.TRANSLUCENT);

    params.gravity = Gravity.TOP | Gravity.LEFT;
    params.x = 0;
    params.y = 100;
    setBadge(context, count++);
    chatHead.setOnTouchListener(new View.OnTouchListener() {
          private int initialX;
          private int initialY;
          private float initialTouchX;
          private float initialTouchY;
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            // TODO Auto-generated method stub
            switch (event.getAction()) {
              case MotionEvent.ACTION_DOWN:
                initialX = params.x;
                initialY = params.y;
                initialTouchX = event.getRawX();
                initialTouchY = event.getRawY();

                return true;
              case MotionEvent.ACTION_UP:
                return true;
              case MotionEvent.ACTION_MOVE:
                params.x = initialX + (int) (event.getRawX() - initialTouchX);
                params.y = initialY + (int) (event.getRawY() - initialTouchY);
                windowManager.updateViewLayout(chatHead, params);

                return true;
            }
            return false;
        }
    });
    windowManager.addView(chatHead, params);

  }
  public static void setBadge(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);
    }

    public 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;
    }
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
      return START_STICKY;
  }
  @Override
  public void onDestroy() {
    super.onDestroy();
    if (chatHead != null) windowManager.removeView(chatHead);
  }
  private Bitmap getCircleBitmap(Bitmap bitmap, int pixels) {
      final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
       bitmap.getHeight(), Bitmap.Config.ARGB_8888);
      final Canvas canvas = new Canvas(output);
     // int pixels;
      final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;
        paint.setShadowLayer(2, 2, 2, 0xff424242);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

      paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
      canvas.drawBitmap(bitmap, rect, rect, paint);

      bitmap.recycle();

      return output;
     }

我还希望通过GCM通知将其显示为计数。我用GCM消息设置了计数。但它不可见。

private void sendNotification(String msg) {
    int numMessages = 0;
    Intent inservice = new Intent(this, ChatService.class);
    startService(inservice);
    mNotificationManager = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, MainActivity.class), 0);
    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.ic_stat_gcm)
            .setContentTitle("Contact Received")
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg)
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setNumber(numMessages++)
            .setSound(Uri.parse("android.resource://" + getPackageName() + "/" +R.raw.sounds1));
    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}

有人能给我一些有用的例子吗?

1 个答案:

答案 0 :(得分:0)

如果你的意思是它在通知窗口中,我认为没有办法做到这一点。如果它在通知窗口中,您应该考虑使用number attribute进行通知。

如果你坚持使用像元素一样的徽章,你可以查看Android ViewBadger,但我认为你不能在通知窗口中使用它。