Sunday, November 22, 2009

Displaying Images from SD Card In Android - Part 2

In one of my previous posts, I wrote about how to fetch and display images from the SD card. The problem with the previous post is that one would have to wait until the first couple of images are available and shown on the screen. This implies that when the user wants to see the images, he will wait a couple of seconds until the first screen of images is available. The code that I'm going to post here works more like the Gallery application, meaning that one image at a time will be displayed on the screen. To achieve this effect, I used an AsyncTask, which fetches one image at a time in the background, and adds that image to the grid view during the progress update.

package blog.android.sdcard2;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.Display;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;

/**
 * Loads images from SD card. 
 * 
 * @author Mihai Fonoage
 *
 */
public class LoadImagesFromSDCardActivity extends Activity implements
OnItemClickListener {
    
    /**
     * Grid view holding the images.
     */
    private GridView sdcardImages;
    /**
     * Image adapter for the grid view.
     */
    private ImageAdapter imageAdapter;
    /**
     * Display used for getting the width of the screen. 
     */
    private Display display;

    /**
     * Creates the content view, sets up the grid, the adapter, and the click listener.
     * 
     * @see android.app.Activity#onCreate(android.os.Bundle)
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        // Request progress bar
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
        setContentView(R.layout.sdcard);

        display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

        setupViews();
        setProgressBarIndeterminateVisibility(true); 
        loadImages();
    }

    /**
     * Free up bitmap related resources.
     */
    protected void onDestroy() {
        super.onDestroy();
        final GridView grid = sdcardImages;
        final int count = grid.getChildCount();
        ImageView v = null;
        for (int i = 0; i < count; i++) {
            v = (ImageView) grid.getChildAt(i);
            ((BitmapDrawable) v.getDrawable()).setCallback(null);
        }
    }
    /**
     * Setup the grid view.
     */
    private void setupViews() {
        sdcardImages = (GridView) findViewById(R.id.sdcard);
        sdcardImages.setNumColumns(display.getWidth()/95);
        sdcardImages.setClipToPadding(false);
        sdcardImages.setOnItemClickListener(LoadImagesFromSDCardActivity.this);
        imageAdapter = new ImageAdapter(getApplicationContext()); 
        sdcardImages.setAdapter(imageAdapter);
    }
    /**
     * Load images.
     */
    private void loadImages() {
        final Object data = getLastNonConfigurationInstance();
        if (data == null) {
            new LoadImagesFromSDCard().execute();
        } else {
            final LoadedImage[] photos = (LoadedImage[]) data;
            if (photos.length == 0) {
                new LoadImagesFromSDCard().execute();
            }
            for (LoadedImage photo : photos) {
                addImage(photo);
            }
        }
    }
    /**
     * Add image(s) to the grid view adapter.
     * 
     * @param value Array of LoadedImages references
     */
    private void addImage(LoadedImage... value) {
        for (LoadedImage image : value) {
            imageAdapter.addPhoto(image);
            imageAdapter.notifyDataSetChanged();
        }
    }
    
    /**
     * Save bitmap images into a list and return that list. 
     * 
     * @see android.app.Activity#onRetainNonConfigurationInstance()
     */
    @Override
    public Object onRetainNonConfigurationInstance() {
        final GridView grid = sdcardImages;
        final int count = grid.getChildCount();
        final LoadedImage[] list = new LoadedImage[count];

        for (int i = 0; i < count; i++) {
            final ImageView v = (ImageView) grid.getChildAt(i);
            list[i] = new LoadedImage(((BitmapDrawable) v.getDrawable()).getBitmap());
        }

        return list;
    }
    /**
     * Async task for loading the images from the SD card. 
     * 
     * @author Mihai Fonoage
     *
     */
    class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> {
        
        /**
         * Load images from SD Card in the background, and display each image on the screen. 
         *  
         * @see android.os.AsyncTask#doInBackground(Params[])
         */
        @Override
        protected Object doInBackground(Object... params) {
            //setProgressBarIndeterminateVisibility(true); 
            Bitmap bitmap = null;
            Bitmap newBitmap = null;
            Uri uri = null;            

            // Set up an array of the Thumbnail Image ID column we want
            String[] projection = {MediaStore.Images.Thumbnails._ID};
            // Create the cursor pointing to the SDCard
            Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                    projection, // Which columns to return
                    null,       // Return all rows
                    null,       
                    null); 
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
            int size = cursor.getCount();
            // If size is 0, there are no images on the SD Card.
            if (size == 0) {
                //No Images available, post some message to the user
            }
            int imageID = 0;
            for (int i = 0; i < size; i++) {
                cursor.moveToPosition(i);
                imageID = cursor.getInt(columnIndex);
                uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID);
                try {
                    bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
                    if (bitmap != null) {
                        newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
                        bitmap.recycle();
                        if (newBitmap != null) {
                            publishProgress(new LoadedImage(newBitmap));
                        }
                    }
                } catch (IOException e) {
                    //Error fetching image, try to recover
                }
            }
            cursor.close();
            return null;
        }
        /**
         * Add a new LoadedImage in the images grid.
         *
         * @param value The image.
         */
        @Override
        public void onProgressUpdate(LoadedImage... value) {
            addImage(value);
        }
        /**
         * Set the visibility of the progress bar to false.
         * 
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(Object result) {
            setProgressBarIndeterminateVisibility(false);
        }
    }

    /**
     * Adapter for our image files. 
     * 
     * @author Mihai Fonoage
     *
     */
    class ImageAdapter extends BaseAdapter {

        private Context mContext; 
        private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();

        public ImageAdapter(Context context) { 
            mContext = context; 
        } 

        public void addPhoto(LoadedImage photo) { 
            photos.add(photo); 
        } 

        public int getCount() { 
            return photos.size(); 
        } 

        public Object getItem(int position) { 
            return photos.get(position); 
        } 

        public long getItemId(int position) { 
            return position; 
        } 

        public View getView(int position, View convertView, ViewGroup parent) { 
            final ImageView imageView; 
            if (convertView == null) { 
                imageView = new ImageView(mContext); 
            } else { 
                imageView = (ImageView) convertView; 
            } 
            imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
            imageView.setPadding(8, 8, 8, 8);
            imageView.setImageBitmap(photos.get(position).getBitmap());
            return imageView; 
        } 
    }

    /**
     * A LoadedImage contains the Bitmap loaded for the image.
     */
    private static class LoadedImage {
        Bitmap mBitmap;

        LoadedImage(Bitmap bitmap) {
            mBitmap = bitmap;
        }

        public Bitmap getBitmap() {
            return mBitmap;
        }
    }
    /**
     * When an image is clicked, load that image as a puzzle. 
     */
    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {        
        int columnIndex = 0;
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery( MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
                projection,
                null, 
                null, 
                null);
        if (cursor != null) {
            columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToPosition(position);
            String imagePath = cursor.getString(columnIndex); 

            FileInputStream is = null;
            BufferedInputStream bis = null;
            try {
                is = new FileInputStream(new File(imagePath));
                bis = new BufferedInputStream(is);
                Bitmap bitmap = BitmapFactory.decodeStream(bis);
                Bitmap useThisBitmap = Bitmap.createScaledBitmap(bitmap, parent.getWidth(), parent.getHeight(), true);
                bitmap.recycle();
                //Display bitmap (useThisBitmap)
            } 
            catch (Exception e) {
                //Try to recover
            }
            finally {
                try {
                    if (bis != null) {
                        bis.close();
                    }
                    if (is != null) {
                        is.close();
                    }
                    cursor.close();
                    projection = null;
                } catch (Exception e) {
                }
            }
        }
    }

}

