2013-05-24 7 views
2

Я знаю, что на этот счет существует миллион потоков, но я искал многих из них без какой-либо помощи, я обещаю.Places API возвращает REQUEST_DENIED

Я пытаюсь использовать API мест, чтобы возвращать результаты. Я пробовал следующее:

Обеспечить действительный ключ (он работает в этом же приложении, где я использую mapFragment, поэтому я знаю, что ключ хорош. Места api были включены во время создания ключа.). Кроме того, я создал новый ключ и обновил приложение, карта все еще работает.

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

Вот манифеста:

<permission 
    android:name="com.example.mapdemo.permission.MAPS_RECEIVE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.example.mapdemo.permission.MAPS_RECEIVE" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

<uses-feature 
    android:glEsVersion="0x00020000" 
    android:required="true" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.berrmal.locationbox.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="AIza**********************************Y" /> 

    <service 
     android:name="com.berrmal.locationbox.LocationBoxService" 
     android:enabled="true" 
     android:exported="false" > 
    </service> 
</application> 

Вот AsyncTask:

public class PlacesProvider extends AsyncTask<String, Void, ArrayList<Place>> { 
    //starting arg, progress update type, return from doInBack() 
    public PlacesProvider() { 

    } 

    public ArrayList<Place> doInBackground(String... args) { 
     //args[0] = search URL 
     Log.d("lbServ","doing in background"); 
     ArrayList<Place> resultList = new ArrayList<Place>(); 
     DLJSON dLJSON = new DLJSON(); 
     try { 
      resultList = dLJSON.getResults(args[0]); 
     } catch (UnsupportedEncodingException uee) { 
      Log.d("lbServ","unsupp encode ex"); 
     } catch (IOException ioe) { 
      Log.d("lbServ","IO exception"); 
     } catch (IllegalStateException ils) { 
      Log.d("lbserv","iill state exception"); 
      ils.printStackTrace(); 
     } catch (Exception ex) { 
      Log.d("lbServ", "unknown exception in dlJson"); 
     } 
     if (resultList == null) { 
      Log.d("lbServ","resultList is null"); 
     } 
     return resultList; 
    } 

    protected void onPostExecute(ArrayList<Place> result) { 
     Log.d("lbServ","onnPostExecute"); 
     placesList = result; 
     //TODO do something with the result, i.e. send it to MainActivity via instance that bound to server 
     Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class); 
     //resultIntent.setComponent(new ComponentName("com.berrmal.locationbox", "MainActivity")); 
     resultIntent.putExtra("SearchSuccess", true); 
     resultIntent.putExtra("searchID", 1); 
     resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     getApplication().startActivity(resultIntent); 
     Log.d("lbServ","service suicide"); 
     stopSelf(); 
    } 

И JSON Опрашивающее/анализатор

public ArrayList<Place> getResults(String searchURL) throws UnsupportedEncodingException, IOException, IllegalStateException{ 
    try { 
     url = new URL(searchURL); 
     Log.d("lbDLJSON",url.toString()); 
    } catch (Exception ex) { 
     Log.d("lbDLJSON", "malformed URL"); 
    } 

    try { 
      urlConn = (HttpsURLConnection) url.openConnection(); 
      Log.d("dlJson","url connection open"); 
      is = new BufferedInputStream(urlConn.getInputStream()); 
      Log.d("dljson","buffered stream open"); 
    } catch (IOException ioe) { 
      Log.d("lbDLJSON", "io exception"); 
    } catch (Exception e) { 
     Log.d("lbDLJSON", "that other exception"); 
    } 
    jsonReader = new JsonReader(new InputStreamReader(is, "UTF-8")); 
    Log.d("lbjson","json and inputstream readers exists"); 
    resultList = new ArrayList<Place>(); 
    jsonReader.beginObject(); 
    Log.d("lbjson", "top level object open"); 
    while (jsonReader.hasNext()) { 
     String name = jsonReader.nextName().toString(); 
     if (name.equals("results")) { 
      jsonReader.beginArray(); 
      while (jsonReader.hasNext()); { 
       //resultList.add(placeBuilder(jsonReader)); 
       Log.d("lbjson", "results were null"); 
      } 
      jsonReader.endArray(); 
     } else if (name.equals("status")){ 
      statusCode = jsonReader.nextString().toString(); 
      Log.d("dljson", "status code: " + statusCode); 
     } else { 
      Log.d("lbjson", "skipped " + name); 
      jsonReader.skipValue(); 
     } 

    } 
    jsonReader.endObject(); 
    Log.d("lbDLJSON", "top level JSON object closed"); 
    jsonReader.close(); 
    urlConn.disconnect(); 

    return resultList; 
    //Log.d("lbjson", ""); 

} 

выход LogCat:

05-24 16:04:07.859: D/lbServ(19523): search 
05-24 16:04:07.859: D/lbServ(19523): executeAsyncTask 
05-24 16:04:07.859: D/lbServ(19523): doing in background 
05-24 16:04:07.859: D/lbDLJSON(19523): https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=AIza***************************Y&location=34.0937751,-117.6730797&radius=15000&sensor=true&keyword=food 
05-24 16:04:07.859: D/dlJson(19523): url connection open 
05-24 16:04:08.199: D/dljson(19523): buffered stream open 
05-24 16:04:08.199: D/lbjson(19523): json and inputstream readers exists 
05-24 16:04:08.199: D/lbjson(19523): top level object open 
05-24 16:04:08.199: D/lbjson(19523): skipped html_attributions 
05-24 16:04:08.199: D/lbjson(19523): results were null 
05-24 16:04:08.199: D/dljson(19523): status code: REQUEST_DENIED 
05-24 16:04:08.199: D/lbDLJSON(19523): top level JSON object closed 
05-24 16:04:08.199: D/lbServ(19523): onnPostExecute 
05-24 16:04:08.220: D/lbServ(19523): service suicide 

Я могу опубликовать метод генерации URL-адресов, но, как вы видите, URL-адрес сформирован надлежащим образом из журнала.

Я работаю в поисковых системах и пробовал несколько часов, так что я действительно в тупике. Я не понимаю, почему я могу вставить ту же ссылку в браузер, изменить ключ на ключ браузера, и получить достоверные результаты (8.3kb), но приложение здесь возвращает следующий результат: 8

{ 
"html_attributions" : [], 
"results" : [], 
"status" : "REQUEST_DENIED" 
} 

Я получаю тот же запрос, что и отрицательный результат при нажатии «попробуйте!». ссылку на список служб консоли api, но если я сделаю URL вручную, я получу действительные результаты ...?

EDIT:

Я держал андроид ключ приложения в манифесте, для разрешения карты, но в запросе HTTP, я изменил ключ к ключу браузера, и получил успешные результаты по запросу мест. Я не знаю почему, это не имеет смысла. Я немного боюсь, что это нарушение TOS, но я не уверен. Является ли это показателем того, что я делаю неправильно? Или кто-нибудь знает способ связаться с Google, чтобы сообщить об этом? Или я должен был использовать оба ключа все время?

ответ

1

ОК, насколько я могу судить, проблема была решена с помощью обоих ключей. Я использую ключ API Android в своем манифесте, это дает правильную работу mapFragment.

Чтобы вернуть запрос мест «ОК», а не «REQUEST_DENIED», мне пришлось использовать ключ браузера с консоли Google API. Я полагаю, потому что мое приложение создает URL-адрес поиска и использует HTTP-соединение для отправки и получения, сервер google считает своим браузером, а не приложением. Я не знаю, правильное ли это использование, если я получу nastygram от Google, я обновлю поток.

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