我正在构建一个用于出售书籍的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);
}
}
}
答案 0 :(得分:0)
好吧,我通过使用g.args['transferorder'] = 'oldestfirst' # so that downloadMtpFileObjects() will properly enumerate through multiple realtime images as we add them
字段作为键字段解决了这个问题。因此,想法是使用条形码扫描器返回的ISBN号调用--transferorder newestfirst
API,并填充EditText
,openlibrary
和Simple drawee view
。
然后检查是否填充了Title Edittext
字段。如果已填充,则表示Author Edittext
API已返回有效数据。如果Title Edittext
为空,请致电OpenLibrary
。
Title Edittext
函数的完整源代码如下所示:
Google's books API