The sdcard.xml file:

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    
    <GridView  
        android:id="@+id/sdcard"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:verticalSpacing="10dp"
        android:horizontalSpacing="10dp" 
        android:stretchMode="columnWidth"
        android:gravity="center" />
        
</FrameLayout>    

That's it. Let me know if you have any questions.

Enjoy!

220 comments:

1 – 200 of 220   Newer›   Newest»
Jason said...

Hi Mihai,

Can you show me an example of how you would obtain the URI for the image that is selected?

Mihai Fonoage said...

You already have the path to that image in the imagePath variable. Just use a URI constructor that takes a strings as its input and you should be all set.

surya's said...

Hi Mihai,
I have written similar program to show the images(but not thumbnails) from sdcard in emulator, it works fine in emulator but on G1 device, it shows the java.lang.OutOfMemoryError can you guess the problem, and above your program does not show anything when I clicked on image even I have written code to show the image in dialog box

Mihai Fonoage said...

Hi surya's,

My program does not display the image you clicked on. You have to use the scaled bitmap I create from the image that was clicked on(referenced by useThisBitmap) and display it in an image view or something similar.

Regarding your problem, most probably the error results from trying to load a to big of an image. Try scaling the image, or, when decoding the stream, use the BitmapFactory.Options class and set the inSampleSize to some power of 2. Do a search on this on Android Forums and you will get many many similar answers that will help.

surya's said...

Mihai,Thank you

喵喵 said...

hello

I would like to ask

why the following codes
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(8, 8, 8, 8);
imageView.setImageBitmap(photos.get(position).getBitmap());
return imageView;


need to be placed out of the if case block



i tried to move them inside
if (convertView == null) {

}

the outcome is that all the bitmap drawn are the same as the first images of the cursor

Mihai Fonoage said...

The idea here is that you want to reuse the ImageView as much as possible to save memory. Once you have the ImageView (a new one for the first image, or a reused one for the rest of the images), you just need to add the new bitmap to it and return it, which will then be displayed in the grid you previously created.

kadir Gönül said...

What about reading pictures from a specific folder. e.g Can we read images from "sdcard/myPictures". Thanks for the post. It works fine.

Mihai Fonoage said...

Sure you can, but you would need to use something different than a Cursor, something like creating a file to that directory, using listFiles method to get an array of files from that directory, and then go through each of them, get an input stream, and create your Bitmap.

kadir Gönül said...

Mihai thank you for your quick response. I have developed application as you pointed out but it crashes sometimes on start, not always. I have used AsyncTask as you wrote, while reading pictures from specific folder. I suppose you have seen such an error. Do you have any idea which event triggers app crash on start. Thank you again.

Mihai Fonoage said...

Actually, I am using the method mentioned and it did not crash on me yet. You have to be more specific on what error you get. Look into LogCat and see what error messages you get. The code that I use is similar to the one below:
File imagesDir = new File(Environment.getExternalStorageDirectory().toString() + "/YOUR_DIRECTORY");
imageList = imagesDir.listFiles();
for (File image : imageList)
try {
bitmap = BitmapFactory.decodeStream(image.toURL().openStream());
//use bitmap and recycle afterwards
} catch (IOException e) {
e.printStackTrace();
}

kadir Gönül said...
This comment has been removed by the author.
kadir Gönül said...

Mihai, i found the error.
setProgressBarIndeterminateVisibility(true);

This function execution must be on UI side. Which means you can not call it in doInBackground. I have placed it just before loadImages() and it solved my issues. Now i am able to debug on emulator and run program on horizontal layout.

One more thing is that why you have called grid.getChildCount(); instead of grid.getCount(); at onRetainNonConfigurationInstance. If you flip screen from vertical layout to horizontal layout then some of the pictures will be missed.

Mihai Fonoage said...

You are right, there is no reason not to call getCount instead of getChildCount, since all children views (not only the visible ones) should be "freed". Thanks for pointing that out.

Anonymous said...

Could you please elaborate more on how to display pics from a specific folder on the SDCard? Thanks!

Mihai Fonoage said...

Use something like
File imagesDir = new File(Environment.getExternalStorageDirectory().toString() + "/pathToDirectory");
File[] imageList = imagesDir.listFiles();
for (File imagePath : imageList) {
bitmap = BitmapFactory.decodeStream(imagePath.toURL().openStream());
}

Anonymous said...

How will the list of images (bitmap) be then integrated with the galleryview? I am sorry if this is a newbie question. I was not able to find this information online.

Anonymous said...

To clarify further, I am interested in retrieving the name of the file once the gallery view displays images from a specific folder. Thanks!

Anonymous said...

Please ignore my previous comments. I actually got a version to work based on your previous reply!

Here are my changes:

File imagesDir = new File(Environment.getExternalStorageDirectory().toString() + "/mydir");
imageList = imagesDir.listFiles();

In onItemClick (to get the
selected file path):
-----------------------
String imagePath = imageList[position].getAbsolutePath();

In ImageAdapter:getView:
-----------------------
imageView.setImageBitmap(BitmapFactory.decodeStream(imageList[position].toURL().openStream()) );

Is this the ideal way or am I missing out on any optimizations?

Unknown said...

Hi Mihai,

I am using your code imagesload from sdcard ...its working fine
Thanks.....but if i am using in gallery and grid view at a time then generate run time exception outofmemory and Async threadPoolExecutor ...so how can I solve this issue ???can you guide me please ...thanks

RO_manuV said...

Hello Mihai,

My goal is to post on FaceBook an image picked from the sdcard.

To connect to FaceBook I use this code an I try to send the chosen image like in their example, passing as image source the URI of my picture.

Using your code, I get the uri ("content://media/external/images/thumbnails") and the imagePath ("/sdcard/DCIM/.thumbnails/1273763440079.jpg"), which I tried to pass as image source.

I also tried to use Uri.parse("file://"+ imagePath), resulting in "file:///sdcard/DCIM/.thumbnails/1273763440079.jpg".

As a last attempt, I passed even "file:///sdcard/myImage.jpg"

Well, none of the above works and I don't have any idea what I should do.

Please, could you give me a piece of advice?


Thank you a lot, I am very gratefull for any hint.

Sameer said...

Hi Mihai,

Great source code. I need one help on showing html file from SD card. I have a html files stored on SD card and simply want to show on view or Browser. Could you please help me.

Randika said...

hi Mihai,

this works fine, so could please tell me how to load videos as well as audio files

regards,
MIke

sumit saxena said...

very good work ......

i used this code for image viewer and now i try to send selected image to picasa via email so i need to open email activity with selected image as attachment ,i try lot but it not done ,can you help me on that ....i share my code

public void onItemClick(AdapterView parent, View v, int position, long id) {

int columnIndex = 0;
int position =0;
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,null,null, null);
if (cursor != null)
{ columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToPosition(position);
String imagePath = cursor.getString(columnIndex);
final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("jpeg/image");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{picasa_id+"."+secret_word+"@picasaweb.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, album_name);
emailIntent.putExtra(android.content.Intent.EXTRA_STREAM,Uri.parse(imagePath));
Toast.makeText(this, "please atteched the image file", 10000).show();
this.startActivity(Intent.createChooser(emailIntent, "Send mail..."));
finish();
}

this code work fine but when i send that mail to picasa a a diffent image is display .......or null image in place of selected image?


thanx ....
sumit

amihud said...

Thank for the code
it's working fine.
When i try to add a function that include
Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);

