Search This Blog

Showing posts with label Android Bitmap. Show all posts
Showing posts with label Android Bitmap. Show all posts

Wednesday, 17 April 2013

Simple notification example in android with custom sound file

Creating a simple  notification in  android   consists of few steps. NotificationCompat.Builder allow you set notification title, body and icon. then you can go forward to make it custom. See the below function. Call this where ever you want to use notification and set your custom values 

    private void createAndGenerateNotifcation() {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                this).setSmallIcon(R.drawable.ic_launcher)
                .setContentTitle("Notification TItile").setContentText("Body");
        mBuilder.setAutoCancel(true);
        try {
            Uri uri = Uri.parse("android.resource://" + getPackageName() + "/"
                    + R.raw.yourfile);
            mBuilder.setSound(uri);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // Intent resultIntent = new Intent(this, Notification.class);
        Intent resultIntent = new Intent();
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(Notification.class);
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
                PendingIntent.FLAG_UPDATE_CURRENT);
        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify((int) System.currentTimeMillis(),
                mBuilder.build());
    }

Structure of Notification in Android

  1. Content title
  2. Large icon
  3. Content text
  4. Content info
  5. Small icon
  6. Time   that the notification was issued. You can set an explicit value with setWhen(); if you don't it defaults to the time that the system received the notification.

Lets have a look on description 

Setting Notification custom sound - Keep your file inside raw folder of res and give URI to notification like this

        try {
            Uri uri = Uri.parse("android.resource://" + getPackageName() + "/"
                    + R.raw.yourfile);
            mBuilder.setSound(uri);
        } catch (Exception e) {
            e.printStackTrace();
        }

You can set auto cancel to remove when user tap on this       

    mBuilder.setAutoCancel(true); 

Starting your own activity while tap on notification - set your activity
name inside intent

Intent resultIntent = new Intent(this, Youractivty.class); 

Reference URL

Saturday, 12 May 2012

Bitmap operations like re sizing, rotating bitmap and other operations

In programming, Image processing is the most difficult work. All though i am not going to discuss image processing in depth but we will discuss about bitmap basic operation like re sizing, rotating bitmap, how to create bitmap from file , input stream and resource.we will discuss it step by step and finally you will get source in which you can enjoy playing with it. img is the ImageView object in my project.
As we are going to discuss bitmap to we need to study how to avoid Memory Over Flow while using big image

Tuesday, 17 April 2012

Displaying Bitmaps Efficiently and Avoiding java.lang.OutofMemoryError

java.lang.OutofMemoryError: bitmap size exceeds VM budget. This is most common error for us when we are decoding Bitmap more than 4 MB. In generally before decoding bitmap we do not know how much bigger the size of a bitmap will be. So its very difficult problem for us to handle this error in proactive approach

But good thing is that android provide a way to handle this problem.Before decoding bitmap we just decode it with options.inJustDecodeBounds = true. options is the instance of BitmapFactory. It does not load bitmap into memory but it help us to find the width and height of a bitmap so that we can reduce the height and width according to our device

As Bitmaps take up a lot of memory, especially for rich images like photographs. For example, the camera on the Galaxy Nexus takes photos up to 2592x1936 pixels (5 megapixels). If the bitmap configuration used is ARGB_8888 (the default from the Android 2.3 onward) then loading this image into memory takes about 19MB of memory (2592*1936*4 bytes), immediately exhausting the per-app limit on some devices.

So we will find actual height and width of a bitmap as follows...

Saturday, 7 April 2012

Pinching Zoom in android Image View or Bitmap

See Updated Tutorial


This is little bit complex article. In android , we can achieve pinch zoom with two or more than two finger. But it s little bit complex. I have developed it with the help of one GuitHub project.

Here we use Bitmap, Gesture, Matrix and other Bitmap Basic function. I have develop simply three classes.
main class is TouchImageView.java that is a Image-View.you can set this class Object anywhere

Make one project and use my classes

