MapActivity查询最近的医院/餐厅不工作 [英] MapActivity query for nearest hospital/restaurant not working

查看:239
本文介绍了MapActivity查询最近的医院/餐厅不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑:解决!除了丹尼尔的回答(救了我的命),这里就是我所做的:
1.取代了MapActivity2类服务器API密钥。
2.让在清单和maps_activites.xml其他键。是Android的API密钥
3.启用谷歌开发人员API以下API:
谷歌地图Android的API
Android版谷歌
地方API 谷歌的地方API Web服务

4. BOOM!有效。下面是C在任何情况下,我的GitHub库中的$ C $: https://github.com/bholagabbar/AurumHealthApp
我尝试从我的当前位置最近的餐馆。我现在用的是code我在网上找到<一href="http://stackoverflow.com/questions/30161395/im-trying-to-search-nearby-places-such-as-banks-restaurants-atms-inside-the-d/30162174#30162174">here.不过,我得到以下错误。我已经把整个的logcat执行和黑体字突出显示了错误:

  

4月11日至30日:53:31.000 25292-25292 /? I /艺术:晚启用-Xcheck:JNI

4月11日至30号:53:31.033 25292-25302 /? I /艺术:调试程序不再有效
&LT;> 4月11日至三十○日:53:31.100 25292-25311 /? I / GMPM:应用程序测试正在启动
4月11日至30号:53:31.109 25292-25311 /? E / GMPM:getGoogleAppId失败,状态:10
4月11日至30日:53:31.111 25292-25311 /? E / GMPM:上传是不可能的。应用测量禁用