it crash , this function work fine
in other application

do you have ant idea why the cursor crash ?

Unknown said...

Hi Mihai,

I am working on an application which require
1. select an image folder
2. display the images in the folder in a GridView.

I am wondering, if you know of any example of Gallery for folder selection?

amihud said...

to use the sdcard you can do it like this change sSDcardLooky
to your folder

protected Object doInBackground(Object... params) {
setProgressBarIndeterminateVisibility(true);
Bitmap bitmap = null;
Bitmap newBitmap = null;
Uri uri = null;
imageList.clear();
if(imageList.size()==0){
boolean exists = (new File(sSDcardLooky)).exists();
if (exists)
{ // File or directory exists }
//Toast.makeText(this, "exist", Toast.LENGTH_SHORT).show();
}
else { // File or directory does not exist }

//Toast.makeText(this, "not exist", Toast.LENGTH_SHORT).show();
}

// Search sdcard/image catalog picture file , As the gallery source ,
File sdcard=new File(sSDcardLooky);
//Log.d(TAG,"Gallery1.sdcard."+sdcard.getName());
File[] imageFiles=sdcard.listFiles(new FileFilter(){

public boolean accept(File arg0){
String fileName=arg0.getName();
String ex=arg0.getName().substring(fileName.lastIndexOf(".")+1,fileName.length()).toLowerCase();
if(ex==null||ex.length()==0){
return false;
}else{
if(ex.equals("jpg")||ex.equals("bmp")||ex.equals("png")||ex.equals("gif")){
return true;
}
return false;
}

}
});


for(int i=0 ; i<imageFiles.length ; i++){
File file=imageFiles[i];
//Log.d(TAG,"Gallery1.file abs Path."+file.getAbsolutePath()+" path."+file.getPath());
// vViewPic(imageFiles[i].getName());
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());

if (bitmap != null) {
newBitmap =
Bitmap.createScaledBitmap(bitmap, 70, 70, true);
bitmap.recycle();
if (newBitmap != null) {
publishProgress(new LoadedImage(newBitmap));
}
}

//imageList.add(BitmapFactory.decodeFile(file.getAbsolutePath()));
//sf = file.getAbsolutePath();
//Toast.makeText(this, sf, Toast.LENGTH_SHORT).show();
//vViewPic("file://"+sf);
}


}
return null;
}

Unknown said...

Hi Mihai:

GREAT WORK!!!!!
Your code helped me a lot!

Thank you!!

Tee said...

correct me if I'm wrong but you are caching all images that are displayed in the gridview ? so if there are 500 images in scard you cached those 500 images in the ArrayList, right ?

If that is the case then isn't that problem, the phone will run out of memory ?

Mihai Fonoage said...

Yes I am, but it is a scaled version of the initial image, not the actual image. And if there is no more memory and the Activity gets destroyed, I free up the resources related to each bitmap. In the future, I could probably only cache the images that are currently visible on the screen, do some lazy initialization, and reuse the bitmaps that are no longer visible, something similar to how a UITableViewCell is reused on the iPhone.

Tee said...

Can you write pseudo-code of the idea that you mentioned ?

Thanks

Anonymous said...

Hey there... I've seen alot of posts on how to utilize your code with a specific directory, but am having a hard time actually implementing the change. Could you help? However, thanks again for the great post. This method is lightning fast!

Anonymous said...

Hi Mihai,

The code from part 1 worked, although it is not displaying all the images.

In this part 2 code, it is giving an exception while in doInBackground().
Here is the message:
"android.View.viewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views."

What can I do to correct it? I don't see any explicit thread creation anywhere.

Anonymous said...

Hi Mihai,

I corrected my previous problem.
Anyway, I want to enhance this code by making it like the Media Gallery. I want to put a checkmark on the photo, when it is touched. Basically, a Select Image feature. How do I do that?
I created a new GridView above the existing one, which takes in the Bitmap of the selected image, but I unable to refresh the screen. Besides, that can be too costly.
Can you help me, please?

Tom said...

Need remove the line 157 - setProgressBarIndeterminateVisibility(true); - , which is throwing an exception. And then it works really nice!

Mihai Fonoage said...

@Tom and @c group - Thanks for the setProgressBarIndeterminateVisibility(true); issue, I made the suggested changes.

Anonymous said...

Hi Mihai,
I couldn't find any contact information on the blog, I made an app using some part of it and I would like to thank you for sharing it!!!

Francisco said...

Hi Mihai I'm working on an image manipulation framework and was using some other method to bring out thumbnails. I wanted to thank you because the method you're using with AsyncTask is superior and I will incorporate it in the framework.
I'm also using the MediaScannerConnection to solve the issue with thumbnail creation of new images on the SDCARD and it works pretty well. Here's the function I created for that:

private void scanMedia(){
String[] sdFiles=null;
File sdPath = Environment.getExternalStorageDirectory();

File[] sdImageArray = sdPath.listFiles(new FilenameFilter(){
@Override
public boolean accept(File dir, String name)
{
return ((name.endsWith(".jpg"))||(name.endsWith(".png")));
}
});
sdFiles = new String[sdImageArray.length];

for(int i= 0 ; i< sdImageArray.length; i++)
{
sdFiles[i] = sdImageArray[i].getAbsolutePath();
}
MediaScannerConnection.scanFile(this, sdFiles, null, null);
}

It should create an array of paths to all the images and make the MediaScannerConnection generate thumbnails for the new ones that haven't been added, solving the thumbnail generation issue.

Thanks again,
Francisco J. Consuegra

Mihai Fonoage said...

Hi Francisco. I'm glad you decided to continue working on the framework. Thanks for the code also; an alternative would be calling the compress method from the Bitmap class to create a 'thumbnail' image on the SD card.

Girish Gaitonde said...

Hi Sir,

It was wonderful piece of code, both part 1 and part 2. Thanks for sharing.

But i have some different requiremnet.
I have went through couple of forums but everybody are showing to display images from SD card.

My app requires that i click on a link,which has 'n' number of photos,and populate all the photos, in a grid view.


I am stuck , can you pls provide any help.

Anonymous said...

Excellent article. Helped me clarify some issues with a project I am researching.

BTW, check out our blog at : http://appfulcrum.com/?page_id=153

Kevin Tan said...

You got this code sample on Github or Google Code? I wanna try it out.

Unknown said...

I cant see the progress bar.
Is it supposed to be so?

I want to have progress bar until all the images be loaded. because if you click on an image or press back button anytime before all the images become loaded, it throws exception.

thank you,
it was nice article.

Unknown said...

I cant see the progress bar.
Is it supposed to be so?

I want to have progress bar until all the images be loaded. because if you click on an image or press back button anytime before all the images become loaded, it throws exception.

thank you,
it was nice article.

Unknown said...

I cant see the progress bar.
Is it supposed to be so?

I want to have progress bar until all the images be loaded. because if you click on an image or press back button anytime before all the images become loaded, it throws exception.

thank you,
it was nice article.

Anonymous said...

