2015-04-04 168 views
-1

我正在嘗試在我的應用中使用Google地圖。我已添加庫和所有必需的東西,但應用程序終止與空指針異常。請建議我。先謝謝你。無法啓動活動java.lang.NullPointerException

logcat的

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yd.hhivaction/com.yd.hhivacation.MapIt}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
     at android.app.ActivityThread.access$600(ActivityThread.java:140) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4895) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
     at com.yd.hhivacation.MapIt.onCreate(MapIt.java:56) 
     at android.app.Activity.performCreate(Activity.java:5163) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
            at android.app.ActivityThread.access$600(ActivityThread.java:140) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4895) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
            at dalvik.system.NativeStart.main(Native Method) 

MapIt.java

package com.yd.hhivacation; 

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

import android.annotation.SuppressLint; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 

import com.android.volley.Request.Method; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.VolleyLog; 
import com.android.volley.toolbox.JsonObjectRequest; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.maps.CameraUpdateFactory; 
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.LatLng; 
import com.google.android.gms.maps.model.Marker; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class MapIt extends ActionBarActivity implements LocationListener, 
     OnMapReadyCallback, android.location.LocationListener { 

    GoogleMap googlemap; 
    String listingid; 
    JSONArray data; 
    String laitude; 
    String logitude; 
    String headline, subline; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map_it); 
     Intent in = getIntent(); 
     listingid = in.getStringExtra("listingid"); 

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

     googlemap = mapFragment.getMap(); 
     googlemap.setMyLocationEnabled(true); 
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     String bestProvider = locationManager.getBestProvider(criteria, true); 
     Location location = locationManager.getLastKnownLocation(bestProvider); 
     if (location != null) { 
      onLocationChanged(location); 
     } 
     locationManager.requestLocationUpdates(bestProvider, 20000, 0, this); 
    } 

    /** 
    * This is where we can add markers or lines, add listeners or move the 
    * camera. In this case, we just add a marker near Africa. 
    */ 
    @Override 
    public void onMapReady(final GoogleMap map) { 

     String url2 = "http://m.hhivacation.com/webapi/getmapdetailsbyID.php?listingid=" 
       + listingid; 
     JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.GET, url2, 
       null, new Response.Listener<JSONObject>() { 

        @SuppressLint("NewApi") 
        Context context; 

        @SuppressLint("UseValueOf") 
        @Override 
        public void onResponse(JSONObject response) { 

         try { 
          boolean suc = Boolean.parseBoolean(response 
            .getString("success")); 

          if (suc = true) { 

           data = response.getJSONArray("listing_details"); 

           JSONObject feedObj = (JSONObject) data.get(0); 

           headline = feedObj.getString("headline"); 
           subline = feedObj.getString("subline"); 

           laitude = feedObj.getString("map_lat"); 
           logitude = feedObj.getString("map_long"); 

           if (laitude.length() != 0 
             & laitude.length() != 0) { 
            double lo, la; 

            try { 

             lo = new Double(logitude); 
             la = new Double(laitude); 

            } catch (NumberFormatException e) { 
             lo = 75.8655; // your default value 

             la = 22.7253; 
            } 
            final LatLng PERTH = new LatLng(la, lo); 
//         Marker perth = map 
//           .addMarker(new MarkerOptions() 
//             .position(PERTH) 
//             .title(headline) 
//             .snippet(subline)); 
// 
//         map.getUiSettings().setZoomControlsEnabled(
//           false); 
// 
//         map.moveCamera(CameraUpdateFactory.newLatLngZoom(
//           new LatLng(
//             Double.parseDouble(laitude), 
//             Double.parseDouble(logitude)), 
//           4)); 
           } 

           Log.d("mapit", headline + "&" + subline); 

          } 

         } catch (JSONException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

         Log.d("resonce", laitude + "--" + logitude); 
         /* 
         * responseText.setText("Response:" + " " + 
         * response.toString() + ":" + st1); 
         */ 

        } 
       }, new Response.ErrorListener() { 

        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d("App", "Error: " + error.getMessage()); 
         // hide the progress dialog 

        } 
       }); 

     VolleySingleton.getInstance(getApplicationContext()).addToRequestQueue(
       jsonObjReq); 

    } 

    @SuppressLint("UseValueOf") 
    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 

     if (laitude != null && logitude != null) { 

      if (laitude.length() != 0 & logitude.length() != 0) { 

       double lo, la; 

       try { 

        lo = new Double(logitude); 
        la = new Double(laitude); 

       } catch (NumberFormatException e) { 
        la = 42.3482; // your default value 

        lo = 75.1890; 
       } 
       double latitude = lo; 
       double longitude = la; 
       LatLng latLng = new LatLng(latitude, longitude); 
       googlemap.addMarker(new MarkerOptions().position(latLng)); 
       googlemap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
       googlemap.animateCamera(CameraUpdateFactory.zoomTo(6)); 

//    Toast.makeText(MapIt.this, location + " & " + longitude, 
//      Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    private boolean isGooglePlayServicesAvailable() { 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 
     if (ConnectionResult.SUCCESS == status) { 
      return true; 
     } else { 
      GooglePlayServicesUtil.getErrorDialog(status, this, 0).show(); 
      return false; 
     } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

} 

清單

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

    android:versionCode="2" 
    android:versionName="1.1" > 

    <uses-sdk 
     android:minSdkVersion="11" 
     android:targetSdkVersion="19" /> 

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <!-- External storage for caching. --> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <!-- My Location --> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

    <!-- Maps API needs OpenGL ES 2.0. --> 
    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <application 
     android:name="com.yd.hhivacation.MyApplication" 
     android:allowBackup="true" 
     android:icon="@drawable/icon" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <meta-data 
      android:name="com.google.android.maps.v2.API_KEY" 
      android:value="AIzaSyCNe5t_yjE_NwwWTNj8MYq2oJNetFfFIk4" /> 
     <meta-data 
      android:name="com.google.android.gms.version" 
      android:value="@integer/google_play_services_version" /> 

     <activity 
      android:name="com.yd.hhivacation.FirstActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

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

     <activity 
      android:name=".SubCat" 
      android:label="@string/title_activity_sub_cat" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".Listing" 
      android:label="@string/title_activity_listing" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".Detail" 
      android:label="@string/title_activity_detail" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".WriteReview" 
      android:label="@string/title_activity_write_review" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".MapIt" 
      android:label="@string/title_activity_map_it" 
      android:screenOrientation="portrait" > 
     </activity> 
     <activity 
      android:name=".Search" 
      android:label="@string/title_activity_search" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".F_about" 
      android:label="@string/title_activity_f_about" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".F_feedback" 
      android:label="@string/title_activity_f_feedback" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".F_public" 
      android:label="@string/title_activity_f_public" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".F_advert" 
      android:label="@string/title_activity_f_advert" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".Loadreviews" 
      android:label="@string/title_activity_loadreviews" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 
     <activity 
      android:name=".Websites" 
      android:label="@string/title_activity_websites" 
      android:screenOrientation="portrait" 
      android:windowSoftInputMode="stateHidden" > 
     </activity> 

    </application> 

</manifest> 

行爲一些變化

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yd.hhivaction/com.yd.hhivacation.MapIt}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
      at android.app.ActivityThread.access$600(ActivityThread.java:140) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
      at android.os.Handler.dispatchMessage(Handler.java:99) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4895) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at com.yd.hhivacation.MapIt.onCreate(MapIt.java:52) 
      at android.app.Activity.performCreate(Activity.java:5163) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
            at android.app.ActivityThread.access$600(ActivityThread.java:140) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4895) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
            at dalvik.system.NativeStart.main(Native Method) 