4月11号至三十零号:53:31.125 25292-25314 /? D / OpenGLRenderer:使用EGL_SWAP_BEHAVIOR_ preSERVED:true`11-30 04:53:31.135 25292-25292 /? D /图集:验证地图...
四月11日至30号:53:31.178 25292-25314 /? I /肾上腺EGL:EGL 1.4高通公司构建:(Ibddc658e36)
4月11日至三十〇号:53:31.178 25292-25314 /? I /肾上腺EGL:OpenGL ES的着色器编译器版本:E031.25.03.04
4月11号至30日:53:31.178 25292-25314 /? I /肾上腺EGL:建立日期:15年8月10日星期一
4月11日至三十○日:53:31.178 25292-25314 /? I /肾上腺EGL:当地分公司:工作区
4月11日至三十号:53:31.178 25292-25314 /? I /肾上腺EGL:远程分支:
4月11日至三十〇号:53:31.178 25292-25314 /? I /肾上腺EGL:本地补丁:
4月11日至三十〇号:53:31.178 25292-25314 /? I /肾上腺EGL:重建科:
4月11日至30日:53:31.179 25292-25314 /? I / OpenGLRenderer:初始化EGL,1.4版
4月11号至三十〇号:53:31.193 25292-25314 /? D / OpenGLRenderer:启用调试模式0
4月11日至三十○号:53:32.663 25292-25292 / com.iotaconcepts.aurum I /编舞:跳过37帧!该应用程序可能会做它的主线程的工作太多了
11-30 04:53:32.737 25292-25314 / com.iotaconcepts.aurum V / RenderScript:应用要求CPU执行
11-30 04:53 :32.747 25292-25314 / com.iotaconcepts.aurum V / RenderScript:0xb7f96960发起话题(S),CPU的4
四月11日至30号:53:36.092 25292-25292 / com.iotaconcepts.aurum D / AndroidRuntime:关闭VM
4月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:致命异常:主要
4月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurumë / AndroidRuntime:工艺:com.iotaconcepts.aurum,PID:25292
4月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:java.lang.RuntimeException的:无法启动的活动ComponentInfo { com.iotaconcepts.aurum / com.iotaconcepts.aurum.MapsActivity2}:显示java.lang.NullPointerException:尝试调用虚拟方法无效com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMa$p$padyCallback)'在一个空对象引用
11-30 04:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
11-30 04:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
四月11号至30日:53:36.093 25292-25292 / COM。 iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.access $ 800(ActivityThread.java:155)
4月11日至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在机器人。 app.ActivityThread $ H.handleMessage(ActivityThread.java:1317)
4月11号至三十日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.os.Handler.dispatchMessage(Handler.java :102)
4月11号至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.os.Looper.loop(Looper.java:135)
4月11号至30日: 53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.main(ActivityThread.java:5343)
4月11号至30号:53:36.093 25292-25292 / com.iotaconcepts。金E / AndroidRuntime:在java.lang.reflect.Method.invoke(本机方法)
4月11号至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在java.lang.reflect中。 Method.invoke(Method.java:372)
四月11日至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit的.java:907)
4月11日至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
四月11号至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:致:显示java.lang.NullPointerException:尝试调用虚拟方法无效com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMa$p$padyCallback)'在一个空对象引用
四月11号至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在com.iotaconcepts.aurum.MapsActivity2.onCreate(MapsActivity2.java:42)

4月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.Activity.performCreate(Activity.java:6010)
4月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
四月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
四月11号至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.handleLaunchActivity( ActivityThread.java:2413)
四月11日至30日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.access $ 800(ActivityThread.java:155)
11 -30 04:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1317)
4月11日至三十零日:53:36.093 25292- 25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.os.Handler.dispatchMessage(Handler.java:102)
四月11日至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.os.Looper.loop(Looper.java:135)
4月11号至30号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在android.app.ActivityThread.main(ActivityThread。 java的:5343)
4月11日至三十○日:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在java.lang.reflect.Method.invoke(本机方法)
4月11日至三十○日: 53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在java.lang.reflect.Method.invoke(Method.java:372)
4月11号至三十号:53:36.093 25292-25292 / COM。 iotaconcepts.aurum E / AndroidRuntime:在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:907)
4月11号至三十号:53:36.093 25292-25292 / com.iotaconcepts.aurum E / AndroidRuntime:在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)

我已经失去了我的头在过去的2小时试图弄清楚我们的错误,但徒劳无功。这里是$ C $下活动:

修改的修复程序后,这里是在code

包com.iotaconcepts.aurum;

 进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.support.v7.app.AppCompatActivity;
进口android.util.Log;

进口com.google.android.gms.maps.GoogleMap;
进口com.google.android.gms.maps.OnMa preadyCallback;
进口com.google.android.gms.maps.SupportMapFragment;
进口com.google.android.gms.maps.model.BitmapDesc​​riptorFactory;
进口com.google.android.gms.maps.model.LatLng;
进口com.google.android.gms.maps.model.Marker;
进口com.google.android.gms.maps.model.MarkerOptions;

进口org.json.JSONArray;
进口org.json.JSONException;
进口org.json.JSONObject;

进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口的java.io.InputStream;
进口java.io.InputStreamReader中;
进口java.net.HttpURLConnection中;
进口的java.net.URL;
进口的java.util.ArrayList;
进口的java.util.HashMap;
进口的java.util.List;

公共类MapsActivity2扩展AppCompatActivity实现OnMa preadyCallback
{
    私人GoogleMap的mGoogleMap;
    SupportMapFragment mapFrag;

    @覆盖
    保护无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);

        mapFrag =(SupportMapFragment)getSupportFragmentManager()findFragmentById(R.id.map)。
        mapFrag.getMapAsync(本);

    }

    @覆盖
    公共无效onMa pready(GoogleMap的GoogleMap的)
    {
        mGoogleMap = GoogleMap的;
        mGoogleMap.setMyLocationEnabled(真正的);
        StringBuilder的sbValue =新的StringBuilder(sbMethod());
        PlacesTask placesTask =新PlacesTask();
        placesTask.execute(sbValue.toString());
    }

    公众的StringBuilder sbMethod()
    {

        //这里用你的当前位置
        双mLatitude = 37.77657;
        双mLongitude = -122.417506;

        StringBuilder的SB =新的StringBuilder(https://maps.googleapis.com/maps/api/place/nearbysearch/json?);
        sb.append(位置=+ mLatitude +,+ mLongitude);
        sb.append(与&amp;半径= 5000);
        sb.append(&放大器;类型=+餐厅);
        sb.append(&放大器,传感器=真正的);

        sb.append(&放大器;关键= AIza ************************);

        Log.d(地图,URL:+ sb.toString());

        返回某人;
    }

    私有类PlacesTask扩展的AsyncTask&LT;字符串,整数,字符串&GT;
    {

        字符串数据= NULL;

        这个对象//通过执行()调用方法
        @覆盖
        保护字符串doInBackground(字符串... URL){
            尝试 {
                数据= downloadUrl(URL [0]);
            }赶上(例外五){
                Log.d(后台任务,e.toString());
            }
            返回的数据;
        }

        //完整的执行doInBackground的(后执行)的方法
        @覆盖
        保护无效onPostExecute(字符串结果){
            ParserTask parserTask =新ParserTask();

            //开始解析JSON格式的谷歌的地方
            //调用了doInBackground()之类的ParserTask的方法
            parserTask.execute(结果);
        }
    }

    私人字符串downloadUrl(字符串strUrl)抛出IOException异常
    {
        字符串数据=;
        的InputStream的IStream = NULL;
        HttpURLConnection类的URLConnection = NULL;
        尝试 {
            网址URL =新的URL(strUrl);

            //创建一个HTTP连接,与URL沟通
            的URLConnection =(HttpURLConnection类)url.openConnection();

            //连接给url
            urlConnection.connect();

            //从URL中读取数据
            的IStream = urlConnection.getInputStream();

            的BufferedReader BR =新的BufferedReader(新的InputStreamReader(的IStream));

            StringBuffer的SB =新的StringBuffer();

            串线=;
            而((行= br.readLine())!= NULL){
                sb.append(线);
            }

            数据= sb.toString();

            br.close();

        }赶上(例外五){
            Log.d(异常,e.toString());
        } 最后 {
            iStream.close();
            urlConnection.disconnect();
        }
        返回的数据;
    }

    私有类ParserTask扩展的AsyncTask&LT;字符串,整数,列表&LT; HashMap的&LT;字符串,字符串&GT;&GT;&GT; {

        的JSONObject jObject;

        这个对象//通过执行()调用方法
        @覆盖
        受保护的名单,其中,HashMap的&LT;字符串,字符串&GT;&GT; doInBackground(字符串... jsonData){

            名单&LT; HashMap的&LT;字符串,字符串&GT;&GT;地方= NULL;
            Place_JSON placeJson =新Place_JSON();

            尝试 {
                jObject =新的JSONObject(jsonData [0]);

                地方= placeJson.parse(jObject);

            }赶上(例外五){
                Log.d(异常,e.toString());
            }
            返回的地方;
        }

        //完整的执行doInBackground的(后执行)的方法
        @覆盖
        保护无效onPostExecute(名单&LT; HashMap的&LT;字符串,字符串&GT;&GT;列表){

            Log.d(地图,列表的大小:+则为list.size());
            //清除所有现有的标记;
            mGoogleMap.clear();

            的for(int i = 0; I&LT;则为list.size();我++){

                //创建一个标志
                MarkerOptions markerOptions =新MarkerOptions();

                //获取从地方名单的地方
                HashMap的&LT;字符串,字符串&GT; hmPlace = list.get(ⅰ);


                //获取地方纬度
                双纬度= Double.parseDouble(hmPlace.get(土地增值税));

                //获取地方的经度
                双LNG = Double.parseDouble(hmPlace.get(LNG));

                //获取名称
                字符串名称= hmPlace.get(PLACE_NAME);

                Log.d(地图,地方:+姓名);

                //获取附近
                附近的String = hmPlace.get(附近);

                经纬度经纬度=新的经纬度(纬度,经度);

                //设置为标记的位置
                markerOptions.position(经纬度);

                markerOptions.title(名字+:+附近);

                markerOptions.icon(BitmapDesc​​riptorFactory.defaultMarker(BitmapDesc​​riptorFactory.HUE_MAGENTA));

                //设置标记上的触摸位置
                标记M = mGoogleMap.addMarker(markerOptions);

            }
        }
    }
    公共类Place_JSON {

        / **
         *收到的JSONObject并返回一个列表
         * /
        公开名单&LT; HashMap的&LT;字符串,字符串&GT;&GT;解析(JSONObject的jObject){

            JSONArray jPlaces = NULL;
            尝试 {
                / **获取所有元素的'地方'数组中* /
                jPlaces = jObject.getJSONArray(结果);
            }赶上(JSONException E){
                e.printStackTrace();
            }
            / **调用getPlaces和JSON对象的数组
             *其中重present一个地方的每个JSON对象
             * /
            返回getPlaces(jPlaces);
        }

        私人列表&LT; HashMap的&LT;字符串,字符串&GT;&GT; getPlaces(JSONArray jPlaces){
            INT placesCount = jPlaces.length();
            名单&LT; HashMap的&LT;字符串,字符串&GT;&GT; placesList =新的ArrayList&LT; HashMap的&LT;字符串,字符串&GT;&GT;();
            HashMap的&LT;字符串,字符串&GT;请将= NULL;

            / **以每一个地方,解析并添加到列表对象* /
            的for(int i = 0; I&LT; placesCount;我++){
                尝试 {
                    / **调用getPlace与地方JSON对象分析的地方* /
                    地方= getPlace((的JSONObject)jPlaces.get(一));
                    placesList.add(地方);
                }赶上(JSONException E){
                    e.printStackTrace();
                }
            }
            返回placesList;
        }

        / **
         *解析广场JSON对象
         * /
        私人的HashMap&LT;字符串,字符串&GT; getPlace(的JSONObject jPlace)
        {

            HashMap的&LT;字符串,字符串&GT;地方=新的HashMap&LT;字符串,字符串&GT;();
            字符串地名=-NA-;
            字符串附近=-NA-;
            串纬度=;
            字符串经度=;
            String引用=;

            尝试 {
                //提取地名,如果有的话
                如果(!jPlace.isNull(名字)){
                    地名= jPlace.getString(姓名);
                }

                //提取地方气象台,(如果可用)
                如果(!jPlace.isNull(附近)){
                    附近= jPlace.getString(附近);
                }

                纬度= jPlace.getJSONObject(几何)getJSONObject(位置)的getString(土地增值税)。;
                经度= jPlace.getJSONObject(几何)getJSONObject(位置)的getString(LNG)。
                基准= jPlace.getString(参考);

                place.put(PLACE_NAME,地名);
                place.put(附近,附近地区);
                place.put(土地增值税,纬度);
                place.put(LNG,经度);
                place.put(参考,参考);

            }赶上(JSONException E){
                e.printStackTrace();
            }
            返回的地方;
        }
    }

}
 

XML文件是:

 &LT; XML版本=1.0编码=UTF-8&GT?;
&LT; LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
              机器人:方向=垂直机器人:layout_width =match_parent
              机器人:layout_height =match_parent&GT;

    &LT;片段的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
              的xmlns:工具=htt​​p://schemas.android.com/tool​​s
              的xmlns:地图=htt​​p://schemas.android.com/apk/res-auto
              机器人:layout_width =match_parent
              机器人:layout_height =match_parent
              机器人:ID =@ + ID /图
              工具:上下文=com.iotaconcepts.aurum.MapsActivity2
              机器人:名称=com.google.android.gms.maps.SupportMapFragment/&GT;

&LT; / LinearLayout中&GT;
 

清单文件:

 &LT; XML版本=1.0编码=UTF-8&GT?;
&LT;舱单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    包=com.iotaconcepts.aurum&GT;

    &LT;使用-权限的Andr​​oid:名称=android.permission.ACCESS_FINE_LOCATION/&GT;

    &LT;使用库机器人:名称=com.google.android.maps/&GT;

    !&LT;  - 使用 - 允许机器人:名称=android.permission.INTERNET对/  - &GT;
    &lt;应用
        机器人:allowBackup =真
        机器人:图标=@纹理映射/ ic_launcher
        机器人:标签=@字符串/ APP_NAME
        机器人:主题=@风格/ MyMaterialTheme&GT;
        &LT;活动
            机器人:名称=。MainActivity
            机器人:标签=奥罗&GT;
            &LT;意向滤光器&gt;
                &lt;作用机器人:名称=android.intent.action.MAINACTIVITY/&GT;

                &LT;类机器人:名称=android.intent.category.DEFAULT/&GT;
            &所述; /意图滤光器&gt;
        &LT; /活性GT;
        &LT;活动
            机器人:名称=。LoginActivity
            机器人:标签=奥罗
            机器人:主题=@风格/ ColorfulActionBarTheme&GT;
            &LT;意向滤光器&gt;
                &lt;作用机器人:名称=android.intent.action.LOGIN/&GT;

                &LT;类机器人:名称=android.intent.category.DEFAULT/&GT;
            &所述; /意图滤光器&gt;
        &LT; /活性GT;
        &LT;活动
            机器人:名称=泼水节
            机器人:标签=奥罗
            机器人:主题=@风格/ ColorfulActionBarTheme&GT;
            &LT;意向滤光器&gt;
                &lt;作用机器人:名称=android.intent.action.MAIN/&GT;

                &LT;类机器人:名称=android.intent.category.LAUNCHER/&GT;
            &所述; /意图滤光器&gt;
        &LT; /活性GT;
        &LT;活动
            机器人:诊断NAME =
            机器人:标签=奥罗
            机器人:主题=@风格/ Theme.Transparent&GT;
            &LT;意向滤光器&gt;
                &lt;作用机器人:名称=android.intent.action.DIAGNOSIS/&GT;

                &LT;类机器人:名称=android.intent.category.DEFAULT/&GT;
            &所述; /意图滤光器&gt;
        &LT; /活性GT;

        &LT;! - 
             该API密钥的谷歌地图为基础的API被定义为一个字符串资源。
             (请参阅文件RES /价值/ google_maps_api.xml)。
             请注意,API密钥是与用于签署APK加密密钥。
             需要不同的API密钥对每个加密密钥,包括用于释放键
             签署APK发布。
             您可以定义调试键和SRC /调试/和src /上映/发行目标。
         - &GT;
        &所述;元数据
            机器人:名称=com.google.android.geo.API_KEY
            机器人:值=AIza ********/&GT;

        &LT;活动
            机器人:MapsActivity2NAME =
            机器人:标签=@字符串/ title_activity_maps2&GT;
        &LT; /活性GT;
        &LT;活动机器人:testactivityNAME =&GT;
        &LT; /活性GT;
    &LT; /用途&gt;

&LT; /舱单&GT;
 

解决方案

我只是跑你code和得到它的工作。它看起来像的主要问题是,有和查询网址API密钥之间的空间。

您还没有任何code调用 getMapAsync(),所以你没有得到的地图参考和 onMa pready()就不会被调用。

更新:对于NullPointerException异常,这是错误的布局xml文件正在使用的结果。使用的setContentView(R.layout.activity_maps2); ,而不是 activity_main

另外,一定要使用服务器API密钥和地方网络API。

下面是为我工作的code:

 进口android.os.AsyncTask;
进口android.os.Bundle;
进口android.support.v4.app.FragmentActivity;
进口android.support.v7.app.AppCompatActivity;
进口android.util.Log;
进口com.google.android.gms.maps.GoogleMap;
进口com.google.android.gms.maps.OnMa preadyCallback;
进口com.google.android.gms.maps.SupportMapFragment;
进口com.google.android.gms.maps.model.BitmapDesc​​riptorFactory;
进口com.google.android.gms.maps.model.LatLng;
进口com.google.android.gms.maps.model.Marker;
进口com.google.android.gms.maps.model.MarkerOptions;
进口org.json.JSONArray;
进口org.json.JSONException;
进口org.json.JSONObject;
进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口的java.io.InputStream;
进口java.io.InputStreamReader中;
进口java.net.HttpURLConnection中;
进口的java.net.URL;
进口的java.util.ArrayList;
进口的java.util.HashMap;
进口的java.util.List;

公共类MapsActivity2扩展AppCompatActivity实现OnMa preadyCallback
{
    私人GoogleMap的mGoogleMap;
    SupportMapFragment mapFrag;

    @覆盖
    保护无效的onCreate(包savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        //错误之一:
        //setContentView(R.layout.activity_main);

        //使用这个:
        的setContentView(R.layout.activity_maps2);

        mapFrag =(SupportMapFragment)getSupportFragmentManager()findFragmentById(R.id.map)。
        mapFrag.getMapAsync(本);

    }

    @覆盖
    公共无效onMa pready(GoogleMap的GoogleMap的)
    {
        mGoogleMap = GoogleMap的;
        mGoogleMap.setMyLocationEnabled(真正的);
        StringBuilder的sbValue =新的StringBuilder(sbMethod());
        PlacesTask placesTask =新PlacesTask();
        placesTask.execute(sbValue.toString());
    }

    公众的StringBuilder sbMethod()
    {

        //这里用你的当前位置
        双mLatitude = 37.77657;
        双mLongitude = -122.417506;

        StringBuilder的SB =新的StringBuilder(https://maps.googleapis.com/maps/api/place/nearbysearch/json?);
        sb.append(位置=+ mLatitude +,+ mLongitude);
        sb.append(与&amp;半径= 5000);
        sb.append(&放大器;类型=+餐厅);
        sb.append(&放大器,传感器=真正的);

        sb.append(&放大器;关键= AIza *********);

        Log.d(地图,URL:+ sb.toString());

        返回某人;
    }

    私有类PlacesTask扩展的AsyncTask&LT;字符串,整数,字符串&GT;
    {

        字符串数据= NULL;

        这个对象//通过执行()调用方法
        @覆盖
        保护字符串doInBackground(字符串... URL){
            尝试 {
                数据= downloadUrl(URL [0]);
            }赶上(例外五){
                Log.d(后台任务,e.toString());
            }
            返回的数据;
        }

        //完整的执行doInBackground的(后执行)的方法
        @覆盖
        保护无效onPostExecute(字符串结果){
            ParserTask parserTask =新ParserTask();

            //开始解析JSON格式的谷歌的地方
            //调用了doInBackground()之类的ParserTask的方法
            parserTask.execute(结果);
        }
    }

    私人字符串downloadUrl(字符串strUrl)抛出IOException异常
    {
        字符串数据=;
        的InputStream的IStream = NULL;
        HttpURLConnection类的URLConnection = NULL;
        尝试 {
            网址URL =新的URL(strUrl);

            //创建一个HTTP连接,与URL沟通
            的URLConnection =(HttpURLConnection类)url.openConnection();

            //连接给url
            urlConnection.connect();

            //从URL中读取数据
            的IStream = urlConnection.getInputStream();

            的BufferedReader BR =新的BufferedReader(新的InputStreamReader(的IStream));

            StringBuffer的SB =新的StringBuffer();

            串线=;
            而((行= br.readLine())!= NULL){
                sb.append(线);
            }

            数据= sb.toString();

            br.close();

        }赶上(例外五){
            Log.d(异常,e.toString());
        } 最后 {
            iStream.close();
            urlConnection.disconnect();
        }
        返回的数据;
    }

    私有类ParserTask扩展的AsyncTask&LT;字符串,整数,列表&LT; HashMap的&LT;字符串,字符串&GT;&GT;&GT; {

        的JSONObject jObject;

        这个对象//通过执行()调用方法
        @覆盖
        受保护的名单,其中,HashMap的&LT;字符串,字符串&GT;&GT; doInBackground(字符串... jsonData){

            名单&LT; HashMap的&LT;字符串,字符串&GT;&GT;地方= NULL;
            Place_JSON placeJson =新Place_JSON();

            尝试 {
                jObject =新的JSONObject(jsonData [0]);

                地方= placeJson.parse(jObject);

            }赶上(例外五){
                Log.d(异常,e.toString());
            }
            返回的地方;
        }

        //完整的执行doInBackground的(后执行)的方法
        @覆盖
        保护无效onPostExecute(名单&LT; HashMap的&LT;字符串,字符串&GT;&GT;列表){

            Log.d(地图,列表的大小:+则为list.size());
            //清除所有现有的标记;
            mGoogleMap.clear();

            的for(int i = 0; I&LT;则为list.size();我++){

                //创建一个标志
                MarkerOptions markerOptions =新MarkerOptions();

                //获取从地方名单的地方
                HashMap的&LT;字符串,字符串&GT; hmPlace = list.get(ⅰ);


                //获取地方纬度
                双纬度= Double.parseDouble(hmPlace.get(土地增值税));

                //获取地方的经度
                双LNG = Double.parseDouble(hmPlace.get(LNG));

                //获取名称
                字符串名称= hmPlace.get(PLACE_NAME);

                Log.d(地图,地方:+姓名);

                //获取附近
                附近的String = hmPlace.get(附近);

                经纬度经纬度=新的经纬度(纬度,经度);

                //设置为标记的位置
                markerOptions.position(经纬度);

                markerOptions.title(名字+:+附近);

                markerOptions.icon(BitmapDesc​​riptorFactory.defaultMarker(BitmapDesc​​riptorFactory.HUE_MAGENTA));

                //设置标记上的触摸位置
                标记M = mGoogleMap.addMarker(markerOptions);

            }
        }
    }
    公共类Place_JSON {

        / **
         *收到的JSONObject并返回一个列表
         * /
        公开名单&LT; HashMap的&LT;字符串,字符串&GT;&GT;解析(JSONObject的jObject){

            JSONArray jPlaces = NULL;
            尝试 {
                / **获取所有元素的'地方'数组中* /
                jPlaces = jObject.getJSONArray(结果);
            }赶上(JSONException E){
                e.printStackTrace();
            }
            / **调用getPlaces和JSON对象的数组
             *其中重present一个地方的每个JSON对象
             * /
            返回getPlaces(jPlaces);
        }

        私人列表&LT; HashMap的&LT;字符串,字符串&GT;&GT; getPlaces(JSONArray jPlaces){
            INT placesCount = jPlaces.length();
            名单&LT; HashMap的&LT;字符串,字符串&GT;&GT; placesList =新的ArrayList&LT; HashMap的&LT;字符串,字符串&GT;&GT;();
            HashMap的&LT;字符串,字符串&GT;请将= NULL;

            / **以每一个地方,解析并添加到列表对象* /
            的for(int i = 0; I&LT; placesCount;我++){
                尝试 {
                    / **调用getPlace与地方JSON对象分析的地方* /
                    地方= getPlace((的JSONObject)jPlaces.get(一));
                    placesList.add(地方);
                }赶上(JSONException E){
                    e.printStackTrace();
                }
            }
            返回placesList;
        }

        / **
         *解析广场JSON对象
         * /
        私人的HashMap&LT;字符串,字符串&GT; getPlace(的JSONObject jPlace)
        {

            HashMap的&LT;字符串,字符串&GT;地方=新的HashMap&LT;字符串,字符串&GT;();
            字符串地名=-NA-;
            字符串附近=-NA-;
            串纬度=;
            字符串经度=;
            String引用=;

            尝试 {
                //提取地名,如果有的话
                如果(!jPlace.isNull(名字)){
                    地名= jPlace.getString(姓名);
                }

                //提取地方气象台,(如果可用)
                如果(!jPlace.isNull(附近)){
                    附近= jPlace.getString(附近);
                }

                纬度= jPlace.getJSONObject(几何)getJSONObject(位置)的getString(土地增值税)。;
                经度= jPlace.getJSONObject(几何)getJSONObject(位置)的getString(LNG)。
                基准= jPlace.getString(参考);

                place.put(PLACE_NAME,地名);
                place.put(附近,附近地区);
                place.put(土地增值税,纬度);
                place.put(LNG,经度);
                place.put(参考,参考);

            }赶上(JSONException E){
                e.printStackTrace();
            }
            返回的地方;
        }
    }

}
 

activity_maps2.xml:

 &LT; XML版本=1.0编码=UTF-8&GT?;
&LT; LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:方向=垂直机器人:layout_width =match_parent
    机器人:layout_height =match_parent&GT;

    &LT;片段的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
        的xmlns:工具=htt​​p://schemas.android.com/tool​​s
        的xmlns:地图=htt​​p://schemas.android.com/apk/res-auto
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent
        机器人:ID =@ + ID /图
        工具:上下文=com.iotaconcepts.aurum.MapsActivity2
        机器人:名称=com.google.android.gms.maps.SupportMapFragment/&GT;

&LT; / LinearLayout中&GT;
 

结果:

输入图像的描述在这里

EDIT: Resolved! In addition to Daniel's answer (saved my life), here's what I did:
1. Replaced the 'MapActivity2' class to a server API key.
2. Let the other keys in the manifest and 'maps_activites.xml. be the android API key
3. Enable the following APIS on Google Developer APIS:
Google Maps Android API
Google Places API for Android
Google Places API Web Service

4. BOOM! It worked. Here's the code to my github repository in any case: https://github.com/bholagabbar/AurumHealthApp
I am trying to retrieve the nearest restaurants from my current location. I am using the code I found online here. However I get the following error. I have placed the entire logcat for the execution and have highlighted the errors in bold:

11-30 04:53:31.000 25292-25292/? I/art: Late-enabling -Xcheck:jni

11-30 04:53:31.033 25292-25302/? I/art: Debugger is no longer active
<>11-30 04:53:31.100 25292-25311/? I/GMPM: App measurement is starting up
11-30 04:53:31.109 25292-25311/? E/GMPM: getGoogleAppId failed with status: 10
11-30 04:53:31.111 25292-25311/? E/GMPM: Uploading is not possible. App measurement disabled

11-30 04:53:31.125 25292-25314/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true`11-30 04:53:31.135 25292-25292/? D/Atlas: Validating map...
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: : EGL 1.4 QUALCOMM build: (Ibddc658e36)
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: OpenGL ES Shader Compiler Version: E031.25.03.04
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: Build Date: 08/10/15 Mon
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: Local Branch: workspace
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: Remote Branch:
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: Local Patches:
11-30 04:53:31.178 25292-25314/? I/Adreno-EGL: Reconstruct Branch:
11-30 04:53:31.179 25292-25314/? I/OpenGLRenderer: Initialized EGL, version 1.4
11-30 04:53:31.193 25292-25314/? D/OpenGLRenderer: Enabling debug mode 0
11-30 04:53:32.663 25292-25292/com.iotaconcepts.aurum I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.
11-30 04:53:32.737 25292-25314/com.iotaconcepts.aurum V/RenderScript: Application requested CPU execution
11-30 04:53:32.747 25292-25314/com.iotaconcepts.aurum V/RenderScript: 0xb7f96960 Launching thread(s), CPUs 4
11-30 04:53:36.092 25292-25292/com.iotaconcepts.aurum D/AndroidRuntime: Shutting down VM
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: FATAL EXCEPTION: main
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: Process: com.iotaconcepts.aurum, PID: 25292
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.iotaconcepts.aurum/com.iotaconcepts.aurum.MapsActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.access$800(ActivityThread.java:155)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5343)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.android.gms.maps.SupportMapFragment.getMapAsync(com.google.android.gms.maps.OnMapReadyCallback)' on a null object reference
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at com.iotaconcepts.aurum.MapsActivity2.onCreate(MapsActivity2.java:42)

