在Api 25的osmdroid上的Map视图中的权限

时间:2017-09-15 09:19:26

标签: android permissions openstreetmap osmdroid

根据 osmdroid wiki,我添加了"dangerous" permissions at runtime

 @Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        if (hasPermissions()) {
        initMap();
    } else {
        ActivityCompat.requestPermissions(this, new String[]{
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
    }
}
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 1) {
        if (hasPermissions()) {
            initMap();
        } else {
            finish();
        }
    }
}

但是,当我第一次运行我的应用并提供权限位置和其他所需的权限时,我的地图不会出现,但是当我运行我的应用时第二次显示地图?我知道这个问题是允许的,但我的许可问题在哪里?

    private boolean hasPermissions() {
    return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
            PackageManager.PERMISSION_GRANTED &&
            ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
                    PackageManager.PERMISSION_GRANTED &&
            ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) ==
                    PackageManager.PERMISSION_GRANTED;
}

这是我的明确许可:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

3 个答案:

答案 0 :(得分:2)

我说:

setContentView(R.layout.activity_main);

进入initMap(),问题就没了。

答案 1 :(得分:0)

onRequestPermissionsResult() initMap() 之前尝试延迟几秒钟>

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
    if (hasPermissions()) {
            new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                initMap();
            }
        }, 3000);

    } else {
        finish();
    }
}

更新的权限有时需要时间反映到代码中。

答案 2 :(得分:0)

我遇到了同样的问题,我从 osmdroid 官方维基中找到了以下代码片段,这对我有用。 (我使用的是6.0.1版本)

尝试在Activity或Fragment onCreate()时输入以下代码:

@Override public void onCreate(Bundle savedInstanceState) {
    Context ctx = getApplicationContext();
    Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx));
    ...
    setContentView(R.layout.activity_main);
}

在运行时授予“危险”权限后,重新创建活动或片段。然后mapView将正常工作而无需重新打开APP。