0

This is the my question about I'm getting of of memory when i was run these contacts application. I thought these error occur because of images.

In emulator and bluestacjk this code working but after installed in mobile I'm getting out of memory error.

This code about fetching contacts details with images from phone populated in listview with the help of adapter but is not working in mobile.

 import android.app.AlertDialog;
    import android.content.ContentResolver;
    import android.app.ProgressDialog;
    import android.content.ContentUris;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.res.Resources;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.support.v4.app.Fragment;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.ActionBarActivity;
    import android.support.v7.widget.Toolbar;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.SparseBooleanArray;
    import android.view.ActionMode;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AbsListView;
    import android.widget.ArrayAdapter;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.SearchView;
    import android.widget.TextView;
    import android.widget.Toast;
    import com.example.admin.business_app.R;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    import java.util.Locale;

    /**
     * Created by admin on 3/15/2016.
     */
    public class Contact_list extends Fragment {

        // Declare Variables
        ListView contactlistview;
        ListViewAdapter listviewadapter;
        List<WorldPopulation> worldpopulationlist = new ArrayList<WorldPopulation>();
        Context context;
        String[] name;
        String[] phoneno;
        ProgressDialog loading;
        long contact_id;
        Bitmap image;
        Toolbar mToolbar;
        EditText search_text;
        //EditText editsearch;


        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

            View rootview = inflater.inflate(R.layout.listview_main, container, false);
            {
                super.onCreate(savedInstanceState);
                // Get the view from listview_main.xml

                //ActionBar actionBar = getSupportActionBar();
    //        mToolbar = (Toolbar) findViewById(R.id.contacts_toolbar);
    //        mToolbar.setTitle("Group");
                // setSupportActionBar(mToolbar);
                contactlistview = (ListView) rootview.findViewById(R.id.listview);
                search_text = (EditText) rootview.findViewById(R.id.search);
                search_text.addTextChangedListener(new TextWatcher() {


                    public void afterTextChanged(Editable arg0) {
                        // TODO Auto-generated method stub

                        String text = search_text.getText().toString().toLowerCase(Locale.getDefault());
                        listviewadapter.filter(text);
                    }

                    @Override
                    public void beforeTextChanged(CharSequence arg0, int arg1,
                                                  int arg2, int arg3) {
                        // TODO Auto-generated method stub
                    }

                    @Override
                    public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                                              int arg3) {
                        // TODO Auto-generated method stub
                    }
                });

                // Generate sample data into string array
                Cursor phones = getActivity().getContentResolver().query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
                        null, null);
                while (phones.moveToNext()) {

                    String name = phones
                            .getString(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                    String phoneNumber = phones
                            .getString(phones
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    contact_id = phones.getLong(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));


                    image = getFacebookPhoto(contact_id);

                    System.out.println("value of contacts id is :" + contact_id);
                    WorldPopulation objContact = new WorldPopulation();
                    objContact.setName(name);
                    objContact.setPhoneno(phoneNumber);
                    objContact.setPhoto(image);
                    worldpopulationlist.add(objContact);

                }
                phones.close();
                listviewadapter = new ListViewAdapter(getActivity(), R.layout.listview_item,
                        worldpopulationlist);
                if (null != worldpopulationlist && worldpopulationlist.size() != 0) {
                    Collections.sort(worldpopulationlist, new Comparator<WorldPopulation>() {

                        public int compare(WorldPopulation lhs, WorldPopulation rhs) {
                            return lhs.getName().compareTo(rhs.getName());
                        }
                    });
                    AlertDialog alert = new AlertDialog.Builder(
                            getActivity()).create();
                    alert.setTitle("");
                    alert.setMessage(worldpopulationlist.size() + " Contact Found!!!");
                    alert.setButton("OK", new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    alert.show();

                } else {
                    showToast("No Contact Found!!!");
                }        // Binds the Adapter to the ListView


                contactlistview.setAdapter(listviewadapter);
                contactlistview.setTextFilterEnabled(true);
                contactlistview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
                // Capture ListView item click
                contactlistview.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {

                    @Override
                    public void onItemCheckedStateChanged(ActionMode mode,
                                                          int position, long id, boolean checked) {
                        // Capture total checked items
                        final int checkedCount = contactlistview.getCheckedItemCount();
                        // Set the CAB title according to total checked items
                        mode.setTitle(checkedCount + " Selected");
                        // Calls toggleSelection method from ListViewAdapter Class
                        listviewadapter.toggleSelection(position);
                    }

                    @Override
                    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                        switch (item.getItemId()) {

                            case R.id.selectAll:
                                final int checkedCount = worldpopulationlist.size();
                                listviewadapter.removeSelection();
                                for (int i = 0; i < checkedCount; i++) {
                                    contactlistview.setItemChecked(i, true);

                                }
                                mode.setTitle(checkedCount + "  Selected");
                                listviewadapter.notifyDataSetChanged();
                                return true;


                            case R.id.delete:
                                // Calls getSelectedIds method from ListViewAdapter Class
                                SparseBooleanArray selected = listviewadapter
                                        .getSelectedIds();
                                // Captures all selected ids with a loop
                                for (int i = (selected.size() - 1); i >= 0; i--) {
                                    if (selected.valueAt(i)) {
                                        WorldPopulation selecteditem = listviewadapter
                                                .getItem(selected.keyAt(i));
                                        // Remove selected items following the ids
                                        listviewadapter.remove(selecteditem);
                                        Toast.makeText(getActivity(), "delete sucesdfully", Toast.LENGTH_SHORT).show();
                                    }
                                }
                                // Close CAB
                                mode.finish();
                                listviewadapter.notifyDataSetChanged();
                                return true;
                            default:
                                return false;
                        }
                    }

                    @Override
                    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                        mode.getMenuInflater().inflate(R.menu.contextualmenu, menu);
                        return true;
                    }

                    @Override
                    public void onDestroyActionMode(ActionMode mode) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                        // TODO Auto-generated method stub
                        return false;
                    }
                });
            }
            return rootview;
        }

        private void showToast(String msg)
        {
            Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();

        }


        public boolean onCreateOptionsMenu(Menu menu)
        {
            getActivity().getMenuInflater().inflate(R.menu.menu1, menu);
            //final MenuItem item = menu.findItem(R.id.menu_item_search);
            //final android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(item);

    //      MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
    //          @Override
    //          public boolean onMenuItemActionCollapse(MenuItem item) {
    //              // Do something when collapsed
    //              listviewadapter.setFilter(worldpopulationlist);
    //              return true; // Return true to collapse action view
    //          }
    //
    //          @Override
    //          public boolean onMenuItemActionExpand(MenuItem item) {
    //              // Do something when expanded
    //              return true; // Return true to expand action view
    //          }
    //      });

            // Locate the EditText in menu.xml
    //      editsearch = (EditText) menu.findItem(R.id.menu_item_search).getActionView();
    //
    //      // Capture Text in EditText
    //      editsearch.addTextChangedListener(textWatcher);
    //
    //      // Show the search menu item in menu.xml
    //      MenuItem menuSearch = menu.findItem(R.id.menu_item_search);
    //
    //      menuSearch.setOnActionExpandListener(new MenuItem.OnActionExpandListener()
    //      {
    //
    //          // Menu Action Collapse
    //          @Override
    //          public boolean onMenuItemActionCollapse(MenuItem item) {
    //              // Empty EditText to remove text filtering
    //              editsearch.setText("");
    //              editsearch.clearFocus();
    //              return true;
    //          }
    //
    //          // Menu Action Expand
    //          @Override
    //          public boolean onMenuItemActionExpand(MenuItem item) {
    //              // Focus on EditText
    //              editsearch.requestFocus();
    //
    //              // Force the keyboard to show on EditText focus
    //              InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    //              imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    //              return true;
    //          }
    //      });
    //
    //      // Show the settings menu item in menu.xml
    //      MenuItem menuSettings = menu.findItem(R.id.action_setting);
    //
    //      // Capture menu item clicks
    //      menuSettings.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener()
    //      {
    //
    //          @Override
    //          public boolean onMenuItemClick(MenuItem item) {
    //              // TODO Auto-generated method stub
    //              // Do something here
    //              Toast.makeText(getApplicationContext(), "Nothing here!",
    //                      Toast.LENGTH_LONG).show();
    //              return false;
    //          }
    //
    //      });







            return true;


        }
    //  private TextWatcher textWatcher = new TextWatcher()
    //  {
    //
    //      @Override
    //      public void afterTextChanged(Editable s) {
    //          // TODO Auto-generated method stub
    //          String text = editsearch.getText().toString()
    //                  .toLowerCase(Locale.getDefault());
    //          listviewadapter.filter(text);
    //      }
    //
    //      @Override
    //      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
    //                                    int arg3) {
    //          // TODO Auto-generated method stub
    //
    //      }
    //
    //      @Override
    //      public void onTextChanged(CharSequence arg0, int arg1, int arg2,
    //                                int arg3) {
    //          // TODO Auto-generated method stub
    //
    //      }
    //
    //  };
    //  @Override
    //  public boolean onQueryTextChange(String newText) {
    //      final List<WorldPopulation> filteredModelList = filter(worldpopulationlist, newText);
    //      listviewadapter.setFilter(filteredModelList);
    //      return true;
    //  }
    //
    //  @Override
    //  public boolean onQueryTextSubmit(String query)
    //  {
    //      return false;
    //  }
    //
    //  private List<WorldPopulation> filter(List<WorldPopulation> models, String query)
    //  {
    //      query = query.toLowerCase();
    //
    //      final List<WorldPopulation> filteredModelList = new ArrayList<>();
    //      for (WorldPopulation model : models) {
    //          final String text = model.getName().toLowerCase();
    //          if (text.contains(query))
    //          {
    //              filteredModelList.add(model);
    //          }
    //      }
    //      return filteredModelList;
    //  }


        public void Refresh_listview() {
    //      loading =ProgressDialog.show(MainActivity.this, "Updating", "Please wait...", false, false);
    //      loading.show();
            listviewadapter.notifyDataSetChanged();
        }






        @Override
        public boolean onOptionsItemSelected(MenuItem item)
        {
            switch (item.getItemId())
            {
                case R.id.refresh:
                    //Refresh_listview();
                    return true;
                case R.id.menu_item_search:
                    Toast.makeText(getActivity(),"click on it",Toast.LENGTH_SHORT).show();
            }
            return super.onOptionsItemSelected(item);
        }






        public Bitmap getFacebookPhoto(long contacsid)
        {
            System.out.println("value of  conatcts id is in facebook funtion:"+contacsid);
            Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contacsid);
            Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.PHOTO);
            ContentResolver cr = getActivity().getContentResolver();
            Cursor contact = cr.query(photoUri,new String[] { ContactsContract.Contacts._ID }, null, null, null);

            if (contact.moveToFirst()) {
                //long userId = contact.getLong(contact.getColumnIndex(ContactsContract.Contacts._ID));
                photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contacsid);

            }
            else {
                Bitmap defaultPhoto = decodeSampledBitmapFromResource(getResources(), R.drawable.default_contact_image, 100, 100);
                        //decodeResource(getResources(), R.drawable.default_contact_image);
                return defaultPhoto;
            }
            if (photoUri != null)
            {
                InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);
                if (input != null)
                {
                    return BitmapFactory.decodeStream(input);
                }
            } else
            {
                Bitmap defaultPhoto = decodeSampledBitmapFromResource(getResources(), R.drawable.default_contact_image, 100, 100);
                       // decodeResource(getResources(), R.drawable.default_contact_image);
                return defaultPhoto;
            }
            Bitmap defaultPhoto = decodeSampledBitmapFromResource(getResources(), R.drawable.default_contact_image, 100, 100);
                    //decodeResource(getResources(), R.drawable.default_contact_image);
            return defaultPhoto;
        }
        public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
                                                             int reqWidth, int reqHeight)
        {

            // First decode with inJustDecodeBounds=true to check dimensions
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeResource(res, resId, options);

            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeResource(res, resId, options);
        }
        public static int calculateInSampleSize(
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
            // Raw height and width of image
            final int height = options.outHeight;
            final int width = options.outWidth;
            int inSampleSize = 1;

            if (height > reqHeight || width > reqWidth) {

                final int halfHeight = height / 2;
                final int halfWidth = width / 2;

                // Calculate the largest inSampleSize value that is a power of 2 and keeps both
                // height and width larger than the requested height and width.
                while ((halfHeight / inSampleSize) > reqHeight
                        && (halfWidth / inSampleSize) > reqWidth) {
                    inSampleSize *= 2;
                }
            }

            return inSampleSize;
        }

















    }


        class ListViewAdapter extends ArrayAdapter<WorldPopulation>
        {
            // Declare Variables
            Context context;
            LayoutInflater inflater;
            List<WorldPopulation> worldpopulationlist;
            private SparseBooleanArray mSelectedItemsIds;
            private ArrayList<WorldPopulation> arraylist;
            int xDim,yDim;

            public ListViewAdapter(Context context, int resourceId,
                                   List<WorldPopulation> worldpopulationlist) {
                super(context, resourceId, worldpopulationlist);
                mSelectedItemsIds = new SparseBooleanArray();
                this.context = context;
                this.worldpopulationlist = worldpopulationlist;
                this.arraylist = new ArrayList<WorldPopulation>();
                this.arraylist.addAll(worldpopulationlist);
                inflater = LayoutInflater.from(context);
            }

            @Override
            public int getCount() {
                return worldpopulationlist.size();
            }

            @Override
            public WorldPopulation getItem(int position) {
                return worldpopulationlist.get(position);
            }

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


            private class ViewHolder
            {
                TextView name;
                TextView phoneno;
                ImageView personphoto;

            }

            public View getView(final int position, View view, ViewGroup parent) throws IndexOutOfBoundsException {
                final ViewHolder holder;
                if (view == null)
                {
                    holder = new ViewHolder();
                    view = inflater.inflate(R.layout.listview_item, null);
                    // Locate the TextViews in listview_item.xml
                    holder.name = (TextView) view.findViewById(R.id.contactname);
                    holder.phoneno = (TextView) view.findViewById(R.id.contactphone);
                    holder.personphoto = (ImageView) view.findViewById(R.id.contactsimages);

                    view.setTag(holder);
                } else {
                    holder = (ViewHolder) view.getTag();
                }
                // Capture position and set to the TextViews
                holder.name.setText(worldpopulationlist.get(position).getName());
                holder.phoneno.setText(worldpopulationlist.get(position).getPhoneno());
                holder.personphoto.setImageBitmap(worldpopulationlist.get(position).getPhoto());


                return view;
            }


            public void filter(String charText)
            {
                charText = charText.toLowerCase(Locale.getDefault());
                worldpopulationlist.clear();
                if (charText.length() == 0) {
                    worldpopulationlist.addAll(arraylist);
                }
                else
                {
                    for (WorldPopulation wp : arraylist)
                    {
                        if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText))
                        {
                            worldpopulationlist.add(wp);
                        }
                    }
                }
                notifyDataSetChanged();
            }

            @Override
            public void remove(WorldPopulation object)
            {
                worldpopulationlist.remove(object);
                notifyDataSetChanged();
            }

            public List<WorldPopulation> getWorldPopulation()
            {
                return worldpopulationlist;
            }

            public void toggleSelection(int position) {
                selectView(position, !mSelectedItemsIds.get(position));
            }

            public void removeSelection()
            {
                mSelectedItemsIds = new SparseBooleanArray();
                notifyDataSetChanged();
            }

            public void selectView(int position, boolean value) {
                if (value)
                    mSelectedItemsIds.put(position, value);
                else
                    mSelectedItemsIds.delete(position);
                notifyDataSetChanged();
            }

            public int getSelectedCount()
            {
                return mSelectedItemsIds.size();
            }

            public SparseBooleanArray getSelectedIds() {
                return mSelectedItemsIds;
            }
            // Filter Class
    //    public void filter(String charText)
    //    {
    //        charText = charText.toLowerCase(Locale.getDefault());
    //        worldpopulationlist.clear();
    //        if (charText.length() == 0) {
    //            worldpopulationlist.addAll(arraylist);
    //        }
    //        else
    //        {
    //            for (WorldPopulation wp : arraylist)
    //            {
    //                if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText))
    //                {
    //                    worldpopulationlist.add(wp);
    //                }
    //            }
    //        }
    //        notifyDataSetChanged();
    //    }




    //
    //      public void setFilter(List<WorldPopulation> countryModels)
    //      {
    //          worldpopulationlist = new ArrayList<>();
    //          worldpopulationlist.addAll(countryModels);
    //          notifyDataSetChanged();
    //      }



            public void Refresh_listview()
            {
    //      loading =ProgressDialog.show(MainActivity.this, "Updating", "Please wait...", false, false);
    //      loading.show();
                notifyDataSetChanged();
            }

    }
