How do I show text in android system status bar How do I show text in android system status bar android android

How do I show text in android system status bar


I do found a solution, the keyword is overlay with a floating window.

int statusBarHeight = 0;int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");if (resourceId > 0) statusBarHeight = getResources().getDimensionPixelSize(resourceId);final WindowManager.LayoutParams parameters = new WindowManager.LayoutParams(        WindowManager.LayoutParams.WRAP_CONTENT,        statusBarHeight,        WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,   // Allows the view to be on top of the StatusBar        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,    // Keeps the button presses from going to the background window and Draws over status bar        PixelFormat.TRANSLUCENT);parameters.gravity = Gravity.TOP | Gravity.CENTER;LinearLayout ll = new LinearLayout(this);ll.setBackgroundColor(Color.TRANSPARENT);LinearLayout.LayoutParams layoutParameteres = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);ll.setLayoutParams(layoutParameteres);TextView tv = new TextView(this);ViewGroup.LayoutParams tvParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);tv.setLayoutParams(tvParameters);tv.setTextColor(Color.WHITE);tv.setGravity(Gravity.CENTER);tv.setText("123");ll.addView(tv);WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);windowManager.addView(ll, parameters);


Well, I did it. I used the way of converting text to an icon and then displaying it on the status bar. some members are trying to overlay the status bar which android does not allow(SDK>=22), I don't know if that worked for someone or not. But converting text to an icon worked for me perfectly. Tested it on Oreo

Pseudo code

  1. Convert text to Bitmap
  2. Then convert Bitmap to icon.
  3. show that icon on statusBar.

Output

enter image description here

Here is the code:

 @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        displayNotification("5F");    }
 public void displayNotification(String text) {        Notification.Builder builder = null;        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {            builder = new Notification.Builder(this, CHANNEL_ID);        }        //convert text to bitmap        Bitmap bitmap = createBitmapFromString(text.trim());        //setting bitmap to staus bar icon.        builder.setSmallIcon(Icon.createWithBitmap(bitmap));        builder.setContentTitle("Simple Notification");        builder.setContentText("This is a simple notification");        builder.setPriority(Notification.PRIORITY_MAX);        NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);        notificationManagerCompat.notify(NOTIFICATION_ID, builder.build());        createNotificationChannel();    }
  private void createNotificationChannel() {        // Create the NotificationChannel, but only on API 26+ because        // the NotificationChannel class is new and not in the support library        if (VERSION.SDK_INT >= VERSION_CODES.O) {            CharSequence name = "testing";            String description = "i'm testing this notification";            int importance = NotificationManager.IMPORTANCE_DEFAULT;            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);            channel.setDescription(description);            // Register the channel with the system; you can't change the importance            // or other notification behaviors after this            NotificationManager notificationManager = getSystemService(NotificationManager.class);            assert notificationManager != null;            notificationManager.createNotificationChannel(channel);        }    }  
  private Bitmap createBitmapFromString(String inputNumber) {        Paint paint = new Paint();        paint.setAntiAlias(true);        paint.setTextSize(100);        paint.setTextAlign(Paint.Align.CENTER);        Rect textBounds = new Rect();        paint.getTextBounds(inputNumber, 0, inputNumber.length(), textBounds);        Bitmap bitmap = Bitmap.createBitmap(textBounds.width() + 10, 90,                Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(bitmap);        canvas.drawText(inputNumber, textBounds.width() / 2 + 5, 70, paint);        return bitmap;    }

If someone knows a better way then please do mention


You can find your answer in the doc, here: https://developer.android.com/reference/android/support/v4/app/NotificationCompat.html

Edit::Well, the answer is in the doc. However, after a good bit of research and digging, it seems as though the consensus amongst the community is that this is not possible for just any application. Only specific icons can be placed on the right side of the status bar (i.e. Clock, Weather, System info, etc...).

I'm sorry there isn't a more exciting answer, but at least you can stop stressing out about why you can't figure it out.

Edit 2:: Apparently, pre-lollipop devices had access to private apis that allowed you to work with system icons (again, think about the alarm icon). Afterward, the apis were removed. This stackoverflow post goes over the whole situation pretty extensively.

Edit 3:: If you can live with placing you icon on the left side of the status bar you can convert text to bitmap like this:

 TextView textView = new TextView(activity.getContext()); textView.setText("Hello World"); textView.setDrawingCacheEnabled(true); textView.destroyDrawingCache(); textView.buildDrawingCache(); Bitmap bitmap = getTransparentBitmapCopy(textView.getDrawingCache()); private Bitmap getTransparentBitmapCopy(Bitmap source) {     int width = source.getWidth();     int height = source.getHeight();     Bitmap copy = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);    int[] pixels = new int[width * height];    source.getPixels(pixels, 0, width, 0, 0, width, height);    copy.setPixels(pixels, 0, width, 0, 0, width, height);    return copy; }