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
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout 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.
Java
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.
Java
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(){ 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: