Java 将纬度和经度传递给Android中的Google API Places搜索

Java 将纬度和经度传递给Android中的Google API Places搜索,java,android,google-api,Java,Android,Google Api,我已经找了好几个星期了。我是一名java程序员新手,但我已经能够拼凑出一个应用程序,可以使用在同一类中硬编码的双纬度和经度。它将显示围绕这些点的当前位置列表。我有另一个单独的类,它有一个基于gps/网络获取当前位置的方法,但是我不能将从第二个类创建的变量传递给PlaceRequest类。我已经阅读了以上主题的所有教程,但没有任何结合当前位置和地点搜索结果的内容。我声明了两个getter,但不能调用其中的变量。同样是一个新手,所以可能是一个简单的解决办法。有什么想法吗 更新-以下是我迄今为止的代码

我已经找了好几个星期了。我是一名java程序员新手,但我已经能够拼凑出一个应用程序,可以使用在同一类中硬编码的双纬度和经度。它将显示围绕这些点的当前位置列表。我有另一个单独的类,它有一个基于gps/网络获取当前位置的方法,但是我不能将从第二个类创建的变量传递给PlaceRequest类。我已经阅读了以上主题的所有教程,但没有任何结合当前位置和地点搜索结果的内容。我声明了两个getter,但不能调用其中的变量。同样是一个新手,所以可能是一个简单的解决办法。有什么想法吗

更新-以下是我迄今为止的代码: GooglePlaceActivity.java

    public class GooglePlaceActivity extends Activity {
/** Called when the activity is first created. */
Button btn1;
TextView txt1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.main);
    btn1 = (Button)findViewById(R.id.button1);
    txt1 = (TextView)findViewById(R.id.textView1);
    btn1.setOnClickListener(l);     
}

private class SearchSrv extends AsyncTask<Void, Void, PlacesList>{

    @Override
    protected PlacesList doInBackground(Void... params) {

        PlacesList pl = null;
        try {
            pl = new PlaceRequest().performSearch();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pl;
    }

    @Override
    protected void onPostExecute(PlacesList result) {

        String text = "Result \n";

        if (result!=null){
            for(Place place: result.results){
                text = text + place.name +"\n";
            }
            txt1.setText(text);
        }
        setProgressBarIndeterminateVisibility(false);
    }
}

View.OnClickListener l = new View.OnClickListener() {   

    @Override

    public void onClick(View v) {
        // TODO Auto-generated method stub

        SearchSrv srv = new SearchSrv();
        setProgressBarIndeterminateVisibility(true);
        srv.execute();          

    }
};
}

///////////// CurrentLocation.java

    public class CurrentLocation {

    private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
    private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Milliseconds

    LocationManager locationManager ;
    double latitude=0;
    double longitude=0;


    public CurrentLocation(Context ctxt) {
super();
locationManager = (LocationManager) ctxt.getSystemService(Context.LOCATION_SERVICE);

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
        MINIMUM_TIME_BETWEEN_UPDATES,
        MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
        new LocationListener() {

            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {}

            @Override
            public void onProviderEnabled(String provider) {}

            @Override
            public void onProviderDisabled(String provider) {}

            @Override
            public void onLocationChanged(Location location) {
                longitude = location.getLongitude();
                latitude = location.getLatitude();

            }
        });

    }
    public double getLatitude() {
return latitude;
    }
    public double getLongitude() {
return longitude;
    } 
    }

编辑:在查看了您的完整代码之后,我看到了一些基本的设计缺陷,所以我将向您展示我是如何做到这一点的,并且您可以根据您的程序流程对其进行调整。请记住,这个例子已经大大简化了我的原稿,但它应该足以让你继续下去

首先是CurrentLocation.java文件。我的设计决定是将它包装在一个容器中,这样我就可以在多个活动中重复使用它,并在必要时杀死它

public class CurrentLocation implements Callable<Location> {

  private static final String TAG = "CurrentLocation";
  private Context context;
  private LocationManager lm;
  private Criteria criteria;
  private Location bestResult;
  private boolean locationListenerWorking;


  public CurrentLocation(Context context) {
    lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    this.context = context;
    criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    bestResult = null;
    locationListenerWorking = false;
  }


  public Location call() {
    return getLoc();
  }


