如果一个api返回空值,则调用另一个api

时间:2018-09-29 14:27:24

标签: android api google-books

我正在构建一个用于出售书籍的Android应用。我有一台集成的条形码扫描仪,我的用户可以用它扫描他们要出售的图书的条形码。

我可以使用Zxing库从条形码中获取图书的ISBN号。使用这个ISBN号,我正在从openlibrary.org API中获取数据。

现在的问题是,如果openlibrary没有书籍数据,我想调用Google Books API。

即使没有像Google一样多的数据,我之所以使用openlibrary的原因是,它们提供了高质量的书籍封面图像。 Google没有可用的数据。

因此,现在我需要知道如果openlibrary的响应为null时如何调用Google的API。

这是我完整的代码:

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 :(得分:0)

好吧,我通过使用g.args['transferorder'] = 'oldestfirst' # so that downloadMtpFileObjects() will properly enumerate through multiple realtime images as we add them 字段作为键字段解决了这个问题。因此,想法是使用条形码扫描器返回的ISBN号调用--transferorder newestfirst API,并填充EditTextopenlibrarySimple drawee view

然后检查是否填充了Title Edittext字段。如果已填充,则表示Author Edittext API已返回有效数据。如果Title Edittext为空,请致电OpenLibrary

Title Edittext函数的完整源代码如下所示:

Google's books API