Alessandro Cuttin
  • 3,822
  • 1
  • 30
  • 36
sumit
  • 3
  • 4
  • it seems you are storing bitmaps in the activity, if you are doing that then try to scale down those bitmaps, or if possible then only get url of the bitmap and do the lazy loading in the list where you are showing image in adapter. For lazy loading you can use Picasso or universal image loader. – Silvans Solanki Mar 22 '16 at 06:55

3 Answers3

0

Have you tried enabling largeHeap in the manifest?

<application
    ....
    android:largeHeap="true"
    .... >
</application>

refer this for more info

drulabs
  • 3,071
  • 28
  • 35
0

You have to recycle your bitmap after showing as contact image

recycle bitmap from memory as well you can try set large heap ="true" in manifest application

You can also read this solution for effectively work with bitmap objects

Community
  • 1
  • 1
Ajay Pandya
  • 2,417
  • 4
  • 29
  • 65
0

Use Picasso library for loading images, that would be useful.

It will solve your out of memory problem.

Its easy, no need to use all the methods for getting Bitmap image.

Picasso.with(context).load(uri) .resize(50, 50).centerCrop().into(imageView) 

Visit these links for Picasso library

http://square.github.io/picasso/

https://github.com/square/picasso

From the link, grab the library via gradle, by putting this line is the gradle file:

compile 'com.squareup.picasso:picasso:2.5.2'

I see that in your code. you are using

holder.personphoto.setImageBitmap(worldpopulationlist.get(position).getPhoto());

to get the image.

Comment this line , and use the first code line in this answer to load your image.