How to Add Memes Using API Call in Android?
Application Programming Interface calling is the process of making requests to external web-based services to retrieve or manipulate data. APIs provide a standardized way for different software applications to communicate with each other. It involves sending a request from one application to another over the internet using a specific set of rules and protocols. The requesting application sends an API request to the target application, which then processes the request and sends back a response containing the requested data. API calls can be done using various programming languages and tools, such as cURL, Postman, Python, Java, and many others.
Meme
A meme is a cultural phenomenon that spreads rapidly through the internet, typically in the form of humorous images, video, or piece of text that is shared widely and often parodied or adapted.
Step-by-Step Implementation
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Step 2: Working with the activity_main.xml file
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file.
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="#F3FCFF"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="My Meme App"
android:textSize="40sp"
android:textStyle="bold"
android:textColor="#006875"
android:layout_marginTop="40dp"/>
<androidx.cardview.widget.CardView
android:layout_width="340dp"
android:layout_height="500dp"
android:layout_marginTop="15dp"
android:layout_gravity="center_horizontal"
app:cardCornerRadius="25dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imgMeme"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="20dp"
android:scaleType="fitCenter"
android:paddingTop="20dp"
android:paddingRight="20dp" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="150dp"
android:visibility="invisible"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
<androidx.cardview.widget.CardView
android:layout_width="200dp"
android:layout_height="60dp"
app:cardCornerRadius="30dp"
android:layout_marginTop="20dp"
android:outlineAmbientShadowColor="@color/black"
android:outlineSpotShadowColor="@color/white">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/btnShare"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:layout_marginLeft="30dp"
android:src="@drawable/share"/>
<ImageView
android:id="@+id/btnNext"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="10dp"
android:src="@drawable/next"
android:layout_marginLeft="120dp"/>
</RelativeLayout>
</androidx.cardview.widget.CardView>
</LinearLayout>
Output UI:

Step 3:
In your java folder create a new java file. Add this code to your new Java file.
package com.anas.memeshareapp;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class MySingleton {
private static MySingleton instance;
private RequestQueue requestQueue;
private ImageLoader imageLoader;
private static Context ctx;
private MySingleton(Context context) {
ctx = context;
requestQueue = getRequestQueue();
imageLoader = new ImageLoader(requestQueue,
new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap>
cache = new LruCache<String, Bitmap>(20);
@Override
public Bitmap getBitmap(String url) {
return cache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
});
}
public static synchronized MySingleton getInstance(Context context) {
if (instance == null) {
instance = new MySingleton(context);
}
return instance;
}
public RequestQueue getRequestQueue() {
if (requestQueue == null) {
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
requestQueue = Volley.newRequestQueue(ctx.getApplicationContext());
}
return requestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
public ImageLoader getImageLoader() {
return imageLoader;
}
}
Step 4: Working with the MainActivity.java file
Go to the MainActivity.java file and refer to the following code. Below is the code for the MainActivity.java file.
package com.anas.memeshareapp;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
ImageView imgMeme;
ImageView btnNext;
ImageView btnShare;
String url ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imgMeme = findViewById(R.id.imgMeme);
btnNext = findViewById(R.id.btnNext);
btnShare = findViewById(R.id.btnShare);
apiCall();
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
apiCall();
}
});
btnShare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) imgMeme.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
String bitmapPath = MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,"Title",null);
Uri uri = Uri.parse(bitmapPath);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM,uri);
startActivity(Intent.createChooser(intent,"share to :"));
}
});
}
public void apiCall(){
url = "https://meme-api.com/gimme";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
url = response.getString("url");
Glide.with(MainActivity.this).load(url).into(imgMeme);
}
catch (JSONException e){
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest);
}
}
Step 6: Make some changes in your gradle file
Add these dependencies to it
implementation 'com.android.volley:volley:1.2.1' implementation 'com.github.bumptech.glide:glide:4.15.1'

Note: Make sure that your emulator is connected to the internet.
Output:
.png)