android - 在android中获取位置

标签 android android-location

我正在尝试创建一个只在屏幕上显示坐标的应用程序。 list 文件中添加了以下权限。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

下面是MainActivity.java中的代码

import com.example.location.R;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.provider.Settings;

public class MainActivity extends Activity {

double latitude;
double longitude;

TextView lat, longi, loc, status;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lat = (TextView)findViewById(R.id.latitude);
    longi = (TextView)findViewById(R.id.longitude);
    status = (TextView)findViewById(R.id.status);
    loc = (TextView)findViewById(R.id.location);

    ContentResolver contentResolver = getBaseContext().getContentResolver();  
    boolean gpsStatus = Settings.Secure.isLocationProviderEnabled(contentResolver, LocationManager.GPS_PROVIDER); 

    if(gpsStatus){
        status.setText("GPS_PROVIDER is enabled.");
        // This is to check if GPS_PROVIDER is enabled or not.
        // This is working.
    }
}

@Override
protected void onResume(){
    super.onResume();
    loc.setText("Entered Resume method"); //This works as well.
    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();

            String str_lat = String.valueOf(latitude);
            String str_longi = String.valueOf(longitude);

            lat.setText(str_lat);
            longi.setText(str_longi);
            loc.setText((CharSequence) location);
        }
        @Override
        public void onStatusChanged(String provider, int status,Bundle extras) {
            // TODO Auto-generated method stub  
        }
        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }
    };
    final LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    //Location Location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    //double altitude = Location.getAltitude();
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
}  
}

该应用程序没有为纬度和经度文本设置文本,在模拟器中运行时,我没有看到任何错误。我什至没有将纬度和经度设置为 0.0、0.0。

在手机中运行应用程序时,几秒钟后,应用程序关闭并显示对话框“不幸的是,应用程序已停止”

以下是 logCat 中的错误信息。

11-04 23:35:48.250: E/AndroidRuntime(1224): FATAL EXCEPTION: main
11-04 23:35:48.250: E/AndroidRuntime(1224): Process: com.example.location, PID: 1224
11-04 23:35:48.250: E/AndroidRuntime(1224): java.lang.ClassCastException: android.location.Location cannot be cast to java.lang.CharSequence
11-04 23:35:48.250: E/AndroidRuntime(1224):     at com.example.location.MainActivity$1.onLocationChanged(MainActivity.java:65)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:279)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:208)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:224)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.os.Handler.dispatchMessage(Handler.java:102)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.os.Looper.loop(Looper.java:136)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at android.app.ActivityThread.main(ActivityThread.java:5017)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at java.lang.reflect.Method.invokeNative(Native Method)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at java.lang.reflect.Method.invoke(Method.java:515)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
11-04 23:35:48.250: E/AndroidRuntime(1224):     at dalvik.system.NativeStart.main(Native Method)

我是 android 编程的新手,所以如果我犯了任何愚蠢的错误并帮助我学习,请 kindle 指正我。非常感谢任何调试帮助。

最佳答案

试试这个类来定位

import com.arco.util.location.GPSTracker;
import com.arco.util.location.LocationUtils;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;

public class MYActivity extends Activity implements OnClickListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener {

    // Global variable to hold the current location
    Location mCurrentLocation;
    // Request to connect to Location Services
    private LocationRequest mLocationRequest;
    // Stores the current instantiation of the location client in this object
    private LocationClient mLocationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        // Create a new global location parameters object
        mLocationRequest = LocationRequest.create();
        // Set the update interval
        mLocationRequest.setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);
        // Use high accuracy
        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        // Set the interval ceiling to one minute
        mLocationRequest.setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);
        mLocationClient = new LocationClient(this, this, this);




    } // End OnCreate()



    @Override
    public void onStart() {
        super.onStart();
        mLocationClient.connect();
    }

    @Override
    public void onStop() {
        mLocationClient.disconnect();
        super.onStop();
    }

    /**
     * Verify that Google Play services is available before making a request.
     */
    private boolean servicesConnected() {

        // Check that Google Play services is available
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

        // If Google Play services is available
        if (ConnectionResult.SUCCESS == resultCode) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult mConnectionResult) {

        if (mConnectionResult.hasResolution()) {
            try {
                // Start an Activity that tries to resolve the error
                mConnectionResult.startResolutionForResult(this, LocationUtils.CONNECTION_FAILURE_RESOLUTION_REQUEST);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } 
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        try {
            if (servicesConnected()) {
                mLocationClient.requestLocationUpdates(mLocationRequest, this);
                // Get the current location
                Location currentLocation = mLocationClient.getLastLocation();
                if (currentLocation != null) {
                    mCurrentLocation = currentLocation;
                }
               mCurrentLocation.getLatitude();
               mCurrentLocation.getLongitude()
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onDisconnected() {
    }

    @Override
    public void onLocationChanged(Location location) {
        mCurrentLocation = location;
    }
}

关于android - 在android中获取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26749698/

相关文章:

java - 初始创建后将文本文件重新加载到数据库中

android - 应用程序中的监听器和切换 Activity

android - 网络连接已关闭,但位置提供程序是 NetworkProvider

java - 基于位置的 Android 应用程序错误

java - 如何获取当前位置和下一个当前位置之间的距离

Android 相机在没有 ExIf 的情况下保存照片

Android ImageView绘制

android - Squareup Picasso.with() 方法未解决 Android Studio

android - onHandleWork 从未收到来自 pendingintent 地理围栏的 Intent

android - 需要帮助了解 Android 上的 GPS