【问题标题】:How to get location data from a class in maps activity in android?如何从android的地图活动中的类中获取位置数据?
【发布时间】:2016-12-23 11:47:49
【问题描述】:

我一直在执行FusedLocationProvider。 但是,我确实在单个活动中实现并获得了经纬度,但是我现在尝试的是在单独的非活动类 GetLocationActivity 中实现它,并在我的 Maps_activity 类中获取位置数据,当我单击按钮时,但是我我无法获取数据!

是否可以从课程中获取数据并将其显示在我的地图活动中? 我还尝试用 sharedPref 将数据保存在一个类中,但没有结果。

P.S : 我认为 GetLocationActivity 没有运行或者我无法实例化它。

这里是代码

Map_activity.java

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private GoogleApiClient mGoogleApiClient;
    private FloatingActionButton floatingActionButton;
    private static final String LIST_FRAGMENT_TAG = "list_fragment";
    private static final String TAG = "list_fragment";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        floatingActionButton = (FloatingActionButton) findViewById(R.id.fab);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        final GetLocationActivity obj = new GetLocationActivity();
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                obj.GetLocation();

            }
        });
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Karachi and move the camera
        LatLng sydney = new LatLng(24.9217531, 66.8943302);
        //mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Karachi"));
        mMap.animateCamera(CameraUpdateFactory.zoomTo(10.75f));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();

    }

GetLocationActivity.java

public class GetLocationActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener , com.google.android.gms.location.LocationListener {

    public final static String TAG = "Application";
    private GoogleApiClient mGoogleApiClient;
    private Location mLastLocation;
    private LocationRequest mLocationRequest;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .addApi(LocationServices.API)
                    .build();
        }


    }

    public void GetLocation()
    {
        try {

            mLocationRequest = LocationRequest.create();
            mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
            mLocationRequest.setInterval(10000); // Update location every second

            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);

            mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                    mGoogleApiClient);
            if (mLastLocation != null) {


                Log.d(TAG, "onConnected: "+String.valueOf(mLastLocation.getLatitude()));
                Log.d(TAG, "onConnected: "+String.valueOf(mLastLocation.getLongitude()));

            }
        } catch (SecurityException e) {

        }

    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {
            GetLocation();
    }

    @Override
    public void onConnectionSuspended(int i) {
        Toast.makeText(this, "onConnectionSuspended: " + String.valueOf(i),
                Toast.LENGTH_LONG).show();
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
        Toast.makeText(this, "onConnectionFailed: " + connectionResult.toString(),
                Toast.LENGTH_LONG).show();
    }

    protected void onStart() {
        mGoogleApiClient.connect();
        super.onStart();
    }

    protected void onStop() {
        mGoogleApiClient.disconnect();
        super.onStop();
    }

    @Override
    public void onLocationChanged(Location location) {

    }

【问题讨论】:

  • GetLocationActivity obj = new GetLocationActivity(); 不会工作,例如 oncreate 不会被自动调用加上不要这样做,创建一个简单的类 no extends things 将你的逻辑移到那里并在任何你想要的地方使用它
  • @PavneetSingh 但它迫使我在一个类中运行 GoogleClient 以获取位置。我怎样才能运行其他类?
  • 是的,您必须将上下文传递给它,您当前的方法不会按您想要的方式工作,您还需要在活动和位置逻辑类之间实现通信接口
  • 怎么样?你能给我举个例子吗
  • 是的,我可以,但它会是一个相当大的代码,如果我这样做,我也必须为更多的读者写很多解释,所以等待一段时间,如果没有答案出现(我希望不是)然后我会发布它,同时read this link,它将是您实施的关键部分

标签: android android-activity google-maps-android-api-2 fusedlocationproviderapi


【解决方案1】:

尝试使用 static

GetLocation()
public static void getLocation() {
    ...
}

像这样访问那个函数

floatingActionButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        GetLocationActivity.getLocation();
    }
});

据我所知,我们不必使用实例对象来访问它,我们可以使用静态对象来访问它。 CMIIW。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多