【问题标题】:Log doesn't display Location data日志不显示位置数据
【发布时间】:2018-06-27 21:16:29
【问题描述】:

我正在上一门 Android 课程,我们在其中学习如何获取位置数据。跟着导师,我想我完全按照他说的做了这个应用程序,尽管我的 Android Monitor 中没有任何位置数据。

我使用的是 Android Studio 2.3.3,并在华为 p10 lite 上运行该应用。

代码看起来像这样,其实很基本:

public class MainActivity extends AppCompatActivity {

LocationManager locationManager;

LocationListener locationListener;

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

    }

}

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

    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

    locationListener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {

            Log.i("Location", location.toString());

        }

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

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }

    };

    // If device is running SDK < 23

    if (Build.VERSION.SDK_INT < 23) {

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

    } else {

        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            // ask for permission

            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);


        } else {

            // we have permission!

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

        }

    }

}

}

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.robpercival.locationdemo">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

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

</manifest>

【问题讨论】:

  • 嘿亚历山大!感谢您的快速答复!如果我将 toString() 排除在外,它会立即给我一个错误:错误:(52、39)错误:不兼容的类型:位置无法转换为字符串我也使用了占位符,但我的日志仍然没有显示位置数据:/ :(
  • 感觉编译器连权限阶段都没有通过,或者出错了,所以从来没有调用过onLocationChanged。尝试了 Toast 而不是 Logging,以及 textView,我只是没有得到位置数据:/
  • 我有一根更长的电缆,只是为了移动手机,这意味着我真的改变了位置,我得到了这些:HwPointEventFilter: do not support AFT because no config

标签: java android permissions gps location


【解决方案1】:

这与日志无关。这与您请求许可的方式有关

  1. 使用状态码请求许可。在您的情况下,您使用 1 作为状态码。

    ActivityCompat.requestPermissions(thisActivity, 新字符串[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);

  2. 根据请求代码处理结果。您没有正确执行此操作。所以你永远不会收到onLocationChanged 的回调。

    @Override public void onRequestPermissionsResult(int requestCode,
            String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
    
            // other 'case' lines to check for other
            // permissions this app might request.
        } 
    

    }

更详细的解释请参考https://developer.android.com/training/permissions/requesting#java

【讨论】:

  • 嘿Yogesh!谢谢您的回答!我也这样做了,但不是使用 switch case,而是嵌套了 if 语句,或者我只是不明白我的错误是什么,请你澄清一下!
  • 这更像是一种改进。但是,是的,我认为这不是问题。此外,由于您在 2.3.3 上运行,因此应自动授予权限。这可能是由于参数位移和时间。你尝试改变那些吗?
猜你喜欢
  • 2018-09-10
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2017-08-29
  • 2018-12-07
相关资源
最近更新 更多