後ivity_map_it

<fragment xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    class="com.google.android.gms.maps.SupportMapFragment"/> 

新的logcat @ 52 googlemap.setMyLocationEnabled(真);

+0

什麼是MapIt.java中的第56行 – 2015-04-04 10:46:31

+0

LocationManager locationManager =(LocationManager)getSystemService(LOCATION_SERVICE); @EdGeorge – 2015-04-04 10:47:15

+0

@manikantag:你確定那是56號線嗎?請確認,因爲該代碼似乎沒有任何問題。 – 2015-04-04 11:03:36

回答

2

錯誤可能是在線googlemap = mapFragment.getMap();。在上面的行中,您使用:mapFragment.getMapAsync(this);onMapReady您應該存儲谷歌地圖,如googlemap = map。所以,你需要做的是這樣的:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_map_it); 
     Intent in = getIntent(); 
     listingid = in.getStringExtra("listingid"); 

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

     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     Criteria criteria = new Criteria(); 
     String bestProvider = locationManager.getBestProvider(criteria, true); 
     Location location = locationManager.getLastKnownLocation(bestProvider); 
     if (location != null) { 
      onLocationChanged(location); 
     } 
     locationManager.requestLocationUpdates(bestProvider, 20000, 0, this); 
    } 


@Override 
    public void onMapReady(final GoogleMap map) { 
     if (this.googlemap == null) { 
      googlemap = map; 
      googlemap.setMyLocationEnabled(true); 
     } 
     String url2 = "http://m.hhivacation.com/webapi/getmapdetailsbyID.php?listingid=" 
       + listingid; 
    .... 
    .... 
    } 

而且在onLocationChanged

if (googlemap != null) { 
    googlemap.addMarker(new MarkerOptions().position(latLng)); 
    googlemap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    googlemap.animateCamera(CameraUpdateFactory.zoomTo(6)); 
} 

希望這有助於。

+0

是的,你的更改工作,但有一個無關的錯誤Logcat說''W/GooglePlayServicesUtil:谷歌播放服務過時了'@miselking 在gradle我已經使用compile'c​​om.google.android.gms:play-services:6.5 .87' – 2015-04-04 11:49:32

+0

嘗試'編譯'com.google.android.gms:play-services:7.0.0''。這是最新的版本。 'W /'應該是一個警告,而不是一個錯誤。 – miselking 2015-04-04 12:49:48

+0

如果現在一切正常,請將此答案標記爲已接受...謝謝... – miselking 2015-04-04 15:41:52

相關問題