Image Gallery App in Android Android by Rajesh Kumar Sahanee - January 9, 2018January 9, 20180 Post Views: 10,632 Hello Friends, Today I will share how to develop image gallery app in Android. Actually, recently I was developing an Android Application in which I was required to add inbuilt gallery feature for the captured images through that application. So, for learning purpose I developed separate gallery application and now I am sharing this code to help others. While developing gallery app I faced OutOfMemoryError (Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.). This happened because lot of images loaded in memory and eventually the memory gets full, then I googled and found that, there is an existing library named Glide which is recommended by android itself to fetch, decode, and display bitmaps in your app. Glide does all the task related to bitmap images i.e loading, caching, memory management, etc. So, I used Glide library to overcome OutOfMemoryError. This gallery app will also work on android version M(marshmallow) and higher version. To use Glide library we required to add below dependency in apps build.gradle file. compile 'com.github.bumptech.glide:glide:3.7.0' 1 compile 'com.github.bumptech.glide:glide:3.7.0' So, Here is the code AndroidManifest.xml AndroidManifest.xml XHTML <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zatackcoder.galleryapp"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ViewImage"></activity> </application> </manifest> 123456789101112131415161718192021222324 <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zatackcoder.galleryapp"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".ViewImage"></activity> </application> </manifest> MainActivity.java MainActivity.java Java package com.zatackcoder.galleryapp; import android.Manifest; import android.app.ActivityManager; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import com.bumptech.glide.Glide; import java.io.File; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback { GridView gridView; ArrayList<File> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkPermissions(); list = getImageFiles(Environment.getExternalStorageDirectory()); gridView = (GridView) findViewById(R.id.gridView); gridView.setAdapter(new GridAdapter()); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { startActivity(new Intent(getApplicationContext(), ViewImage.class).putExtra("img", list.get(i).toString())); } }); } class GridAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { view = getLayoutInflater().inflate(R.layout.grid_item, viewGroup, false); ImageView imageView = (ImageView) view.findViewById(R.id.imageView); //imageview.setImageURI(Uri.parse(getItem(i).toString())); //Loading image from below url into imageView Glide.with(getApplicationContext()) .load(getItem(i).toString()) .into(imageView); return view; } } ArrayList<File> getImageFiles(File root) { ArrayList<File> list = new ArrayList(); File[] files = root.listFiles(); for (int i = 0; i < files.length; i++) { if(files[i].isDirectory()) { list.addAll(getImageFiles(files[i])); } else { if(files[i].getName().endsWith(".jpg") || files[i].getName().endsWith(".png") || files[i].getName().endsWith(".gif")) { list.add(files[i]); } } } return list; } private void checkPermissions(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ //Requesting permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } } } @Override //Override from ActivityCompat.OnRequestPermissionsResultCallback Interface public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } return; } } } private ActivityManager.MemoryInfo getMemoryInfo() { ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); return memoryInfo; } } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 package com.zatackcoder.galleryapp; import android.Manifest;import android.app.ActivityManager;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView; import com.bumptech.glide.Glide; import java.io.File;import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback { GridView gridView; ArrayList<File> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkPermissions(); list = getImageFiles(Environment.getExternalStorageDirectory()); gridView = (GridView) findViewById(R.id.gridView); gridView.setAdapter(new GridAdapter()); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { startActivity(new Intent(getApplicationContext(), ViewImage.class).putExtra("img", list.get(i).toString())); } }); } class GridAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return 0; } @Override public View getView(int i, View view, ViewGroup viewGroup) { view = getLayoutInflater().inflate(R.layout.grid_item, viewGroup, false); ImageView imageView = (ImageView) view.findViewById(R.id.imageView); //imageview.setImageURI(Uri.parse(getItem(i).toString())); //Loading image from below url into imageView Glide.with(getApplicationContext()) .load(getItem(i).toString()) .into(imageView); return view; } } ArrayList<File> getImageFiles(File root) { ArrayList<File> list = new ArrayList(); File[] files = root.listFiles(); for (int i = 0; i < files.length; i++) { if(files[i].isDirectory()) { list.addAll(getImageFiles(files[i])); } else { if(files[i].getName().endsWith(".jpg") || files[i].getName().endsWith(".png") || files[i].getName().endsWith(".gif")) { list.add(files[i]); } } } return list; } private void checkPermissions(){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if(checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ //Requesting permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1); } } } @Override //Override from ActivityCompat.OnRequestPermissionsResultCallback Interface public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission granted } return; } } } private ActivityManager.MemoryInfo getMemoryInfo() { ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE); ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); return memoryInfo; } } ViewImage.java ViewImage.java Java package com.zatackcoder.galleryapp; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.ImageView; import com.bumptech.glide.Glide; public class ViewImage extends AppCompatActivity { ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_image); Intent intent = getIntent(); String file = intent.getStringExtra("img"); imageView = (ImageView) findViewById(R.id.imageView); //imageView.setImageURI(Uri.parse(file)); //Loading image from below url into imageView Glide.with(getApplicationContext()) .load(file) .into(imageView); } } 12345678910111213141516171819202122232425262728293031 package com.zatackcoder.galleryapp; import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView; import com.bumptech.glide.Glide; public class ViewImage extends AppCompatActivity { ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_view_image); Intent intent = getIntent(); String file = intent.getStringExtra("img"); imageView = (ImageView) findViewById(R.id.imageView); //imageView.setImageURI(Uri.parse(file)); //Loading image from below url into imageView Glide.with(getApplicationContext()) .load(file) .into(imageView); } } activity_main.xml activity_main.xml XHTML <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zatackcoder.galleryapp.MainActivity"> <GridView android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:numColumns="auto_fit" android:columnWidth="80dp" android:verticalSpacing="5dp" android:horizontalSpacing="5dp" android:stretchMode="spacingWidth" android:layout_centerHorizontal="true"/> </RelativeLayout> 1234567891011121314151617181920 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zatackcoder.galleryapp.MainActivity"> <GridView android:id="@+id/gridView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="5dp" android:numColumns="auto_fit" android:columnWidth="80dp" android:verticalSpacing="5dp" android:horizontalSpacing="5dp" android:stretchMode="spacingWidth" android:layout_centerHorizontal="true"/></RelativeLayout> grid_item.xml grid_item.xml XHTML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="80dp" android:layout_height="80dp" android:scaleType="centerCrop" app:srcCompat="@mipmap/ic_launcher" /> </LinearLayout> 12345678910111213 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/imageView" android:layout_width="80dp" android:layout_height="80dp" android:scaleType="centerCrop" app:srcCompat="@mipmap/ic_launcher" /></LinearLayout> activity_view_image.xml activity_view_image.xml XHTML <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zatackcoder.galleryapp.ViewImage"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:scaleType="fitCenter" app:srcCompat="@mipmap/ic_launcher"/> </RelativeLayout> 123456789101112131415161718 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.zatackcoder.galleryapp.ViewImage"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:scaleType="fitCenter" app:srcCompat="@mipmap/ic_launcher"/> </RelativeLayout> Screenshots AndroidStudio Project Download Image Gallery App Android Studio Project 1 file(s) 18.50 MB Download Thanks for stopping by please share if you like it