Awesome Link........ Very helpful.... Thanks a lot for sharing it... :)

Anonymous said...

For some reason I had to add a button at the end of sdcard.xml. Otherwise the call
setContentView(R.layout.sdcard);

would fail.

Vinod said...

Hi Mihai,
Thanks for the post. It works fine. When orientation of phone changes during loading of images the application crashes due to

java.lang.RuntimeException: An error occured while executing doInBackground()

Could you Please help me

Anonymous said...

Hi,

hey i want to display the image selected from sd card into email body and not as an attachment. i tried lots of code still i am not able to solve the problem....if you hav solution plz help me...
Thank you in anticipation

mehdok said...

hi every boy ,
i am using ListActivity for my VIEW and extends ArrayAdapter to inflate rows,
for each row i need thumbnail, i using some part of MIHAI code but i got the wrong thumbnail
i using below code :

public View getView(int position, View convertView, ViewGroup parent)
{
.
.
.
.
.
Long Imageid = getItemId(position);
Uri imageUri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageId);
try
{
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
if(bitmap != null)
{
Bitmap newBitmap = Bitmap.createScaledBitmap(bitmap, width, width, true);
bitmap.recycle();
icon = newBitmap;
}
else
icon = null;
}
catch(IOException e)
{

}
}

any help ?

zio said...

great job mihai!

praveen said...

Hi Mihai,

iam very much beginner in android. can u tell me that how to create folders in sdcard.and storing the camera pictures in the folder which i am created.and too i want create the folder it should want to dynamic.

Unknown said...

Hi

I have used this code without following code

File imagesDir = new File(Environment.getExternalStorageDirectory().toString() + "/pathToDirectory");
File[] imageList = imagesDir.listFiles();
for (File imagePath : imageList) {
bitmap = BitmapFactory.decodeStream(imagePath.toURL().openStream());
}

But no images are getting loaded.

Can yo please help me?

Unknown said...

Hi

I have used this code WITH following code

< sorry for the last post..it was by mistake>

I have used BELOW code

File imagesDir = new File(Environment.getExternalStorageDirectory().toString() + "/pathToDirectory");
File[] imageList = imagesDir.listFiles();
for (File imagePath : imageList) {
bitmap = BitmapFactory.decodeStream(imagePath.toURL().openStream());
}

But no images are getting loaded.

Can yo please help me?

Anonymous said...

Hi ,
This code helped me a lot .But I am facing a small problem . I am getting duplicate images while displaying the images but when i checked in SD card only one image is stored . Can you pls help me how to retrieve only original image and remove this duplicacy .
Thank You

Anonymous said...

The code crashes if you click GO-BACK button meanwhile the images are appearing on the phone

Could you point some hints howto solve this situation ?

Thanks in advance

Khoi Nguyen said...

Hi,

I'm new comer in Android, I copy your code and build but it shows error, and when I debug, it fails in function setupViews(): sdcardImages = (GridView) FindViewById(R.id.sdcard);

Please help me, how can I fixed that. I'm using android API 2.2 and run on Desire.

Thanks
Nguyen

fgomiero said...

Hi Mihai, thanks for your code.
I have a question, I would load many images in async way in a gridview, but for every image I have three TextView related.
How can I load images? Images's uri and text of TextView are retrived from content provider.

Motki said...

Great tutorial.
But I have a problem, when I flip the screen (from horinzontal to vertical por example),
I lost the position of my pictures...
So when I click in one of them, the position return null and the aplication return error..
How Can I store the pictures position ?

This is my function that return null when I flip the screen :
public void onItemClick(AdapterView parent, View v, int position, long id) {
Toast.makeText(AsynImagesSDCARDActivity.this, "" + item.get(Integer.toString(position)), Toast.LENGTH_SHORT).show();
}

motki said...

As c.groud said getChildCount() only show the pictures that are shown in the screen...
I change this for grid.getCount(); but I get an error in this line
final ImageView v = (ImageView) grid.getChildAt(i);
because only is recognized the pictures shown in the srcreen and I obtain null values..
How Can I change this line to obtain all the images ??
Thank you!!

Mike said...

imageAdapter.addPhoto(image);
imageAdapter.notifyDataSetChanged();

I used very similar code as yours for an application I have. It allows you to select an item in a listview. The two lines above get called per image on the main thread. As a result selecting an image is often blocked out until they are done loading. I haven't found a fix to this yet. Any ideas?

Mike said...
This comment has been removed by the author.
Manuel007 said...

Hi Mihai,
first of all, thanks for the tutorials. really helpful. but i don't know if its only me but the code seem to run slow and scrolling is jerky too. i only changed for MediaStore.Images.Media.EXTERNAL_CONTENT_URI since some htc phones with senseUI have an issue with thumbnails and have used bitmap options to reduce size but still very slow. Have any idea on why this could be happening. Once again, Thanks for the tutorials.

Thanuja Samarawickrama said...

hi,i got error after running the code.please help me to fix this

11-24 12:31:30.251: W/dalvikvm(610): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
11-24 12:31:30.351: E/AndroidRuntime(610): FATAL EXCEPTION: AsyncTask #1
11-24 12:31:30.351: E/AndroidRuntime(610): java.lang.RuntimeException: An error occured while executing doInBackground()
11-24 12:31:30.351: E/AndroidRuntime(610): at android.os.AsyncTask$3.done(AsyncTask.java:200)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.lang.Thread.run(Thread.java:1096)
11-24 12:31:30.351: E/AndroidRuntime(610): Caused by: java.lang.NullPointerException
11-24 12:31:30.351: E/AndroidRuntime(610): at MihaiBlog.com.MihaiBlogActivity$LoadImagesFromSDCard.doInBackground(MihaiBlogActivity.java:170)
11-24 12:31:30.351: E/AndroidRuntime(610): at android.os.AsyncTask$2.call(AsyncTask.java:185)
11-24 12:31:30.351: E/AndroidRuntime(610): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-24 12:31:30.351: E/AndroidRuntime(610): ... 4 more

Anonymous said...

hi mihai

i just run your code and get the following error


11-28 12:56:48.571: ERROR/AndroidRuntime(200): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception
11-28 12:56:48.641: ERROR/AndroidRuntime(200): java.lang.RuntimeException: An error occured while executing doInBackground()
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at android.os.AsyncTask$3.done(AsyncTask.java:200)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.lang.Thread.run(Thread.java:1096)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): Caused by: java.lang.NullPointerException
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at com.cls.load.LoadImagesFromSDCardActivity$LoadImagesFromSDCard.doInBackground(LoadImagesFromSDCardActivity.java:180)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at android.os.AsyncTask$2.call(AsyncTask.java:185)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-28 12:56:48.641: ERROR/AndroidRuntime(200): ... 4 more



Error belongs to the line

int columnIndex = cursor .getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);

Anonymous said...

Hi mihai
Thanks for the tutorial
i just change the _ID to IMAGE_ID in the query and it run fine.
Here is one thing very strange for me that i have a image of size of 3mb in sdcard. This program did not load that image at all. Is there any kind of memory check before loading the image.

I want to load that big image on the click.

Anonymous said...
This comment has been removed by the author.
Marius said...

Salutare, mersi mult de idee,mi-ai lamurit foarte bine cateva aspecte cu articolul asta!

Jade Byfield said...
This comment has been removed by the author.
Jade Byfield said...
This comment has been removed by the author.
Jade Byfield said...

