【问题标题】:Using Azure Bing Search API in Android在 Android 中使用 Azure 必应搜索 API
【发布时间】:2013-11-30 02:45:57
【问题描述】:

我正在尝试制作一个执行图像搜索并在网格中显示图像结果的应用程序。由于 Google Image Search API 已弃用且很快将不再可用,因此我正在尝试使用 Bing Search API。

但是,我收到以下错误:

java.io.IOException: No authentication challenges found
    at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:427)
    at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:407)
    at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:356)
    at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:292)
    at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
    at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)

我按照http://learn-it-stuff.blogspot.com/2012/09/using-bing-custom-search-inside-your.html 中的示例进行操作。如果有人遇到过这个问题,或者可以帮助我,那将不胜感激。谢谢!

到目前为止,这是我的代码:

public class MainActivity extends Activity {

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

        AsyncTask <Void, Void, Void> task = new AsyncTask <Void, Void, Void> () {

            protected Void doInBackground(Void... args) {

                //  Uri uri = Uri.parse("https://www.google.com/search?tbm=isch&q=penguin");
                //  Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                //  startActivity(intent);

                /*-------------------------Bing search-------------------------*/
                String searchText = "Hello World";
                searchText = searchText.replace(" ", "%20");
                String accountKey = "MY_APP_ID";
                accountKey = accountKey.replace("+", "%2B");

                byte[] accountKeyBytes = Base64.encodeBase64((accountKey + ":" + accountKey).getBytes());
                String accountKeyEnc = new String(accountKeyBytes);
                URL url;
                try {

                    url = new URL(
                            "https://api.datamarket.azure.com/Bing/Search/v1/"
                                    + "Image?Query=%27" + searchText + "%27");

                    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setRequestProperty("Accept", "application/json");
                    conn.setRequestProperty("Authorization", "Basic " + accountKeyEnc);
                    BufferedReader br = new BufferedReader(new InputStreamReader(
                            (conn.getInputStream())));
                    StringBuilder sb = new StringBuilder();
                    String output;
                    System.out.println("Output from Server .... \n");
                    while ((output = br.readLine()) != null) {
                        sb.append(output);
                    }

                    conn.disconnect();

                    System.out.println(sb);

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                return null;
            }
        };

        task.execute();
    }
}

【问题讨论】:

  • 我不知道你是否还在做这个。但是,您应该首先检查 Android 的基础知识。您的代码中有许多仅来自经验的错误。如果你修复它们,我可能会帮你解决你的问题。
  • 你能把这个代码发给我吗
  • @kumar,你是什么意思?代码就在这里。我一直忙于其他项目,还没有回来。 Luis,我对 Android 并不陌生;此代码来自示例项目。但是,当我回到这个问题时,我们将不胜感激。
  • @lgdroid57 我的意思是你这么说,我正在遵循learn-it-stuff.blogspot.com/2012/09/… 中的示例。你用java教程完成了这个任务,现在我有同样的要求,但我无法做到这一点,如果你回来它对我更有帮助,谢谢你的回应
  • 你解决了吗?如果你这样做了,将不胜感激......

标签: android image search azure bing


【解决方案1】:

以下代码对我有用:

public class SearchAsyncTask extends AsyncTask<Void, Void, Void> {

private final String TAG = getClass().getName();

private String mSearchStr;
private int mNumOfResults = 0;

private Callback mCallback;
private BingSearchResults mBingSearchResults;
private Error mError;

public SearchAsyncTask(String searchStr, int numOfResults, Callback callback) {
    mSearchStr = searchStr;
    mNumOfResults = numOfResults;
    mCallback = callback;
}

@Override
protected Void doInBackground(Void... params) {
    try {
        String searchStr = URLEncoder.encode(mSearchStr);
        String numOfResultsStr = mNumOfResults <= 0 ? "" : "&$top=" + mNumOfResults;
        String bingUrl = "https://api.datamarket.azure.com/Bing/SearchWeb/v1/Web?Query=%27" + searchStr + "%27" + numOfResultsStr + "&$format=json";
        String accountKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
        byte[] accountKeyBytes = Base64.encodeBase64((accountKey + ":" + accountKey).getBytes());
        String accountKeyEnc = new String(accountKeyBytes);

        URL url = null;
        url = new URL(bingUrl);

        URLConnection urlConnection = url.openConnection();
        urlConnection.setRequestProperty("Authorization", "Basic " + accountKeyEnc);
        InputStream response = urlConnection.getInputStream();
        String res = readStream(response);

        Gson gson = (new GsonBuilder()).create();
        mBingSearchResults = gson.fromJson(res, BingSearchResults.class);

        Log.d(TAG, res);
        //conn.disconnect();

    } catch (Exception e) {
        e.printStackTrace();
        mError = new Error(e.getMessage(), e);
        //Log.e(TAG, e.getMessage());
    }

    return null;
}

@Override
protected void onPostExecute(Void result) {
    super.onPostExecute(result);

    if (mCallback != null) {
        mCallback.onComplete(mBingSearchResults, mError);
    }

}

private String readStream(InputStream in) {
    BufferedReader reader = null;
    StringBuilder sb = new StringBuilder();
    try {
        reader = new BufferedReader(new InputStreamReader(in));
        String line = "";
        while ((line = reader.readLine()) != null) {
            //System.out.println(line);
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return sb.toString();


}
public interface Callback {
void onComplete(Object o, Error error);
}
    }

解析结果:

public class BingSearchResults {

public ResultsContent d;

public static class ResultsContent {
    public Result[] results;
    public String __next;
}

public static class Result {
    public String ID;
    public String Title;
    public String Description;
    public String DisplayUrl;
    public String Url;
    public Metadata __metadata;

}

public static class Metadata {
    public String uri;
    public String type;
}

public Result[] getResults(){
    if (d == null)
        return null;
    return d.results;
}

public String getNextUrl(){
    if (d == null)
        return null;
    return d.__next;
}

public boolean isEmpty(){
    return (d == null || d.results == null || d.results.length == 0);
}

public int size(){
    if (d == null || d.results == null)
        return 0;
    return d.results.length;
}
}

您还需要包含外部 jars commons-codec-1.9.jar 和 gson-2.2.4.jar

【讨论】:

  • 哦,亲爱的!谢谢!我去看看!
  • 谢谢!我不得不为图像结果(与 Web 结果)调整一些东西,但这非常有帮助。清理完代码后,我将尝试发布修改后的代码。
  • @igdroid57 你能发布你最终得到的结果吗?
【解决方案2】:

这段代码会发生一点点变化,有时编码器的编译错误会产生问题byte[] accountKeyBytes = Base64.encodeBase64((accountKey + ":" + accountKey).getBytes());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多