11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6010)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2292)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.access$800(ActivityThread.java:155)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.os.Looper.loop(Looper.java:135)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5343)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:372)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
11-30 04:53:36.093 25292-25292/com.iotaconcepts.aurum E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:702)

I have been losing my head for the past 2 hours trying to figure our the error but in vain. Here is the code for the activity:

EDIT After the fix, here is the the code

package com.iotaconcepts.aurum;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MapsActivity2 extends AppCompatActivity implements OnMapReadyCallback
{
    private GoogleMap mGoogleMap;
    SupportMapFragment mapFrag;

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

        mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFrag.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap)
    {
        mGoogleMap=googleMap;
        mGoogleMap.setMyLocationEnabled(true);
        StringBuilder sbValue = new StringBuilder(sbMethod());
        PlacesTask placesTask = new PlacesTask();
        placesTask.execute(sbValue.toString());
    }

    public StringBuilder sbMethod()
    {

        //use your current location here
        double mLatitude = 37.77657;
        double mLongitude = -122.417506;

        StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
        sb.append("location=" + mLatitude + "," + mLongitude);
        sb.append("&radius=5000");
        sb.append("&types=" + "restaurant");
        sb.append("&sensor=true");

        sb.append("&key=AIza************************");

        Log.d("Map", "url: " + sb.toString());

        return sb;
    }

    private class PlacesTask extends AsyncTask<String, Integer, String>
    {

        String data = null;

        // Invoked by execute() method of this object
        @Override
        protected String doInBackground(String... url) {
            try {
                data = downloadUrl(url[0]);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(String result) {
            ParserTask parserTask = new ParserTask();

            // Start parsing the Google places in JSON format
            // Invokes the "doInBackground()" method of the class ParserTask
            parserTask.execute(result);
        }
    }

    private String downloadUrl(String strUrl) throws IOException
    {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            urlConnection = (HttpURLConnection) url.openConnection();

            // Connecting to url
            urlConnection.connect();

            // Reading data from url
            iStream = urlConnection.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();

            br.close();

        } catch (Exception e) {
            Log.d("Exception", e.toString());
        } finally {
            iStream.close();
            urlConnection.disconnect();
        }
        return data;
    }

    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> {

        JSONObject jObject;

        // Invoked by execute() method of this object
        @Override
        protected List<HashMap<String, String>> doInBackground(String... jsonData) {

            List<HashMap<String, String>> places = null;
            Place_JSON placeJson = new Place_JSON();

            try {
                jObject = new JSONObject(jsonData[0]);

                places = placeJson.parse(jObject);

            } catch (Exception e) {
                Log.d("Exception", e.toString());
            }
            return places;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(List<HashMap<String, String>> list) {

            Log.d("Map", "list size: " + list.size());
            // Clears all the existing markers;
            mGoogleMap.clear();

            for (int i = 0; i < list.size(); i++) {

                // Creating a marker
                MarkerOptions markerOptions = new MarkerOptions();

                // Getting a place from the places list
                HashMap<String, String> hmPlace = list.get(i);


                // Getting latitude of the place
                double lat = Double.parseDouble(hmPlace.get("lat"));

                // Getting longitude of the place
                double lng = Double.parseDouble(hmPlace.get("lng"));

                // Getting name
                String name = hmPlace.get("place_name");

                Log.d("Map", "place: " + name);

                // Getting vicinity
                String vicinity = hmPlace.get("vicinity");

                LatLng latLng = new LatLng(lat, lng);

                // Setting the position for the marker
                markerOptions.position(latLng);

                markerOptions.title(name + " : " + vicinity);

                markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));

                // Placing a marker on the touched position
                Marker m = mGoogleMap.addMarker(markerOptions);

            }
        }
    }
    public class Place_JSON {

        /**
         * Receives a JSONObject and returns a list
         */
        public List<HashMap<String, String>> parse(JSONObject jObject) {

            JSONArray jPlaces = null;
            try {
                /** Retrieves all the elements in the 'places' array */
                jPlaces = jObject.getJSONArray("results");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            /** Invoking getPlaces with the array of json object
             * where each json object represent a place
             */
            return getPlaces(jPlaces);
        }

        private List<HashMap<String, String>> getPlaces(JSONArray jPlaces) {
            int placesCount = jPlaces.length();
            List<HashMap<String, String>> placesList = new ArrayList<HashMap<String, String>>();
            HashMap<String, String> place = null;

            /** Taking each place, parses and adds to list object */
            for (int i = 0; i < placesCount; i++) {
                try {
                    /** Call getPlace with place JSON object to parse the place */
                    place = getPlace((JSONObject) jPlaces.get(i));
                    placesList.add(place);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return placesList;
        }

        /**
         * Parsing the Place JSON object
         */
        private HashMap<String, String> getPlace(JSONObject jPlace)
        {

            HashMap<String, String> place = new HashMap<String, String>();
            String placeName = "-NA-";
            String vicinity = "-NA-";
            String latitude = "";
            String longitude = "";
            String reference = "";

            try {
                // Extracting Place name, if available
                if (!jPlace.isNull("name")) {
                    placeName = jPlace.getString("name");
                }

                // Extracting Place Vicinity, if available
                if (!jPlace.isNull("vicinity")) {
                    vicinity = jPlace.getString("vicinity");
                }

                latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat");
                longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng");
                reference = jPlace.getString("reference");

                place.put("place_name", placeName);
                place.put("vicinity", vicinity);
                place.put("lat", latitude);
                place.put("lng", longitude);
                place.put("reference", reference);

            } catch (JSONException e) {
                e.printStackTrace();
            }
            return place;
        }
    }

}

The XML file is:

        <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical" android:layout_width="match_parent"
              android:layout_height="match_parent">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              xmlns:map="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:id="@+id/map"
              tools:context="com.iotaconcepts.aurum.MapsActivity2"
              android:name="com.google.android.gms.maps.SupportMapFragment"/>

</LinearLayout>

The Manifest File:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.iotaconcepts.aurum" >

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <uses-library android:name="com.google.android.maps" />

    <!-- uses-permission android:name="android.permission.INTERNET" / -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/MyMaterialTheme" >
        <activity
            android:name=".MainActivity"
            android:label="Aurum" >
            <intent-filter>
                <action android:name="android.intent.action.MAINACTIVITY" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".LoginActivity"
            android:label="Aurum"
            android:theme="@style/ColorfulActionBarTheme" >
            <intent-filter>
                <action android:name="android.intent.action.LOGIN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Splash"
            android:label="Aurum"
            android:theme="@style/ColorfulActionBarTheme" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Diagnosis"
            android:label="Aurum"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="android.intent.action.DIAGNOSIS" />

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

        <!--
             The API key for Google Maps-based APIs is defined as a string resource.
             (See the file "res/values/google_maps_api.xml").
             Note that the API key is linked to the encryption key used to sign the APK.
             You need a different API key for each encryption key, including the release key that is used to
             sign the APK for publishing.
             You can define the keys for the debug and release targets in src/debug/ and src/release/. 
        -->
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="AIza*************************" />

        <activity
            android:name=".MapsActivity2"
            android:label="@string/title_activity_maps2" >
        </activity>
        <activity android:name=".testactivity" >
        </activity>
    </application>

</manifest>

解决方案

I just ran your code and got it working. It looks like the main issue is that there is a space between key and your api key in the query url.

You also didn't have any code that calls getMapAsync(), so you were not getting a map reference and onMapReady() would not have been called.

Update: As for the NullPointerException, it's a result of the wrong layout xml file being used. use setContentView(R.layout.activity_maps2); instead of activity_main.

Also, be sure to use a Server API key with the Places Web API.

Here is the code that worked for me:

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MapsActivity2 extends AppCompatActivity implements OnMapReadyCallback
{
    private GoogleMap mGoogleMap;
    SupportMapFragment mapFrag;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        //Wrong one:
        //setContentView(R.layout.activity_main);

        //Use this one:
        setContentView(R.layout.activity_maps2);

        mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFrag.getMapAsync(this);

    }

    @Override
    public void onMapReady(GoogleMap googleMap)
    {
        mGoogleMap=googleMap;
        mGoogleMap.setMyLocationEnabled(true);
        StringBuilder sbValue = new StringBuilder(sbMethod());
        PlacesTask placesTask = new PlacesTask();
        placesTask.execute(sbValue.toString());
    }

    public StringBuilder sbMethod()
    {

        //use your current location here
        double mLatitude = 37.77657;
        double mLongitude = -122.417506;

        StringBuilder sb = new StringBuilder("https://maps.googleapis.com/maps/api/place/nearbysearch/json?");
        sb.append("location=" + mLatitude + "," + mLongitude);
        sb.append("&radius=5000");
        sb.append("&types=" + "restaurant");
        sb.append("&sensor=true");

        sb.append("&key=AIza******************************");

        Log.d("Map", "url: " + sb.toString());

        return sb;
    }

    private class PlacesTask extends AsyncTask<String, Integer, String>
    {

        String data = null;

        // Invoked by execute() method of this object
        @Override
        protected String doInBackground(String... url) {
            try {
                data = downloadUrl(url[0]);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(String result) {
            ParserTask parserTask = new ParserTask();

            // Start parsing the Google places in JSON format
            // Invokes the "doInBackground()" method of the class ParserTask
            parserTask.execute(result);
        }
    }

    private String downloadUrl(String strUrl) throws IOException
    {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try {
            URL url = new URL(strUrl);

            // Creating an http connection to communicate with url
            urlConnection = (HttpURLConnection) url.openConnection();

            // Connecting to url
            urlConnection.connect();

            // Reading data from url
            iStream = urlConnection.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

            StringBuffer sb = new StringBuffer();

            String line = "";
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }

            data = sb.toString();

            br.close();

        } catch (Exception e) {
            Log.d("Exception", e.toString());
        } finally {
            iStream.close();
            urlConnection.disconnect();
        }
        return data;
    }

    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String, String>>> {

        JSONObject jObject;

        // Invoked by execute() method of this object
        @Override
        protected List<HashMap<String, String>> doInBackground(String... jsonData) {

            List<HashMap<String, String>> places = null;
            Place_JSON placeJson = new Place_JSON();

            try {
                jObject = new JSONObject(jsonData[0]);

                places = placeJson.parse(jObject);

            } catch (Exception e) {
                Log.d("Exception", e.toString());
            }
            return places;
        }

        // Executed after the complete execution of doInBackground() method
        @Override
        protected void onPostExecute(List<HashMap<String, String>> list) {

            Log.d("Map", "list size: " + list.size());
            // Clears all the existing markers;
            mGoogleMap.clear();

            for (int i = 0; i < list.size(); i++) {

                // Creating a marker
                MarkerOptions markerOptions = new MarkerOptions();

                // Getting a place from the places list
                HashMap<String, String> hmPlace = list.get(i);


                // Getting latitude of the place
                double lat = Double.parseDouble(hmPlace.get("lat"));

                // Getting longitude of the place
                double lng = Double.parseDouble(hmPlace.get("lng"));

                // Getting name
                String name = hmPlace.get("place_name");

                Log.d("Map", "place: " + name);

                // Getting vicinity
                String vicinity = hmPlace.get("vicinity");

                LatLng latLng = new LatLng(lat, lng);

                // Setting the position for the marker
                markerOptions.position(latLng);

                markerOptions.title(name + " : " + vicinity);

                markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));

                // Placing a marker on the touched position
                Marker m = mGoogleMap.addMarker(markerOptions);

            }
        }
    }
    public class Place_JSON {

        /**
         * Receives a JSONObject and returns a list
         */
        public List<HashMap<String, String>> parse(JSONObject jObject) {

            JSONArray jPlaces = null;
            try {
                /** Retrieves all the elements in the 'places' array */
                jPlaces = jObject.getJSONArray("results");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            /** Invoking getPlaces with the array of json object
             * where each json object represent a place
             */
            return getPlaces(jPlaces);
        }

        private List<HashMap<String, String>> getPlaces(JSONArray jPlaces) {
            int placesCount = jPlaces.length();
            List<HashMap<String, String>> placesList = new ArrayList<HashMap<String, String>>();
            HashMap<String, String> place = null;

            /** Taking each place, parses and adds to list object */
            for (int i = 0; i < placesCount; i++) {
                try {
                    /** Call getPlace with place JSON object to parse the place */
                    place = getPlace((JSONObject) jPlaces.get(i));
                    placesList.add(place);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            return placesList;
        }

        /**
         * Parsing the Place JSON object
         */
        private HashMap<String, String> getPlace(JSONObject jPlace)
        {

            HashMap<String, String> place = new HashMap<String, String>();
            String placeName = "-NA-";
            String vicinity = "-NA-";
            String latitude = "";
            String longitude = "";
            String reference = "";

            try {
                // Extracting Place name, if available
                if (!jPlace.isNull("name")) {
                    placeName = jPlace.getString("name");
                }

                // Extracting Place Vicinity, if available
                if (!jPlace.isNull("vicinity")) {
                    vicinity = jPlace.getString("vicinity");
                }

                latitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat");
                longitude = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng");
                reference = jPlace.getString("reference");

                place.put("place_name", placeName);
                place.put("vicinity", vicinity);
                place.put("lat", latitude);
                place.put("lng", longitude);
                place.put("reference", reference);

            } catch (JSONException e) {
                e.printStackTrace();
            }
            return place;
        }
    }

}

activity_maps2.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:map="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        tools:context="com.iotaconcepts.aurum.MapsActivity2"
        android:name="com.google.android.gms.maps.SupportMapFragment"/>

</LinearLayout>

Result:

这篇关于MapActivity查询最近的医院/餐厅不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