Search code examples
androidapigoogle-books

Call another api if one api returns null value


I am building an Android app to sell books. I have an integrated barcode scanner with which my users can scan the book's barcode that they want to sell.

I can get the ISBN number of the book from the barcode using Zxing library. Using this ISBN number I am fetching data from the openlibrary.org API.

Now the problem is that I want to call the Google Books API if openlibrary doesn't have that book data.

The reason why I am using openlibrary even though they don't have as much data as Google is that they provide good quality book cover images. Google doesn't have that data available.

So now I need to know how to call Google's API if openlibrary's response is null.

Here is my complete code :

package com.example.gaayathri.barcodetest;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = this.findViewById(R.id.button);
        final Activity activity = this;
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ImageView ivBookImage = findViewById(R.id.ivBookImage);
                ivBookImage.setImageBitmap(null);

                TextView tvTitle = findViewById(R.id.tvTitle);
                tvTitle.setText("");

                TextView tvAuthor = findViewById(R.id.tvAuthor);
                tvAuthor.setText("");


                IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
                integrator.setPrompt("Scan a barcode");
                integrator.setCameraId(0);  // Use a specific camera of the device
                integrator.setOrientationLocked(true);
                integrator.setBeepEnabled(true);
                integrator.setCaptureActivity(CaptureActivityPortrait.class);
                integrator.initiateScan();
            }
        });

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
            if(result.getContents() == null) {
                Log.d("MainActivity", "Cancelled scan");
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            } else {
                Log.d("MainActivity", "Scanned");
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

                final String isbn = result.getContents();

                String bookOpenApi = "https://openlibrary.org/api/books?bibkeys=ISBN:" + isbn + "&jscmd=data&format=json";

                //String bookSearchString = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn;

                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url(bookOpenApi)
                        .build();

                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, final Response response) throws IOException {
                        // ... check for failure using `isSuccessful` before proceeding

                        // Read data on the worker thread
                        final String responseData = response.body().string();

                        // Run view-related code back on the main thread
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                JSONObject resultObject = null;

                                try {

                                    resultObject = new JSONObject(responseData);

                                    JSONObject isbnObject = resultObject.getJSONObject("ISBN:" + isbn);

                                    String TitleL = isbnObject.getString("title");

                                    if (TitleL.length()!=0){

                                        Toast.makeText(MainActivity.this, "Title length = " + TitleL.length(), Toast.LENGTH_SHORT).show();

                                        try{
                                            TextView tvTitle = findViewById(R.id.tvTitle);
                                            tvTitle.setText("TITLE: "+isbnObject.getString("title"));
                                        }
                                        catch(JSONException jse){
                                            TextView tvTitle = findViewById(R.id.tvTitle);
                                            tvTitle.setText("");
                                            jse.printStackTrace();
                                        }

                                        try{

                                            JSONArray authors = isbnObject.getJSONArray("authors");
                                            JSONObject author = authors.getJSONObject(0);

                                            String authorName = author.getString("name");

                                            TextView tvAuthor = findViewById(R.id.tvAuthor);
                                            tvAuthor.setText("AUTHOR(S): "+ authorName);
                                        }
                                        catch(JSONException jse){
                                            TextView tvAuthor = findViewById(R.id.tvAuthor);
                                            tvAuthor.setText("");
                                            jse.printStackTrace();
                                        }

                                        try{

                                            JSONObject imageObject = isbnObject.getJSONObject("cover");

                                            String imageUrl = imageObject.getString("large");

                                            ImageView ivBookImage = findViewById(R.id.ivBookImage);

                                            Glide.with(MainActivity.this).load(imageUrl).into(ivBookImage);
                                        }
                                        catch(JSONException jse){

                                            Toast.makeText(MainActivity.this, "No book image available", Toast.LENGTH_SHORT).show();
                                            jse.printStackTrace();
                                        }

                                    } else {

                                        String bookSearchString = "https://www.googleapis.com/books/v1/volumes?q=isbn:" + isbn;

                                        OkHttpClient client = new OkHttpClient();

                                        Request request = new Request.Builder()
                                                .url(bookSearchString)
                                                .build();

                                        client.newCall(request).enqueue(new Callback() {
                                            @Override
                                            public void onFailure(Call call, IOException e) {

                                            }

                                            @Override
                                            public void onResponse(Call call, Response response) throws IOException {

                                                final String googleResponseData = response.body().string();

                                                MainActivity.this.runOnUiThread(new Runnable() {
                                                    @Override
                                                    public void run() {

                                                        JSONObject resultObject = null;

                                                        try {

                                                            resultObject = new JSONObject(googleResponseData);

                                                            JSONArray items = resultObject.getJSONArray("items");

                                                            JSONObject volumeInfo = items.getJSONObject(0);

                                                            JSONObject volumeObject = volumeInfo.getJSONObject("volumeInfo");

                                                            String TitleL = volumeObject.getString("title");

                                                            TextView tvTitle = findViewById(R.id.tvTitle);

                                                            tvTitle.setText(TitleL);

                                                        } catch (JSONException e) {
                                                            e.printStackTrace();
                                                        }

                                                        try {

                                                            JSONArray items = resultObject.getJSONArray("items");

                                                            JSONObject volumeInfo = items.getJSONObject(0);

                                                            JSONObject volumeObject = volumeInfo.getJSONObject("volumeInfo");

                                                            JSONArray authorsArray = volumeObject.getJSONArray("authors");

                                                            String authorName = authorsArray.getString(0);

                                                            TextView tvAuthor = findViewById(R.id.tvAuthor);
                                                            tvAuthor.setText("AUTHOR(S): "+ authorName);


                                                        } catch (JSONException e) {
                                                            e.printStackTrace();
                                                        }

                                                    }
                                                });

                                            }
                                        });

                                    }

                                } catch (JSONException e) {
                                    e.printStackTrace();
                                }

                            }
                        });
                    }
                });

            }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
            super.onActivityResult(requestCode, resultCode, data);
        }
    }


}

Solution

  • Ok I solved this issue by using an EditText field as a key field. So the idea is to call the openlibrary API with the ISBN number returned by barcode scanner and populate the Simple drawee view, Title Edittext and Author Edittext.

    And then check if the Title Edittext field is populated or not. If it is populated, that means OpenLibrary API have returned the valid data. If Title Edittext is empty, call Google's books API.

    Complete source code for OnActivityResult() function is shown below:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        final IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
            if(result.getContents() == null) {
                Log.d("MainActivity", "Cancelled scan");
                Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
            } else {
                Log.d("MainActivity", "Scanned");
                Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
    
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        // This function will fetch the data from openlibrary API
                        checkinOpenLibrary(result.getContents());
    
                        EditText tvTitle = findViewById(R.id.etMaterialTitle);
                        if (tvTitle.getText().length() == 0) {
                            // This function will fetch the data from Google's books API
                            checkinGoogleAPI(result.getContents());
                        }
    
                    }
                });
    
            }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
            super.onActivityResult(requestCode, resultCode, data);
        }