2012-10-02 91 views
0

我想要獲取GPS位置並將其解析爲字符串,然後將其解析爲可點擊的網址。我已經完成了獲取位置的代碼,該位置可以正常工作,但由於可能需要一段時間才能獲取位置,因此在解析位置之前,String正在執行。我已經嘗試過處理對話框等,但我無法讓它工作。存儲地圖位置 - android

見代碼

公共類ConfirmScreen延伸活動{

String mapCoord = "http://maps.google.com"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_confirm_screen); 


    LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    LocationListener mLocListener = new MyLocationListener(); 
    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0, mLocListener); 


    sendEmail(); 
    playSound(); 

} 


public void backHome(View view) 
{ 
    Intent intent = new Intent (this, MainScreen.class); 
    startActivity(intent); 
} 

// Method to start playing and looping a sound. 

public void playSound() 
{ 
    MediaPlayer clickSound = MediaPlayer.create(this, R.raw.warning); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    Boolean soundCheck = sp.getBoolean("SOUND", false); 
    if (soundCheck) 
    { 
     clickSound.start(); 
    } 



}// method end 



public void sendEmail() 
{ 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    String nameValue = sp.getString("NAME", "failed to get name"); 
    String emailValue = sp.getString("EMAIL", "failed to get email"); 
    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL, new String[]{emailValue}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Email sent from DON'T PANIC - A Chris O'Brien Project"); 
    i.putExtra(Intent.EXTRA_TEXT, "Hi there\n" + nameValue + " is in mortal danger. Please see the co-ords attached and run to their rescue!" + 
      " If you don't see any co-ords, they didn't check the box and assume you know where they are.\nKind Regards\nDon't Panic! \n\n\n" + mapCoord); 

    try 
    { startActivity(Intent.createChooser(i, "Send mail....")); 
    } 
    catch (android.content.ActivityNotFoundException ex){ 

     Toast.makeText(ConfirmScreen.this, "There are no email clients installed or set up", Toast.LENGTH_SHORT).show(); 
    } 
} 

public class MyAsyncTask extends AsyncTask<Void, Void, Result>{ 

    private Activity activity; 
    private ProgressDialog progressDialog; 

    private double longitude; 
    private double latitude; 
    private String countryCode; 

    public MyAsyncTask(Activity activity, double longitude, double latitude) { 
     super(); 
     this.activity = activity; 
     this.longitude = longitude; 
     this.latitude = latitude; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     ProgressDialog.show(activity, "", "Looking for GPS satellites..."); 
    } 

    @Override 
    protected Result doInBackground(Void... v) { 
     Geocoder geocoder = new Geocoder(activity, Locale.getDefault()); 
     List<Address> addresses; 
     try { 
      addresses = geocoder.getFromLocation(latitude, longitude, 1); 
      countryCode = addresses.get(0).getAddressLine(2); 
     }catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Toast.makeText(activity, "Location is not available, please try again later.", Toast.LENGTH_LONG).show(); 
     } 
     if(countryCode==null){ 
      Toast.makeText(activity, "Location is not available, please try again later.", Toast.LENGTH_LONG).show(); 
     } 
     Toast.makeText(activity, countryCode, Toast.LENGTH_LONG).show(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Result result) { 
     progressDialog.dismiss(); 
     Toast.makeText(activity.getApplicationContext(), "Finished.", 
     Toast.LENGTH_LONG).show(); 
    } 
    } 



//Location Listener 
public class MyLocationListener implements LocationListener 
{ 


    @Override 
    public void onLocationChanged(Location location) { 
     double lng = location.getLatitude(); 
     double lat = location.getLongitude(); 
     MyAsyncTask task = new MyAsyncTask(ConfirmScreen.this, lng, lat); 
     task.execute(); 
     Toast.makeText(getApplicationContext(), "Done :D", Toast.LENGTH_LONG).show(); 

     String text = "Current Location is \nLat: " + lng + " \nLng: " + lat; 
     mapCoord = Double.toString(lng) + " " + Double.toString(lat); 

     Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     Toast.makeText(getApplicationContext(), "GPS Disabled", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     Toast.makeText(getApplicationContext(), "GPS Enabled", Toast.LENGTH_SHORT).show(); 

    } 

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

    } 




} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_confirm_screen, menu); 
    return true; 
} 






} 

編譯沒有錯誤,但它並沒有做什麼,我打算。我一直在閱讀其他代碼並試圖實現我自己的,但我可能搞砸了一些東西。

1)的onCreate獲取位置 2)一個對話框應彈出直到GPS共ORDS接收 3)的那些共ORDS應傳遞到電子郵件與共同ORDS發送的字符串 4) (這工作正常) 5)聲音播放,如果框中檢查(再次運作)

我得到的合作,但困難的是,電子郵件的方法被調用之前,應用程序有機會得到公司-ords。我不想用lastKnownCo-ords。

+0

在onLocationChanged發送您的電子郵件! – thaussma

回答

1

1/No. onCreate要求在將來的某個時間點將位置提供給mLocListener,但無論如何,在onCreate已經返回之後。 onCreate還會啓動一個新的活動來編寫電子郵件。在htis點沒有檢索到座標。

2 /否對話框打開接收到GPS座標。

3 /完全沒有。座標被傳遞給地理編碼器並轉換爲地址。我不知道爲什麼,因爲你不使用這個地址(除了顯示)

4 /編號coords字符串創建在3 /,但電子郵件發送1 /,因此很多之前。

你實際上想要做的是發送電子郵件之後你收到了座標,就是在onLocationChanged方法中。

+0

謝謝!這有幫助!我想我有一個小問題的工作解決方案。 –