Hello Mihai, I've been follow your blog for a while man, nice work. My question is that I'm using some of your code to load some images from the user's phone in a gridview as you did above. But can you give an example of how to use the imagePath member? I need to get the path to the fullsized image in the MediaStore based on that imagePath member or some other method, any guidance on this issue?

Jade Byfield said...
This comment has been removed by the author.
Unknown said...

how can i zoom in the images ?

Anonymous said...

This code is really inefficient. You are generating two bitmaps and one is rescaled first in the generation and the second one in the view. Come on! The thumbnail has already been generated by the android system (be it gallery or whatever), just pick it up :

bitmap = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),imageID,MediaStore.Images.Thumbnails.MICRO_KIND,
(BitmapFactory.Options) null);


There are two types of thumbnails available:
MINI_KIND: 512 x 384 thumbnail
MICRO_KIND: 96 x 96 thumbnail

Unknown said...

hai mihai,
i have one problem please clarify, i need to get the image from sdcard and create animation frame using that image. i post my code please clear the error or post your own logic code. please friend clear my doubt


my java code:


import java.io.File;
import java.util.ArrayList;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.AnimationDrawable;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ImageView;

public class FixActivity extends Activity {
/** Called when the activity is first created. */


ImageView image1;
AnimationDrawable animate;
BitmapDrawable bit1,bit2,bit3,bit4;
ArrayList bitmapArray;
File file;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
file = new File(Environment.getExternalStorageDirectory()+"/Pictures/img");
File imageList[] = file.listFiles();
image1=(ImageView)findViewById(R.id.imageView1);
for(int i=0;i();
bitmapArray.add(b);
}
bit1 =new BitmapDrawable(getResources(), bitmapArray.get(0));
bit2 =new BitmapDrawable(getResources(), bitmapArray.get(1));
bit3 =new BitmapDrawable(getResources(), bitmapArray.get(2));
bit4 =new BitmapDrawable(getResources(), bitmapArray.get(3));
int duration1=300;
animate=new AnimationDrawable();
animate.addFrame(bit1, duration1);
animate.addFrame(bit2, duration1);
animate.addFrame(bit3, duration1);
animate.addFrame(bit4, duration1);
animate.setOneShot(true);
image1.setBackgroundDrawable(animate);
animate.setVisible(true, false);
animate.start();

}
}

Unknown said...

Mihai Fonoage, Thanks a lot bro...
I modified your code littele bit. coz its not reading the sd card images when i run this code in Tablet.

String[] projection = {"*"};
Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI
, projection, null, null, null);

int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);
int size = cursor.getCount();
Log.d("Cursor size=",""+size);
if (size == 0) {
}

int imageID = 0;
for (int i = 0; i < size; i++) {
cursor.moveToPosition(i);
imageID = cursor.getInt(columnIndex);
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
bitmap = BitmapFactory.decodeFile(path);
if (bitmap != null) {
newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
bitmap.recycle();
if (newBitmap != null) {
publishProgress(new LoadedImage(newBitmap));
}
}
}

cursor.close();
return null;
}


HELP:
you are reducing the clarity of the image and putting into the grid. when i click on the image can i view that image in some style with zoom and clarity?

Unknown said...

Hi! Great tutorial! I now know much more than early =)
but 1 thing already is deprecated: display.getWidth()/95;
And I think you know what now to get width you need to use "DisplayMetrics"
Thank you anyway.

Unknown said...

Hi, Can you Please tell how can I used lastModified() function in it,

I have to get photos I clicked on a particular date,,

But my code is not working

for (int i = 0; i < size; i++)
{
cursor.moveToPosition(i);
imageID = cursor.getInt(columnIndex);

String imagePath = cursor.getString(columnIndex);
File file = new File(imagePath);
Date lastModDate = new Date(file.lastModified());
System.out.println("Today is " + lastModDate );
Date today= new Date();
int results = today.compareTo(lastModDate);
uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID);
if(results==-1)
{
try
{
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
if (bitmap != null)
{
newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true);
bitmap.recycle();
if (newBitmap != null)
{
publishProgress(new LoadedImage(newBitmap));
}
}
}
catch (IOException e)
{
//Error fetching image, try to recover
}
}
}
cursor.close();
return null;
}

Unknown said...

Hi there,

I would be interested in learning more about how to utilize this process in conjunction with our software for data center infrastructure software.

kaustubh patil said...

Mihai Fonoage,you really did gud job.
I use this in my proj bt i have one problem i use onclicklistner in getview when user click on image it works only after all images get load bt i want it work when we adding images too so please help me thanks in advance

Android App Development said...

This is good job to explain this kind of information through this blog that help me to display images from SD card in Android-part-2.

Kimberly said...

Dear Mr. Mihai,

I did like your post, but no image display, why that?
I put image into sdCard already.

Anonymous said...

Display image in GridView

Unknown said...

Hi Mihai let me congratulate you for this post that you have done...
I realize something extrange when i test this code in the emulator I click one image and show it in a imageView and it works fine, but when I test the same code in my tablet device it never loads the first image an seems like the id is not well attached to each path because if i select the image id=0 it shows me a diferent image of the sdcard in my imageView
Can you help me about this strange question?

Sumeet Raj said...

how to load images from particular folder with thumbnail?? any help?

JASSI said...

hello Guys,
i want to build an application in which we can display the images in gridview but only that images which are being captured by us through the camera of application not from gallery or external camera.
i am keeping the images in external storage with .(dot) extension so that it is not visible in file manager.
please help me !

Unknown said...

Your Post is so helpful for apps developers to learn new things in the development field.

Unknown said...

"expressnews, Blogpost, i like it"!!


mobile app development for android

Jim Sanders said...

This is a great post. So clear and easy to follow. Thanks for the tangible and attainable help. All your hard work is much appreciated.

Unknown said...

We are a mobile app development agency base in San Francisco https://citrusbits.com/mobile-apps

Lawrence said...

Thanks Mihai. Great post. Have read your previous post and this is a good follow up. Will try out these and am hopeful it will work fine. Thanks for the post again. Keep posting. Android application development company in Bangalore

Roger Flopple said...

I am interested in retrieving the name of the file once the gallery view displays images from a specific folder, and also Your Post is so helpful for android development company to learn new things in the development field

Unknown said...

I personally feel this is Good Blog



India's One of The Best Online Mobile Recharge Software Development Company, Using Our All in One Mobile Recharge Software You Can Recharge All India Operator via Single SIM Card. Free Distributor or Retailer ID. B2B or B2C Multi Recharge or Domestic Money Transfer Software Provider in India.
Bulk SMS Provider in India, Promotional Bulk SMS Provider

pooja said...

Excellent information.
it's work great. Thanks for sharing.

swati parmar said...

Today I was my first visit to your blog, following a search I did on the top blogs. I really like it a lot.thanks for sharing awesome information. Good, keep up.

I’m glad you’re leaving behind a plethora of helpful information that I can’t wait to read during my mid-sessional break.

Thanks for the sacrifice you’ve here and I wish you the best your soul desires.

Bharat Go Digital said...

"Bharat Go Digital is a Startup India Blog which is also a free press release site in India.
Also read how to register company in Indiaon Bharat Go Digital."

Best Digital Marketing Agency said...

Great Post Thanks For Sharing and it is very helpful. And You can also Check Here Software Development Company India

