2016-03-02 75 views
0

我正在编写一个小应用程序,每隔10秒获取一次您的位置,并将经纬度放入JSON对象中。它应该将Lat和Lon写入外部存储器中的文件。我运行了应用程序,我可以看到file.json,但只有一个字符串Lon。相反,每当位置发生变化时,它应该写出一对Lon Lat值。问题是什么?将JSON对象写入文件的问题

下面是代码:

import android.os.Environment; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.widget.TextView; 
import android.util.Log; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.logging.Logger; 
public class MainActivity extends AppCompatActivity implements LocationListener { 

    protected LocationManager locationManager; 
    protected LocationListener locationListener; 
    protected Context context; 
    TextView txtLat; 
    String lat; 
    String provider; 
    protected String latitude,longitude; 
    protected boolean gps_enabled,network_enabled; 
    JSONObject jsonObject; 
    FileOutputStream outputStream; 
    String latlon; 
    String filename; 
    File sdCardFile; 
    FileWriter fw; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    txtLat = (TextView) findViewById(R.id.textview1); 
    filename="salvataggi.json"; 
    sdCardFile = new File(getExternalFilesDir(null), filename); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this); 
} 
@Override 
public void onLocationChanged(Location location) { 
    txtLat = (TextView) findViewById(R.id.textview1); 
    txtLat.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude()); 
    try { 
     jsonObject = new JSONObject(); 
     jsonObject.put("Lat", location.getLatitude()); 
     jsonObject.put("Lon", location.getLongitude()); 
     latlon=jsonObject.toString(); 

      writeToFile(latlon, sdCardFile, fw); 


     }catch (JSONException je) { } 

} 
public static void writeToFile(String latlon, File sdCardFile, FileWriter fw) { 

    try{ 
     fw = new FileWriter(sdCardFile, true); 
     fw.write(latlon); 
     fw.flush(); 
     fw.close(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

我在哪里做错了吗?

+0

该文件应至少包含一个经纬度对。不是吗?您的问题听起来像是只包含经度 –

+0

另外,我不确定LocationManager对象的详细信息,但是如果您的设备完全没有移动(或少于几米),我不会认为'onLocationChanged'应该被触发 –

+0

确切地说,只有经度值,没有别的......即使设备没有移动,我可以看到有时会改变位置。 –

回答

0

当您以特定的时间间隔请求位置更新时,您不能保证您将在此间隔内收到更新。根据javadoc,你可以确定的是,更新不会比给定的持续时间更快。如果GPS没有获得更新的位置,则听者可能根本不会被调用。首先获得GPS锁定可能需要一些时间。

如果您确实需要每10秒提供一些坐标,请考虑使用处理程序计划每10秒轮询一次Runnable,以轮询值getLastKnownLocation并确保返回值不为空。返回的位置可能不准确,但至少有一些。

+0

那么,我该怎么办?我应该在哪里调用调用Runnable的Handler?对不起,但我并不擅长Android。我正在练习。 –