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();
}
}