Mohit Kumar said...

Very Nice Post. Thanks for sharing with us. Keep it up. And You can also Check here seo company India

Anonymous said...
This comment has been removed by the author.
Mobile App Development Company said...

Very well said Thank You for the amazing post!

Virtual Reality Shopping - Centaur Interactive, said...

Thanks for sharing the valuable information.... It was very useful for me.
Android game development company

Danishsingh said...

Nice Blog Thanks for Sharing.
marketing automation tools india
b2b data companies
B2B Data

Cassandra Jones said...

Thanks for the information. It's very useful. If any one is looking for the best piano teacher in Singapore, check out Adeline Piano Studio, perfect destination for private piano lessons for kids & adults in Singapore.

piano lesson for kids
piano classes for kids
piano lessons for adults singapore
home piano lessons singapore

digital marketing company said...

Good content,keep sharing. Uniqwebtech, Top digital marketing company try our online marketing services including Search Engine Optimization, Social Media, PPC services and Web development services.

Free ebook for mobile app development said...

This is a great post. So clear and easy to follow. Thanks for the tangible and attainable help. All your hard work is much appreciated.
Augmented reality App company

Find Content writers said...

Thanks for sharing information I must say very informative blog post. Keep it up!!

Eye Health said...

Your Post is so helpful for apps developers to learn new things in the development field.

ebook conversion said...

Promote your ebooks through our kindle eBook Promotion and marketing Services. We will help you promote your eBook and help you with marketing it to your potential users.

Anonymous said...
This comment has been removed by the author.
steve said...

Best Web design and development service company in toronto
Top website design company in brampton
Developing from a group of specialists to an undeniable top SEO office in Canada, we have confidence in persistently redesigning ourselves with the goal that we can offer the most recent types of assistance to our customers. At the point when google changes their calculation in the computerized world, we are the first to react, adjust, and change SEO methodology so your site stays at the top query output.

Fuel Digital Marketing said...

very nice blog.We know how that feels as our clients always find themselves to be the top rankers. Its really easy when you consult that best SEO company in Chennai.

best seo company in chennai|expert seo company in chennai|best seo analytics in chennai|seo specialist companies in chennai|top 10 search engine optimisation service providers in chennai



Anonymous said...

great blog article. thanks for sharing.keep posting like this.Escape your daily routine at the best Massage centre in Coimbatore. Family Friendly with lovely amenities and friendly staff. Book your Spa Massage today.

massage in coimbatore | body massage coimbatore | massage spa in coimbatore | body massage center in coimbatore | massage centre in chennai | body massage in chennai | massage spa in chennai | body massage centre in chennai | full body massage in chennai | chennai massage centre address

Rishikant Prakash said...

Thanks for publishing this amazing article. I really big fan of this post thanks a lot. Recently i have learned about Civil ID Renew which gives a lot of information to us.

Visit them and thanks again and also keep it up...

mobileappdevelopment said...

Thanks for sharing such a nice information and it is really useful


Digital Transformation in Education industry

shanumathur001 said...

Thanks for share this list. I would like to add one more name to the top taxi booking app development company. its System Logic Solution. they provide a fully advanced taxi app.

Anonymous said...

https://granite.phys.s.u-tokyo.ac.jp/trac/Lab/ticket/8#comment:98

ratan said...

Hello guys,
I Read your blog and I found it is very good. There is a lot of good information on this blog, I'd like to Share and I think people will get a lot of support from this blog. Thanks for sharing this informative blog, please keep up and share some unique posts with us in the future.
Digital Marketing Company in Jaipur
Digital Marketing agency In Jaipur
seo company In Jaipur

Ridhi aggarwal said...

Nice article for getting good knowledge, hope people are liking it for their personal as well as professional welfare. Writing about a topic isn't easy, It took dedication and skills to write something good anout anything. In the meantime, do check out our website for enhancing your digital marketing skills and business productivity.
digital marketing company in Jaipur
PPC company in Jaipur
social media marketing company in Jaipur
content writers in Jaipur
website development company in Jaipur

Anonymous said...

Nice article for getting good knowledge, hope people are liking it for their personal as well as professional welfare. Writing about a topic isn't easy, It took dedication and skills to write something good anout anything. In the meantime, do check out our website for enhancing your digital marketing skills and business productivity.
digital marketing company in Jaipur
PPC company in Jaipur
social media marketing company in Jaipur
content writers in Jaipur
website development company in Jaipur

Unknown said...

Hii, i came across this blog while random browing and found great content. Such information adds up new things in the memory for staying updated in this society. If you also want to visit some good web pages then do check out our website https://digiroads.in for more offers and discounts on digital marketing services.
digital marketing company in Jaipur
PPC company in Jaipur
seo company in Jaipur
social media marketing company in Jaipur
content writers in Jaipur
website development company in Jaipur

Anonymous said...
This comment has been removed by the author.
Ridhi aggarwal said...

Great content for satisfying your daily reading addiction. Such blogs provides indepth information about the latest trends and others for enhancing the knowledge of people. Do check out these amazing websites
digital marketing company in Jaipur
PPC company in Jaipur
seo company in Jaipur
social media marketing company in Jaipur
content writers in Jaipur
website development company in Jaipur
mobile app development companies in Bangalore

Wismarketing said...

Great Post Thanks For Sharing With Us. Not sure which digital marketing strategies are right for your business? Find out in our breakdown of this year's best Internet marketing strategies! Boost your Business online with our best digital marketing courses in thailand. We provide SEO, PPC advertising and marketing courses to boost your online growth and achieve your success. Call us to Book Now - +66 64 942 2452 or visit - Digital Marketing Training In Thailand|{Digital Marketing Courses In Thailand}

mobileappdevelopment said...

I really appreciate your post & really it is excellent. Looking to read some more posts from your blog
Mobile App Development Company in India
Mobile App Development Company in bangalore
Mobile App Development Company in chennai
Mobile App Development Company in kolkata

davidharper said...

Really great thoughtful Information Hire android app developers

Anonymous said...

Hi, I Read your blog and I feel it is a very wonderful, informative blog . There are a lot of good information on this blog, I'd like to Share and I think people will get a lot of support from this blog. Thank you for sharing this informative blog, please keep up and share some unique posts with us in the future
ecommerce website development services
Mobile App Development Company in bangalore
SEO company services
Web Design Company
Digital Marketing Agency
Packers and Movers
Service Apartments in Bangalore

Britney Wilson said...

Shop the very latest Best fashion and trendy clothing, Software, Mobiles, Fashionwear, Electronics, Furniture, Sports, Healthcare and Beauty Products, accsoiries etc. online at Shopperstylez :: FREE delivery available* :: Great Style. Great Service!
Visit Our Website Now: Biggest Online Shopping Store in USA
Buy Fitbit Charge 4 Online At Best Price
Buy Latest Fossil Watch At Discounted Price
Buy Apple Airpods Pro At Best Price
Buy Enagement Ring Online At Affordable Price
Shop Now Best Adidas Running Shoes For Women

Sally T. Durgan said...

LeanBelly 3X is described as an advanced belly-toning formula that has been designed to support healthy body composition. With time, individuals will come to notice its ability to possibly accelerate fat burning, and in turn, decrease body fat and increase toned muscles.

Wismarketing said...

