安卓6.0 ,第一行代码11章节,获取位置信息不显示

安卓6.0 ,获取位置信息,不显示


MainActivity.java

public class MainActivity extends AppCompatActivity {
    private TextView positionTextView;
    private LocationManager locationManager;
    private String provider;
    private Location location;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        positionTextView = (TextView) findViewById(R.id.position_text_view);
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //获取所有可用的位置提供器
        List<String> providerList = locationManager.getProviders(true);
        if (providerList.contains(LocationManager.GPS_PROVIDER)) {
            provider = LocationManager.GPS_PROVIDER;
        } else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
            provider = LocationManager.NETWORK_PROVIDER;
        } else {
            //当没有可用的位置提供器时,提示用户,并结束程序
            Toast.makeText(this, "No Location Provider to use", Toast.LENGTH_SHORT).show();
            return;
        }
        try {
            location = locationManager.getLastKnownLocation(provider);
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        if (location != null) {
            showLocation(location);
        }

        try {
            //实时更新地理信息
            locationManager.requestLocationUpdates(provider, 5000, 1, locationListener);
        } catch (SecurityException e) {
            e.printStackTrace();
        }

    }

    LocationListener locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            showLocation(location);
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };

    //设置positionTextView的值并显示
    private void showLocation(Location location) {
        String currentPosition = "latitude" + location.getLatitude() +
                "\n" + "longitude is" + location.getLongitude();
        positionTextView.setText(currentPosition);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (locationManager != null) {
            //关闭程序时将监听器移除
            try {
                locationManager.removeUpdates(locationListener);
            } catch (SecurityException e) {
                e.printStackTrace();
            }
        }
    }
}

XML布局


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.xhq.locationtest.MainActivity">

    <TextView
        android:id="@+id/position_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
阅读 5.7k
7 个回答

GPS权限加了没?还是你开启应用的时候是在室内,在室内GPS是获取不到位置信息的。而且LocationManager.NETWORK_PROVIDER默认是谷歌地图,国内用不了。

新手上路,请多包涵

国内用不了的,你用高德地图吧

6.0需要在代码中主动申请权限,不仅仅是manifest 声明

新手上路,请多包涵

权限问题,要用运行时权限

6.0需要主动去获取运行时权限
可以看看我之前写的博客

新手上路,请多包涵

我按照《第一行代码》书中的附赠源码,在自己手机上运行(Android6.0),首先得打开手机的GPS服务,然后运行时,通知栏会显示正在搜索GPS,需要等一会,然后可以出来结果;

书中的附录源码有的没有在AndroidManifest声明权限,本例中是
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

最近也在学,试了一下午,解决了这个问题:

  1. 先到工程的Gradle下面把minSdkVersion 23 都改成23的。 targetSdkVersion 23

  2. provider的类型设置为 LocationManager.NETWORK_PROVIDER。

解释:
1.因为6.0以上的动态权限设置,在目标版本低于6.0而手机又是6.0时会出现这个问题,把版本对应就好。
2。室内的GPS信号很差,会很久。最好设定为网络的就很快得到位置信息。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题