Вызовите другой API, если один API возвращает нулевое значение - PullRequest
0 голосов
/ 29 сентября 2018

Я создаю приложение для Android, чтобы продавать книги.У меня есть встроенный сканер штрих-кода, с помощью которого мои пользователи могут сканировать штрих-код книги, который они хотят продать.

Я могу получить номер ISBN книги из штрих-кода, используя библиотеку Zxing.Используя этот номер ISBN, я получаю данные из API openlibrary.org.

Теперь проблема в том, что я хочу вызвать API Google Книг, если openlibrary не содержит данных этой книги.

Причина, по которой я использую openlibrary, хотя у них не так много данных, как у Google, заключается в том, что они предоставляют изображения обложек хорошего качества.У Google нет этих данных.

Так что теперь мне нужно знать, как вызвать API Google, если ответ openlibrary равен нулю.

Вот мой полный код:

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


}

1 Ответ

0 голосов
/ 02 октября 2018

Хорошо. Я решил эту проблему, используя поле EditText в качестве ключевого поля.Поэтому идея состоит в том, чтобы вызвать API openlibrary с номером ISBN, возвращенным сканером штрих-кода, и заполнить поля Simple drawee view, Title Edittext и Author Edittext.

, а затем проверить, является ли поле Title Edittextзаселены или нет.Если он заполнен, это означает, что OpenLibrary API вернул верные данные.Если Title Edittext пусто, позвоните Google's books API.

Полный исходный код для функции OnActivityResult() показан ниже:

@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);
    }
...