main class TouchImageView.java 

 package com.ahmad;  
 import android.content.Context;  
 import android.graphics.Bitmap;  
 import android.graphics.Matrix;  
 import android.graphics.PointF;  
 import android.util.FloatMath;  
 import android.util.Log;  
 import android.view.MotionEvent;  
 import android.view.View;  
 import android.widget.ImageView;  
 public class TouchImageView extends ImageView  
 {  
   private static final String TAG = "Touch";  
   Matrix matrix = new Matrix();  
   Matrix savedMatrix = new Matrix();  
   // We can be in one of these 3 states  
   static final int NONE = 0;  
   static final int DRAG = 1;  
   static final int ZOOM = 2;  
   int mode = NONE;  
   // Remember some things for zooming  
   PointF start = new PointF();  
   PointF mid = new PointF();  
   float oldDist = 1f;  
   Context context;  
   public TouchImageView(Context context)  
   {  
     super(context);  
     super.setClickable(true);  
     this.context = context;  
     matrix.setTranslate(1f, 1f);  
     setImageMatrix(matrix);  
     setScaleType(ScaleType.MATRIX);  
     setOnTouchListener(new OnTouchListener()  
     {  
       @Override  
       public boolean onTouch(View v, MotionEvent rawEvent)  
       {  
         WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);  
         // Dump touch event to log  
         // if (Viewer.isDebug == true)  
         {  
           // dumpEvent(event);  
           //  
         }  
         // Handle touch events here...  
         switch (event.getAction() & MotionEvent.ACTION_MASK)  
         {  
           case MotionEvent.ACTION_DOWN:  
           savedMatrix.set(matrix);  
           start.set(event.getX(), event.getY());  
           Log.d(TAG, "mode=DRAG");  
           mode = DRAG;  
           break;  
           case MotionEvent.ACTION_POINTER_DOWN:  
           oldDist = spacing(event);  
           Log.d(TAG, "oldDist=" + oldDist);  
           if (oldDist > 10f)  
           {  
             savedMatrix.set(matrix);  
             midPoint(mid, event);  
             mode = ZOOM;  
             Log.d(TAG, "mode=ZOOM");  
           }  
           break;  
           case MotionEvent.ACTION_UP:  
           int xDiff = (int) Math.abs(event.getX() - start.x);  
           int yDiff = (int) Math.abs(event.getY() - start.y);  
           if (xDiff < 8 && yDiff < 8)  
           {  
             performClick();  
           }  
           case MotionEvent.ACTION_POINTER_UP:  
           mode = NONE;  
           Log.d(TAG, "mode=NONE");  
           break;  
           case MotionEvent.ACTION_MOVE:  
           if (mode == DRAG)  
           {  
             // ...  
             matrix.set(savedMatrix);  
             matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);  
           }  
           else if (mode == ZOOM)  
           {  
             float newDist = spacing(event);  
             Log.d(TAG, "newDist=" + newDist);  
             if (newDist > 10f)  
             {  
               matrix.set(savedMatrix);  
               float scale = newDist / oldDist;  
               matrix.postScale(scale, scale, mid.x, mid.y);  
             }  
           }  
           break;  
         }  
         setImageMatrix(matrix);  
         return true; // indicate event was handled  
       }  
     }  
     );  
   }  
   public void setImage(Bitmap bm, int displayWidth, int displayHeight)  
   {  
     super.setImageBitmap(bm);  
     //Fit to screen.  
     float scale;  
     if ((displayHeight / bm.getHeight()) >= (displayWidth / bm.getWidth()))  
     {  
       scale = (float)displayWidth / (float)bm.getWidth();  
     }  
     else  
     {  
       scale = (float)displayHeight / (float)bm.getHeight();  
     }  
     savedMatrix.set(matrix);  
     matrix.set(savedMatrix);  
     matrix.postScale(scale, scale, mid.x, mid.y);  
     setImageMatrix(matrix);  
     // Center the image  
     float redundantYSpace = (float)displayHeight - (scale * (float)bm.getHeight()) ;  
     float redundantXSpace = (float)displayWidth - (scale * (float)bm.getWidth());  
     redundantYSpace /= (float)2;  
     redundantXSpace /= (float)2;  
     savedMatrix.set(matrix);  
     matrix.set(savedMatrix);  
     matrix.postTranslate(redundantXSpace, redundantYSpace);  
     setImageMatrix(matrix);  
   }  
   /** Show an event in the LogCat view, for debugging */  
   @SuppressWarnings("unused")  
   private void dumpEvent(WrapMotionEvent event)  
   {  
     String names[] =  
     {  
       "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",  
       "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?"  
     }  
     ;  
     StringBuilder sb = new StringBuilder();  
     int action = event.getAction();  
     int actionCode = action & MotionEvent.ACTION_MASK;  
     sb.append("event ACTION_").append(names[actionCode]);  
     if (actionCode == MotionEvent.ACTION_POINTER_DOWN  
     || actionCode == MotionEvent.ACTION_POINTER_UP)  
     {  
       sb.append("(pid ").append(  
       action >> MotionEvent.ACTION_POINTER_ID_SHIFT);  
       sb.append(")");  
     }  
     sb.append("[");  
     for (int i = 0; i < event.getPointerCount(); i++)  
     {  
       sb.append("#").append(i);  
       sb.append("(pid ").append(event.getPointerId(i));  
       sb.append(")=").append((int) event.getX(i));  
       sb.append(",").append((int) event.getY(i));  
       if (i + 1 < event.getPointerCount())  
       sb.append(";");  
     }  
     sb.append("]");  
     Log.d(TAG, sb.toString());  
   }  
   /** Determine the space between the first two fingers */  
   private float spacing(WrapMotionEvent event)  
   {  
     float x = event.getX(0) - event.getX(1);  
     float y = event.getY(0) - event.getY(1);  
     return FloatMath.sqrt(x * x + y * y);  
   }  
   /** Calculate the mid point of the first two fingers */  
   private void midPoint(PointF point, WrapMotionEvent event)  
   {  
     float x = event.getX(0) + event.getX(1);  
     float y = event.getY(0) + event.getY(1);  
     point.set(x / 2, y / 2);  
   }  
 }  

Saturday, 17 March 2012

How to convert string to bitmap and Bitmap to string


In android, Normally we send and receive data in the form of]string.So if we have image in the Bitmap form then we can not send it to server.So here i made a simple function that you need pass bitmap and it will return a string
     /**
       * @param bitmap
       * @return converting bitmap and return a string
       */
       public String BitMapToString(Bitmap bitmap){
            ByteArrayOutputStream baos=new  ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG,100, baos);
            byte [] b=baos.toByteArray();
            String temp=Base64.encodeToString(b, Base64.DEFAULT);
            return temp;
      }


Android News and source code