Android Google Maps v2 从资产中的图像加载 OverlayTile

Posted

技术标签:

【中文标题】Android Google Maps v2 从资产中的图像加载 OverlayTile【英文标题】:Android Google Maps v2 load OverlayTile from image in assets 【发布时间】:2014-07-01 21:42:53 【问题描述】:

我需要获取我在本地存储在我的应用程序中的图像的文件 URL。我不在乎我在本地将文件存储在哪里,只是在某个可以获取它的 URL 的地方。我尝试了资产和资源,但没有成功。

我想要做的是覆盖 UrlTileProvider:

public class FileSystemTileProvider extends UrlTileProvider 

    public FileSystemTileProvider(int width, int height, String assestsDirectory) 
        super(width, height);
    

    @Override
    public URL getTileUrl(int x, int y, int z) 
        String tile = "file://<somewhere>/background.png";

        URL fileUrl = null;
        try 
            fileUrl = new URL(tile);
         catch (MalformedURLException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        


        return fileUrl;
    

我需要返回一个 URL 才能正常工作。我已经硬编码了一个文件 url,它确实有效。但是我需要一种方法来获取我的 background.png 图像的 URL。这可能吗?

【问题讨论】:

我认为文件 url 有 3 个斜杠 file:/// 在 phonegap 你可以使用类似 file:///android_asset/www/index.html 【参考方案1】:

我认为你不能通过这种方式访问​​它。

但您可以改为直接实现 TileProvider 并编写自己的实现

public Tile getTile (int x, int y, int zoom) 
   //get the drawable
   ...
   Bitmap bitmap = drawable.getBitmap();
   ByteArrayOutputStream stream = new ByteArrayOutputStream();
   bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
   return Tile(WIDTH, HEIGHT, stream.toByteArray());

从drawables文件夹中获取drawable:

Resources res = getResources();
Drawable shape = res. getDrawable(R.drawable.background);

或来自资产文件夹:

InputStream ins = getAssets().open("background.jpg");
Drawable d = Drawable.createFromStream(ins, null);

【讨论】:

正是我想要的。我在尝试做一个 UrlTileProvider 时被卡住了,不知道为什么我把它卡在了我的脑海中并且无法绕过它。谢谢。【参考方案2】:

最简单的方法可能是将文件作为 asset 包含在 APK 中,然后使用 AssetManager 将其解压缩到应用的私有目录中。例如,如this answer 中所述,除了使用getFilesDir() 而不是getExternalFilesDir()(或者更简单,通过使用openFileOutput() 创建FileOutputStream 对象)。

另一种选择(特别是如果您想要/需要为不同的显示密度提供不同的背景图像)是将其包含为可绘制对象,然后 extract it with a similar method。

在您完成其中任何一项后(仅一次,例如在主 Activity 启动时)并使用已知名称保存文件后,只需在该文件中创建 URL

File backgroundFile = new File(getFilesDir(), fileName);
URL fileUrl = backgroundFile.toURI().toURL();

【讨论】:

以上是关于Android Google Maps v2 从资产中的图像加载 OverlayTile的主要内容,如果未能解决你的问题,请参考以下文章

Google Maps Android API V2 检查 Google Maps 应用程序是不是被禁用

android google maps v2 在服务中

Google Maps Android v2 中的集群标记

在 Google Maps Android SDK (v2) 中更改建筑物颜色

居中位图标记(Google Maps Android API v2)

为 Google Maps API v2 Android 发布流媒体方向