Great Post Thanks For Sharing. Today we'll take a look at the best content marketing companies in the industry. Content marketing services in Thailand can be utilized by businesses across a variety of industries that aim to expand their user base - — Think Web. Think Smart. Partner with the #1 Rated Digital Marketing Company In Thailand
To Know More Call us to Book Now +66 64 942 2452 Visit
Digital Marketing Courses In Thailand
Content marketing services in Thailand
SEO Company In Thailand
Social Media Marketing Services In Thailand
Website Design And Development Company In Thailand

Nithi said...

Localbitcoins Clone Script
Uniswap Clone Script
DeFi Development Company

Wismarketing said...

Nice Post Thanks For Sharing With Us. Designing a great website is not at all an easy task; it requires creativity, understanding of business needs, Lots of efforts and communication. Hire our expert web developers to make your website unique. Check out our company's unique design and development portfolio, services and offers. Join @wismarketing Today!

To Know More Call us to Book Now +66 64 942 2452 Visit
Digital Marketing Courses In Thailand
Content marketing services in Thailand
SEO Company In Thailand
Social Media Marketing Services In Thailand
Website Design And Development Company In Thailand

Brillmindz said...

Hi ,I read your blog and Blog is very insightful about Personal and Social Related Website Design, keep up the work and be sharing such unique posts.. There is a lot of good stuff, I would like to share and I hope people would have a lot of support from this blog. Thank you for sharing this blog that is insightful.

e learning & LMS app development company in India
e learning & LMS app development company in UK
e learning & LMS app development company in USA
e learning & LMS app development company in Dubai, UAE
e learning & LMS app development company in Kolkata
e learning & LMS app development company in Chennai
e learning & LMS app development company in Hyderabad
e learning & LMS app development company in New Delhi
e learning education & LMS app development company in Mumbai

PancakeSwap Clone Script said...

Uniswap Clone Script
JustSwap Clone Script
PolkaSwap Clone Script
SafeMoon Clone Script

Anonymous said...

bhaee khata
bahi khata

Mobile App Development Company Dubai said...

I read your blog and find it to be very informative about Personal and Social Website Design. Please keep up the good work and continue to share more unique posts. I have a lot of good stuff I'd like to share, and I'm hoping that this blog will provide a lot of help to people. Thank you for sharing this informative blog.
Mobile app development companies in Delhi
Educational app development
e learning & LMS app development company in UK
e learning & LMS app development company in USA
e learning & LMS app development company in Dubai, UAE
e learning & LMS app development company in Kolkata
e learning & LMS app development company in Chennai
e learning & LMS app development company in Hyderabad
e learning & LMS app development company in New Delhi
e learning education & LMS app development company in Mumbai
e learning education & LMS app development company in saudi arabia

Ratan Singh Saini said...

I read your blog and find it to be very informative about Personal and Social Website Design. Please keep up the good work and continue to share more unique posts. I have a lot of good stuff I'd like to share, and I'm hoping that this blog will provide a lot of help to people. Thank you for sharing this informative blog.
Mobile app development companies in Delhi
Mobile app development companies in Bangalore
Mobile app development in Bangalore

Educational app development
e learning & LMS app development company in UK
e learning & LMS app development company in USA
e learning & LMS app development company in Dubai, UAE
e learning & LMS app development company in Kolkata
e learning & LMS app development company in Chennai
e learning & LMS app development company in Hyderabad
e learning & LMS app development company in New Delhi
e learning education & LMS app development company in Mumbai
e learning education & LMS app development company in saudi arabia

Ratan Singh Saini said...

HI guys,
This is a very good post, and I like it very much. For us, it's insightful and helpful. For a long time, I've been looking for this and I'm just really pleased to say that I'm working with this stuff as well. Thanks for sharing this with us.

Digital Marketing Company in Jaipur
Digital Marketing company In Delhi
Digital Marketing Company in Bangalore
SEO Company in Jaipur
Website development Company in Jaipur
PPC Company in Jaipur
Digital Marketing Company in USA

Shira said...

Uniswap Clone Script
PancakeSwap Clone Script
Sushiswap Clone Script

TRON Smart Contract MLM
Smart Contract MLM

WhitePaper Writing Service

Stablecoin Development
Asset Backed Stablecoin
Gold Backed Stablecoin
Fiat Backed Stablecoin


Smart Contract Development
Smart Contract Audit

DeFi Token Development
ERC20 Token Development
BEP20 Token Development

NFT Development
NFT Marketplace
NFT Marketplace Clone Script
OpenSea Clone Script
Rarible Clone Script
SafeMoon Clone Script

blockchain development said...

Also visit our blog
DEFI Development Company

Blockchain Development Company

Defi Application Development Company

Pantherswap Clone Script said...

Pancakeswap Clone Script
Pancakeswap Clone Software
Pancakeswap Clone Development
Pantherswap Clone Script
Pantherswap Clone Software
Pantherswap Clone Development

Nithi said...
This comment has been removed by the author.
Brigiita said...

Ethereum Token Development Company
Tron Token Development Company
BEP20 Token Development Company

BlockchainX said...

erc20 token generator

Valentina melody said...

Great articles are really helpful for me. Are you seeking to launch a bitcoin trading platform like Rariable you need
Rariable clone script

Brigiita said...

BEP20 Token Development

BlockchainX said...

Blockchain Development company

Tom-shelby said...

Sushiswap Clone script
Pantherswap Clone script
SafeMoon Clone Script
Uniswap Clone Script
Trust Wallet Clone Script
MetaMask Wallet Clone Script

samantha said...

Solana Blockchain Development

Lucas Andrew said...

NFT marketplace is the big topic circulating in Crypto world. Start your NFT marketplace with Maticz the leading NFT marketplace development company, launch your NFT marketplace and make profits.

NFT marketplace development company

Shirley Eva said...

Maticz, one of the globally leading solana blockchain development companies, provides you with highly refined and promising services. Here at maticz we offer you Solana-based NFT,NFT marketplaces, DApps and smart contracts services.
Maticz is the best place to take your crypto business to the next level, Connect with our experts now.
solana blockchain development

fernelisabeth said...

Thanks for one’s nice posting! I certainly enjoyed reading it, you may be a great author. I will make sure to bookmark your blog and definitely will come back at some point.
Are you seeking to launch an NFT development platform like Opensea, then you need a Opensea clone script

Lucas Andrew said...

Solana has become the recent famous blockchain due to its benefits and many crypto users are focusing on Solana NFTs. Launch your Solana based NFT marketplace with Maticz the leading solana NFT development company.

martinahale said...

Cloud migration is a good time to tidy up database user management and establish new protocols, so use this time to make sure your chosen cloud DevOps consulting provider like ISETech is doing their best to meet your needs as you wish for them to be met.

Faina Beatriz said...

OpenSea Clone Script
OpenSea Clone

Nirupama said...

Non-Fungible Tokens(NFTs) are becoming a buzzword in the blockchain space due to their fruitful performance. Likewise, the NFT Marketplace like Rarible gets a huge fan base in the crypto sphere. Rarible is a community-owned NFT Marketplace that allows users to mint and trade NFTs such as metaverse, music, arts, games & photography without coding skills. This volcanic momentum of the Rarible leads the launching of Rarible Clone NFT Marketplace into a million-dollar business.

