首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSMDroid -地图不显示

OSMDroid -地图不显示
EN

Stack Overflow用户
提问于 2018-02-04 12:42:24
回答 5查看 6.1K关注 0票数 1

我正在尝试在我的应用程序上加载开放的街道地图。

我的代码如下:

代码语言:javascript
复制
import android.app.Activity;
import android.os.Bundle;

import org.osmdroid.config.Configuration;
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.views.MapView;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;


public class OsmActivity extends Activity {
private MapView         mMapView;
private MapController   mMapController;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_osm);


    Configuration.getInstance().setUserAgentValue(getPackageName());

    mMapView = (MapView) findViewById(R.id.map);
    mMapView.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
    mMapView.setBuiltInZoomControls(true);
    mMapController = (MapController) mMapView.getController();
    mMapController.setZoom(13);
    GeoPoint gPt = new GeoPoint(51500000, -150000);
    mMapController.setCenter(gPt);
}
}

我正在使用osmdroid 5.6.5 (通过Maven)。

我根据osmdroid文档定义我的用户代理。

代码语言:javascript
复制
Configuration.getInstance().setUserAgentValue(getPackageName());

我有以下API设置:

代码语言:javascript
复制
android {
compileSdkVersion 26
defaultConfig {
    applicationId "com.loco_zero.locolizetestsosm"
    minSdkVersion 21
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

具有以下权限:

代码语言:javascript
复制
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"  />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

我有网格和缩放按钮,但是地图不会显示。我知道这些错误:

代码语言:javascript
复制
I/StorageUtils: /sdcard is NOT writable
I/StorageUtils: /storage/emulated/0 is NOT writable
I/OsmDroid: Using tile source: Mapnik
E/SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
E/SQLiteLog: (14) os_unix.c:31278: (13) open(/storage/emulated/0/osmdroid/tiles/cache.db) - 
E/SQLiteDatabase: Failed to open database '/storage/emulated/0/osmdroid/tiles/cache.db'.
              android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database

D/OsmDroid: Unable to store cached tile from Mapnik /13/4090/2719, database not available.

我做错了什么?我可以告诉OSMDroid使用sdcard文件夹以外的其他东西吗?

编辑

为了在运行时获得权限,我添加了以下内容,它做到了这一点:

代码语言:javascript
复制
    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG, "Permission is granted");
        } else {
            Log.v(TAG, "Permission is revoked");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-02-04 19:21:33

确保正确启用运行时权限。您将需要外部存储以及互联网存储。还请检查清单权限。

票数 6
EN

Stack Overflow用户

发布于 2021-08-22 14:24:44

谢恩接受的回答为我指明了正确的方向。但是,权限请求改变了:

如果从前29版本迁移,则还必须包括对外部存储<application android:requestLegacyExternalStorage="true" ...的遗留权限。

票数 2
EN

Stack Overflow用户

发布于 2018-02-06 12:09:21

这其实是一种奇怪的情况。第一次启动时,osmdroid会检测映射块缓存的最大可写存储位置。如果没有找到,则应默认为应用程序提供存储。我想这件事在你的案子里没有发生,因为你没有这么说

Configuration.getInstance().load(context, PreferenceManager.getDefaultSharedPreferences(context));

它可能需要在文档中有更多的可见性,但这将启动发现过程。这应该在创建地图视图之前完成。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48608180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档