2017-04-15 549 views
0

時,startActivity會引發錯誤PS:我嘗試了各種給定類型的解決方案,但它們都不適用於我。嘗試啓動Settings.ACTION_LOCATION_SOURCE_SETTINGS

我已經配置這樣的GPSTracker類:​​

public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 
    ... 
    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 
} 

getLocation()將立即調用。現在我遇到的問題是在一個叫做showSettingsAlert()功能在同一個類中實現這樣的:

public void showSettingsAlert(){ 
    new MaterialDialog.Builder(mContext) 
      .content("GPS Needs to be enabled to view Weather Data of your Location") 
      .title("Enable GPS") 
      .positiveText("ENABLE") 
      .onPositive(new MaterialDialog.SingleButtonCallback() { 
       @Override 
       public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
        if (intent != null) 
         startActivity(intent); 
        else 
         Log.i("Null" , "Intent"); 
       } 
      }) 
      .negativeText("CANCEL") 
      .onNegative(new MaterialDialog.SingleButtonCallback() { 
       @Override 
       public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { 
        dialog.dismiss(); 
       } 
      }) 
      .show(); 
} 

當顯示該對話框,當我點擊ENABLE,我得到以下轉儲:

04-15 16:59:12.288 3982-3982/com.a5corp.weather E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.a5corp.weather, PID: 3982 
                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.Context.startActivity(android.content.Intent)' on a null object reference 
                    at android.content.ContextWrapper.startActivity(ContextWrapper.java:356) 
                    at com.a5corp.weather.permissions.GPSTracker$2.onClick(GPSTracker.java:166) 
                    at com.afollestad.materialdialogs.MaterialDialog.onClick(MaterialDialog.java:361) 
                    at android.view.View.performClick(View.java:5637) 
                    at android.view.View$PerformClick.run(View.java:22429) 
                    at android.os.Handler.handleCallback(Handler.java:751) 
                    at android.os.Handler.dispatchMessage(Handler.java:95) 
                    at android.os.Looper.loop(Looper.java:154) 
                    at android.app.ActivityThread.main(ActivityThread.java:6169) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778) 
+0

我的猜測是你的'GPSTracker'是基於[這個'GPSTracker'](http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/) 。其中許多缺陷是,這不是一項真正的服務。這段代碼的作者選擇創建一個擴展'Service'的類,但沒有正確實現或使用該服務。這是什麼導致你的'NullPointerException',因爲這不是一個正確初始化'上下文'。請參閱[本答案](https://stackoverflow.com/a/43082164/115145)瞭解如何在沒有此代碼的情況下查找位置。 – CommonsWare

+0

的確是這樣的......我在我的主文件夾中刪除.gradle文件夾並重建項目 – Sparker0i

+0

後修復了此問題。上下文正常傳遞,否則當位置打開時,將不會報告正確的位置值 – Sparker0i

回答

0
private GPSTracker myGpsTracker; 

protected void onCreate(Bundle savedInstanceState) { 
     myGpsTracker = new GPSTracker(this); 
     if (myGpsTracker.canGetLocation()) 
     { 
      double longitude = myGpsTracker.latitude; 
      double latitude = myGpsTracker.longitude; 
     } 
     else 
     { 
      // can't get location 
      // GPS or Network is not enabled 
      // Ask user to enable GPS/network in settings 
      showSettingsAlert(); 
     } 
} 

    /** 
    * Function to show settings alert dialog 
    * On pressing Settings button will lauch Settings Options 
    */ 
    public void showSettingsAlert() 
    { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(SplashScreen.this); 

     // Setting Dialog Title 
     alertDialog.setTitle("GPS Settings"); 

     // Setting Dialog Message 
     alertDialog.setMessage("GPS is not active. Do you want to open?"); 

     // On pressing Settings button 
     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       startActivityForResult(intent, CommonUtils.REQUEST_CODE_ACTION_LOCATION_SOURCE_SETTINGS); 
      } 
     }); 

     // on pressing cancel button 
     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
       setLocationValues(); 

      } 
     }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

     @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (requestCode == CommonUtils.REQUEST_CODE_ACTION_LOCATION_SOURCE_SETTINGS) { 
      setLocationValues(); 
     } 
    } 

    private void setLocationValues() { 
     myGpsTracker.getLocation(); 
     if (myGpsTracker.canGetLocation()) { 
      double longitude = myGpsTracker.latitude; 
      double latitude = myGpsTracker.longitude; 
     } 
    } 
相關問題