Maticz is the finest NFT Marketplace Development Company that offers up-to-date development services on NFT. Our pool of experts has in-depth knowledge in Rarible Clone development. Our NFT Marketplace Software can be modified based on the client's wishes. So, create your footprint in the business world and get astonishing profits with Rarible Clone Script.

Anonymous said...

Uniswap clone Script

Griffin said...

Entrepreneurs and other thinking to start their own business can think about White label NFT Marketplace development, Localbitcoins clone, Remitano clone script, Paxful Clone Script which has a good opportunity in the near future, which will give you great return also there are many opportunities in the crypto world.

fernelisabeth said...

Thank you for your sharing the blog.

Cointool App Clone Script |
Zed Run Clone Script
Token Generator Platform Development Company |
Crypto Punks Clone Script |

Flora Blog Sections said...

Axie Infinity NFT Game Clone Script
Decentraland NFT Game Clone Script
Zed Run NFT Game Clone Script
CryptoKitties NFT Game Clone Script
Sorare NFT Game Clone Script

Henry said...

Cointool App Clone Script | Token Development Company | Token Development Company | NFT Gaming Platform Development Company

Henry said...

Custom Altcoin Creation |
Token Development |
ICO Development Services |
BEP20 Token Development Company |
NFT Game Development Company |

Bajeelaaluin Tech Blog said...

Nice Blog
NFT Marketplace Development

Bajeelaaluin Tech Blog said...

Axie Infinity Clone Script

fernelisabeth said...

Cryptopunks Clone |
OpenSea Clone |
Axie Infinity Clone |
Zed Run Clone |
Cointool App Clone |
Rarible Clone |

Bajeelaaluin Tech Blog said...

Sorare Clone Script

Superrare Clone Script

NFT Marketplace Development Company

NFT Game Development Company

fernelisabeth said...
This comment has been removed by the author.
Bajeelaaluin Tech Blog said...

Opensea clone script
Zed run clone script

Praveen Kaur said...

Great articles are really helpful for me.
NFT Token Development

fernelisabeth said...

NFT Marketplace Development Company |
Metaverse NFT Marketplace Development Company |
Solana NFT Marketplace Development Company |
Binance NFT Marketplace Clone Script |
NFT Marketplace Clone Development Company |
Multichain NFT Marketplace Development Company |
NFT Music Platform Development Company |
NFT Art Marketplace Development Company |

fernelisabeth said...

Useful Information, Thank you for Sharing.
Cryptopunks Clone Script |
Decentraland Clone Script |
Solsea Clone Script |
NFT Marketplace Development Company |
NFT Music Platform Development Company |
NFT Art Marketplace Development Company |

fernelisabeth said...
This comment has been removed by the author.
fernelisabeth said...

Nice Post!
Decentraland Clone Script |
OpenSea Clone Script |
Foundation Clone Script |
NFT Minting Platform Development Company |
Solana NFT Marketplace Development Company |
NFT Music Platform Development Company |
NFT Art Marketplace Development Company |

fernelisabeth said...
This comment has been removed by the author.
Dxsale said...

dxsale clone
dxsale clone script

fernelisabeth said...
This comment has been removed by the author.
fernelisabeth said...

Cointool App Clone Script |
Sorare Clone Script
PancakeSwap Clone Script |
NFT Marketplace Development Company |
NBA Top Shot Clone Script |
Rarible Clone Script |
OpenSea Clone Script |
Decentraland Clone Script |
Blockchain Game Development Company |

Anonymous said...

Google wants end users. An expert digital marketing agency in London can help you understand this better. So, Google can find the answer you are looking for, and you can trust the results you see. If Google thinks both are true, it ranks websites up and down based on queries. By placing something high in the search rankings, Google effectively guarantees the source.

blockchainx said...

BEP20 Token Development Company


Create your own crypto tokens with Binance BEP20 token development. Leverage decentralized finance on binance smart chain with cross-chain compatibility.

create bep20 token

Bajeelaaluin Tech Blog said...

Pancakeswap clone script
NFT Marketplace clone script

Sophia Linnea said...

Great Article!
BEP20 Token Development Company
ERC20 Token Development Company
Solana Token Development Company
Polygon Token Development Company
PancakeSwap Clone Script
Smart Contract Development Company

Sophia Linnea said...

Nice Blog Content.
Token Development Company
Token Development Services
BEP20 Token Development Company
ERC20 Token Development Company
Solana Token Development Company
NFT Token Development Company
Polygon Token Development Company
Smart Contract Development Company

Sophia Linnea said...

BEP20 Token Development Services Company
DeFi Token Development Services Company
Polygon Token Development Services Company
Solana Token Development Services Company
NFT Marketplace Development Services Company
Smart Contract Development Services Company
ICO Development Services Company

Bajeelaaluin Tech Blog said...

NFT Marketplace Development Company
Binance Clone Script
NFT Development Company

Blockchain App Maker said...

You did really good work, Because, security token marketing strategy not a easy task. But your post gives us good ideas.
Please check mine!!!
NFT Develpment Services in Dubai and UAE
Blockchain Development Services Company in Dubai
Blockchain Development Company in Dubai and UAE

Best SMO services in india said...

very nice informative blog given by you . Thanks for sharing ....

Bajeelaaluin Tech Blog said...

NFT Marketplace Development Company
Opensea clone script
Pancakeswap clone script
Binance Clone script
Defi Clone Script
Decentralized Finance Defi Wallet Development

Bajeelaaluin Tech Blog said...

NFT Marketplace Development Company
NFT Marketplace Clone Script
Metaverse Development Company
NFT Marketplace Clone Script
Metaverse Clone Script
Binance Clone script
Pancakeswap clone script

Bajeelaaluin Tech Blog said...

NFT Marketplace Development
Sandbox clone script
NFT Development Company
NFT Game Development
Binance Clone script

Bajeelaaluin Tech Blog said...

Cryptocurrency Exchange Script
NFT Marketplace Clone Script
NFT Marketplace Development

monica said...

thank you for useful info
Best Website Development Company In Hyderabad

monica said...

useful information
Best Website Development Company In Hyderabad

Coretech Voyage said...

Great Article thanks for sharing!

Slot Online said...

HI..Thanks for your blog post. I was looking for the same thing and I found your blog, it's very good. I really liked the part............ Thanks for the great post.

Demo Slot Online said...

The topic you choose is good. Keep your blog updated. because it will help many users

bonanza slot said...

This is a great read and the topic you choose is good. Keep your blog updated. because it will help many users

system logic solution said...

thanks for your nice post
static website design

Magento Upgrade Service said...

Mage Monkeys provides the best Magento Ecommerce Store Development Service. Mage monkeys is a leading Magento development company. We are an ISO 9001:2008 certified company with 17+ years of expertise and experience in the IT industry.
Visit our website for more information.

Transform Your Business With Reap Mind said...

This is an excellent post with an exciting line of content. Thanks for sharing this article, great way of bringing this topic to discussion.

Cost to build a mobile app in Bangalore
NeoBank Mobile App Development Company
cost to build an ecommerce app like noon
Mobile App Development Cost in Mumbai
Mobile App Development Cost in Chandigarh

icoresingapore said...

I read your article and found it extremely instructive regarding the website's private and social design. Please keep up the fantastic job and share more unique publications.

https://icore.sg/

ChatGPT Development Company said...

Thank you for an amazing post! 🧡
NFT Development Services

«Oldest ‹Older   1 – 200 of 220   Newer› Newest»