2016-07-27 42 views
0

我對Android很新,我想將GPS顯示的座標保存在文本文件中。我早些時候問過這個問題,我收到了答覆。但是,當我嘗試代碼時遇到空指針異常。有沒有人對如何解決這個問題有任何想法? (以下大部分代碼不是我的)。如何解決GPS服務程序中的空指針異常?

鏈接到我剛纔的問題:How do I get coordinates from a GPS service into a text file?

當前代碼:

public class MainActivity extends AppCompatActivity { 

private Button btn_start, btn_stop; 
public Button save; 
BufferedWriter writer; 

private BroadcastReceiver broadcastReceiver; 
int delay = 1000; // delay for 1 sec. 
int period = 10000; // repeat every 10 sec. 
Timer timer = new Timer(); 
public EditText editText; 
public TextView textView; 

public String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/aaTutorial"; 





@Override 
protected void onResume() { 
    super.onResume(); 
    if(broadcastReceiver == null){ 
     broadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) 
       { 

        textView.append("\n" +intent.getExtras().get("coordinates")); 

        try { 
         writer.write((String) intent.getExtras().get("coordinates")); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        try { 
         writer.newLine(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 

       } 
      }; 
     }; 
     registerReceiver(broadcastReceiver,new IntentFilter("location_update")); 
    } 




protected void onDestroy() { 
    super.onDestroy(); 
    try { 
     writer.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    if(broadcastReceiver != null){ 
     unregisterReceiver(broadcastReceiver); 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    try { 
     writer = new BufferedWriter(new FileWriter("mnt/sdcard/gps.txt")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    btn_start = (Button) findViewById(R.id.button); 
    btn_stop = (Button) findViewById(R.id.button2); 
    textView = (TextView) findViewById(R.id.textView); 
// save = (Button) findViewById(R.id.save); 
    File dir = new File(path); 
    dir.mkdirs(); 

    if(!runtime_permissions()) 
     enable_buttons(); 

} 

private void enable_buttons() { 

    btn_start.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent i =new Intent(getApplicationContext(),GPS_Service.class); 
      startService(i); 
     } 
    }); 




    btn_stop.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Intent i = new Intent(getApplicationContext(),GPS_Service.class); 
      stopService(i); 

     } 
    }); 

} 

private boolean runtime_permissions() { 
    if(Build.VERSION.SDK_INT >= 23 && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 

     requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},100); 

     return true; 
    } 
    return false; 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == 100){ 
     if(grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED){ 
      enable_buttons(); 
     }else { 
      runtime_permissions(); 
     } 
    } 
} 
} 

下的OnResume方法第一try/catch語句出現的錯誤。

隨着

嘗試調用虛擬方法 '無效java.io.BufferedWriter.write(java.lang.String中)' 上的logcat的空對象引用。

+0

你可以添加錯誤的完整堆棧跟蹤嗎? – FishStix

回答

1

您的作者未初始化,因爲您要寫入的文件無效。首先,你離開開幕/,你的意思是/mnt/sdcard。其次,沒有承諾這是SD卡的安裝位置。切勿在android中使用SD卡的直接路徑,請使用getExternalDirectory來查找它。第三,在kitkat及以上版本中,這仍然會失敗,因爲你沒有對sdcard的根目錄進行寫訪問。

+0

所以,如果我不能使用緩衝寫入器,那麼我怎樣才能將顯示的座標保存在文本文件中? – Akshay

+0

你可以使用緩衝作家。您不能使用硬編碼路徑。在kitKat上,你不能使用卡的根目錄 –