Android Places API返回请求被拒绝

Android Places API返回请求被拒绝,android,google-places-api,Android,Google Places Api,我知道这上面有一百万条线索,但我保证我在没有帮助的情况下搜索了很多 我正在尝试使用PlacesAPI返回结果。我尝试了以下方法: 确保密钥有效(它在我使用mapFragment的同一个应用程序中工作,因此我知道密钥是好的。生成密钥时已启用places api)。此外,我生成了一个新的密钥并更新了应用程序,“地图”仍然有效 确保搜索URL格式正确。我从日志中复制并粘贴到浏览器中,对浏览器键进行子绑定,结果会正确返回 这是舱单: <permission android:name="co

我知道这上面有一百万条线索,但我保证我在没有帮助的情况下搜索了很多

我正在尝试使用PlacesAPI返回结果。我尝试了以下方法:

确保密钥有效(它在我使用mapFragment的同一个应用程序中工作,因此我知道密钥是好的。生成密钥时已启用places 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>
我可以发布URL生成方法,但正如您所看到的,URL是从日志中正确形成的

我已经在谷歌上搜索和尝试了几个小时,所以我真的被难住了。我不明白为什么我可以将相同的链接粘贴到浏览器中,将键更改为浏览器键,并获得有效结果(8.3kb),但此处的应用程序返回以下85b结果:

{
"html_attributions" : [],
"results" : [],
"status" : "REQUEST_DENIED"
}
单击api控制台服务列表上的“试用!”链接时,我会得到相同的请求拒绝结果,但是如果我手动创建URL,我会得到有效的结果

编辑:


我在清单中保留了android应用程序密钥,以获得maps权限,但在HTTP请求中,我将密钥更改为browser密钥,并在places查询中获得了成功的结果。我不知道为什么,这没有什么意义。我有点担心这违反了TOS,但我不是很确定。这是否表明我做错了什么?或者有人知道如何联系谷歌报告此事吗?或者我应该一直使用这两个键吗?

好的,我能说的最多,问题是通过使用这两个键解决的。我在清单中使用安卓API键,这可以使mapFragment正常工作

为了让places请求返回“OK”而不是“request_DENIED”,我必须使用来自GoogleAPI控制台的浏览器键。我假设,因为我的应用程序构造了一个搜索URL并使用HTTP连接发送和接收,所以谷歌的服务器认为它是一个浏览器而不是一个应用程序。我不知道这是否是正确的用法,如果我从谷歌得到一个鼻音图,我会更新线程

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", "");

}
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
{
"html_attributions" : [],
"results" : [],
"status" : "REQUEST_DENIED"
}