  private Location getLoc() {
    String provider = lm.getBestProvider(criteria, true);
    if (provider != null) {
      Log.d(TAG, "Using provider: " +provider);
      locationListenerWorking = true;
      lm.requestLocationUpdates(provider,
                                0,
                                0,
                                singeUpdateListener,
                                context.getMainLooper());
    } else {
      Log.w(TAG, "Couldn't find a location provider");
      return null;
    }



    while (locationListenerWorking) {
      // Check for the interrupt signal - terminate if necessary
      if (Thread.currentThread().isInterrupted()) {
        Log.i(TAG, "User initiated interrupt (cancel signal)");
        cleanup();
        break;
      }

      try {
        // ghetto implementation of a busy wait...
        Thread.sleep(500); // Sleep for half a second
      } catch (Exception e) {
        Log.d(TAG, "Thread interrupted..");
        cleanup();
        break;
      }
    }

    return bestResult;
  }




  private void cleanup() {
    if (lm != null) {
      Log.d(TAG, "Location manager not null - cleaning up");
      lm.removeUpdates(singeUpdateListener);
    } else {
      Log.d(TAG, "Location manager was NULL - no cleanup necessary");
    }
  }




  /**
   * This one-off {@link LocationListener} simply listens for a single location
   * update before unregistering itself.  The one-off location update is
   * returned via the {@link LocationListener} specified in {@link
   * setChangedLocationListener}.
   */
  private LocationListener singeUpdateListener = new LocationListener() {
      public void onLocationChanged(Location location) {
        Log.d(TAG, "Got a location update");
        if (location == null) {
          Log.d(TAG, "Seems as if we got a null location");
        } else {
          bestResult = location;
        }

        cleanup();
        locationListenerWorking = false;
      }

      public void onStatusChanged(String provider, int status, Bundle extras) {}
      public void onProviderEnabled(String provider) {}    
      public void onProviderDisabled(String provider) {}
    };

}
最后总结一下,以下是您如何称呼它:

GetLocationTask t = new GetLocationTask();
t.execute();
如果您需要在用户退出活动等情况下出于任何原因终止位置更新,这将终止AsyncTask以及相关的未来任务

t.killTask();

另外,您可能希望更改API密钥并在帖子中对其进行编辑。

我不能将从第二个类创建的变量传递到PlaceRequest类是什么意思?如果没有更多的细节,我想没有人能帮助你——也许是一些代码?另外,请解释一下你到底被困在哪里。谢谢你的回复,马文。基本上我有两门课。CurrentLocation.java文件获取当前位置并使用两个getter:public double getLatitude{//latitude=40.77203;返回纬度;}public double getLongitude{//longitude=-96.61344;返回经度;}另一个类是PlaceRequest.java,它根据硬编码的纬度和经度变量执行位置搜索,但我想使用CurrentLocation.java文件中的变量,这些变量是基于位置的动态变量。我尝试过各种不同的解决方案,但都没有成功。下面是一些代码:CurrentLocation clo=newcurrentlocationnull;双经度=clo.getLongitude;双纬度=clo.getLatitude;我认为解决方案可能很简单,但我仍在学习java的基础知识——感谢您的建议。我也很乐意通过电子邮件发送我的代码。请编辑您的帖子,并包括CurrentLocation.java和PlaceRequest.java。如果合适,还包括调用CurrentLocation和/或PlaceRequest的主要活动。谢谢Marvin!我真的很感谢你的帮助,并为没有提供足够的信息而道歉。如果有帮助的话,我在上面发布了我的代码:上面的代码在eclipse中没有任何错误,但是当我在模拟器中运行并通过ddms向它提供gps坐标时,它什么也不显示。我尝试在getter中硬编码lat和lon,但仍然不起作用。谢谢你看!一开始,我就看到您正在使用null调用CurrentLocationContext ctxt。您希望它如何从中检索locationManager对象?另外,请记住locationManager.requestLocationUpdates是一个异步过程,因此您不能期望在此之后立即收到lat和lon。在本例中,clo.getLongitude几乎总是返回其默认值0。onLocationChanged回调就是为此而设计的。哈——这是我真正的问题——我是这方面的新手。我在尝试调用没有参数的CurrentLocation时遇到错误,所以这是我最好的猜测。我尝试了各种各样的方法,但都没用。你知道这个论点应该是什么吗?我只是想最终学习java和android,但我可以想象我的代码乱七八糟……马文,我真是太感谢你了!我是一名具有php技能的设计师,但我真的很想学习java。我很高兴知道你改变了你所做的事情。现在我怎么给你买啤酒@mikeinlincoln不客气:因为您才刚刚开始,所以要始终获得用户的位置,然后继续使用PlacesAPI。从位置示例构建。
GetLocationTask t = new GetLocationTask();
t.execute();
t.killTask();