2016-02-28 77 views
0

即時通訊嘗試獲取設備的位置到我的Android應用程序。我試圖使用android開發人員網站上概述的指南,但是每當我在手機上運行代碼時,應用程序立即停止。我的代碼是:Android應用程序停止與上次的位置檢查

public class MainActivity extends AppCompatActivity implements ConnectionCallbacks, OnConnectionFailedListener{ 

    protected static final String TAG = "MainActivity"; 

    protected GoogleApiClient mGoogleApiClient; 

    protected Location mLastLocation; 
    protected Double lonValue; 
    protected Double latValue; 

    protected String mLatitudeLabel; 
    protected String mLongitudeLabel; 
    protected TextView mLatitudeText; 
    protected TextView mLongitudeText; 

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

     TextView lonView = (TextView) findViewById(R.id.lon); 

     buildGoogleApiClient(); 

     //connect to parse backend 
     Parse.initialize(this, "xxxx", "xxxx"); 
     ParseInstallation.getCurrentInstallation().saveInBackground(); 
     Log.d("myInstallation Id", ParseInstallation.getCurrentInstallation().getInstallationId()); 

     //get location 
     lonValue = mLastLocation.getLatitude(); 
     latValue = mLastLocation.getLongitude(); 

     //text update 

    } 

    public void openLocation(View v){ 
     startActivity(new Intent(MainActivity.this, LocationActivity.class)); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 

     //check build version on phone 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      //check that app has permission to access data 
      if (checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
       //get information from location service 
       mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
       Log.d(TAG,mLatitudeLabel); 
      } 
     } 

     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 


     // Provides a simple way of getting a device's location and is well suited for 
     // applications that do not require a fine-grained location and that do not need location 
     // updates. Gets the best and most recent location currently available, which may be null 
     // in rare cases when a location is not available. 

     buildGoogleApiClient(); 

     Toast.makeText(MainActivity.this, "Should have network", Toast.LENGTH_SHORT).show(); 
    } 

    /** 
    * Builds a GoogleApiClient. Uses the addApi() method to request the LocationServices API. 
    */ 
    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if (mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     // Refer to the javadoc for ConnectionResult to see what error codes might be returned in 
     // onConnectionFailed. 
     Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + result.getErrorCode()); 
    } 


    @Override 
    public void onConnectionSuspended(int cause) { 
     // The connection to Google Play services was lost for some reason. We call connect() to 
     // attempt to re-establish the connection. 
     Log.i(TAG, "Connection suspended"); 
     mGoogleApiClient.connect(); 
    } 

} 

logcat的

02-28 18:45:08.848 4048-4048/com.worcestercomputing.ryanlambert.toiletstall E/AndroidRuntime:致命異常:主 過程: com.worcestercomputing.ryanlambert.toiletstall,PID:4048 java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.worcestercomputing.ryanlambert.toiletstall/com.worcestercomputing.ryanlambert.toiletstall.MainActivity}: 顯示java.lang.NullPointerException:嘗試在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)一個空對象 參考 上調用虛擬方法 '雙android.location.Location.getLatitude()' 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) 在android.os.Handler.dispatchMessage(Handler.java:102) at a ndroid.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com。 android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 引起:java.lang.NullPointerException:嘗試調用虛擬 方法'double android.location.Location.getLatitude()'null object reference at com.worcestercomputing.ryanlambert.toiletstall.MainActivity.onCreate(MainActivi ty.java:63) 在android.app.Activity.performCreate(Activity.java:6251) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 在 android.app.ActivityThread.performLaunchActivity( ActivityThread.java:2369) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 在android.app.ActivityThread.-wrap11(ActivityThread.java) 在 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1344) at android.os.Handler.dispatchMe ssage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method。調用(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit。Java的:616)

+0

請問您可以發佈logcat .. – Lal

+0

您是否在模擬器上運行它?您必須分別傳遞緯度和經度以便在模擬器上工作。此外,在現實生活中,getLastLocation有時可能返回null(用戶可能從他購買手機的那一天起禁用了位置),因此您應該實施空檢查。 –

+0

即時通訊在物理設備上運行。我怎麼能實現這個空檢查? (對不起,只是剛剛學習繩索) –

回答

0

顯然,問題是,你叫

//get location 
lonValue = mLastLocation.getLatitude(); 
latValue = mLastLocation.getLongitude(); 
Activity.onCreate()

。 但mLastLocation當時仍然是null

請注意,onCreate(Bundle)是Activity初始化活動的生命週期回調 - 它是在創建Activity的新實例時首先要調用的。

相關問題