2013-11-30 5 views
2

Я пытаюсь создать приложение, которое выполняет поиск изображений и отображает результаты изображения в сетке. Поскольку API поиска изображений Google устарел и больше не будет доступен в ближайшее время, я пытаюсь использовать Bing Search API.Использование API поиска Azure Bing в Android

Однако, я получаю следующее сообщение об ошибке:

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(); 
    } 
} 
+0

Я не знаю, продолжаете ли вы по-прежнему работать над этим. Но сначала вы должны проверить основы Android. В вашем коде есть много ошибок, которые исходят только из опыта. Если вы их исправите, я могу помочь вам с вашим вопросом. –

+0

может у, пожалуйста, пришлите мне этот код – kumar

+0

@kumar, что вы имеете в виду? Код здесь. Я был занят другими проектами и еще не вернулся к этому. Луис, я не новичок в Android; этот код исходит из образца проекта. Однако, когда я вернусь к этому, помощь будет высоко оценена. – lgdroid57

ответ

2

Следующий код работает для меня:

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

Вы также должны включать в себя внешние баночки commons-codec-1.9.jar и gson-2.2.4.jar

+0

О, сладкий! Благодаря! Я посмотрю! – lgdroid57

+0

Спасибо! Я должен был подстроить несколько вещей для Image Results (vs Web Results), но это было очень полезно. Как только я очистил код, я постараюсь опубликовать свой переработанный код. – lgdroid57

+0

@ igdroid57 вы могли бы опубликовать то, что у вас получилось? – rothschild86

0

Небольшое изменение в этом коде иногда происходит с ошибкой компиляции ошибки кодирования byte[] accountKeyBytes = Base64.encodeBase64((accountKey + ":" + accountKey).getBytes());

Смежные вопросы