Android 使用百度离线地图(由apk文件转入手机内部存储)

Android 百度离线地图(由apk文件转入手机内部存储)

最近做了一个小项目,需要使用百度地图,但是使用了VPN专线,不能连接外网,也就是说我不能使用百度地图自带的离线地图下载方式,因为从软件安装开始就是在无网状态下执行的,因此需要另外使用一种方法实现百度地图的展示。

首先换一种思路,我们现将手机连接网络下载百度地图离线包,将下载下来的百度地图离线文件找到,将这些离线包放进APP的目录下,在app里面写一段代码,在某一时刻将APP里的这些离线包写入手机内存,这样百度地图就可以使用手机内存中的离线地图包了。手机用的离线包是以 .dat 结尾的,有些方式下载下来不是 dat 结尾可能用不了,注意一下!!!

下载的百度离线地图包在文件管理下,Android/data/应用项目包/files/BaiduMapSDKNew/vmp 下,比如下载了几个是这个样子,把这几个问价放到APP项目assets文件夹下:
Android 使用百度离线地图(由apk文件转入手机内部存储)_第1张图片
APP项目assets文件夹:
Android 使用百度离线地图(由apk文件转入手机内部存储)_第2张图片
然后写一个类,作用主要是把assets文件夹下的文件全部写到手机内部存储,然后使用百度地图的时候他检测到没有网就会去查看手机内部有没有离线地图,如果有的话,就可以显示出来。但是百度地图会检测appkey的有效性,如果联网可以检测出来并且使用,但是没有网络这个appkey就没法检测,如果调试的话会报appkey无效的错误,因为没法验证,但是不影响百度地图离线包的使用。

package com.wjw.ceshi.util;

import android.content.Context;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

public class MapOffLine {

    public static void copy(Context context) {
        try {
        	// 这个数组用来存放离线地图文件的名称
            String fileName[] = {
                    "binzhou_235.dat",
                    "dezhou_372.dat",
                    // 如果有其他的就加进来,因为是确定的所以说这样写尽管不合适,但是也行...
            };
            // 这个是百度地图在没有网络的时候读取离线文件的目录,也就是说我们要把APP assets文件夹下的百度离线地图包放到这个文件夹下。
            String path = context.getExternalFilesDir("/BaiduMapSDKNew/vmp").getPath();
            // 每个文件的路径,也是个数组
            String filepath[] = {
                    path + "/" + fileName[0],
                    path + "/" + fileName[1],
                    // 也是,fileName数组有几个就写几个。。。
            };
            File file = new File(path);
            if (!file.exists()) { // 判断一下这个路径有没有,没有的话就创建一下
                file.mkdir();
            }
            // 循环我们的地图文件
            for (int i = 0; i < fileName.length; i++) {
				// 如果这个地图文件没有
                if (!(new File(filepath[i])).exists()) {
                	// 如果手机内存没有这个文件就去创建一个文件
                    new File(filepath[i]).createNewFile();
                    // 一个流操作,把APP assets文件下对应的文件放进去,循环完成就OK了。
                    InputStream is = context.getAssets().open(
                            fileName[i]);
                    FileOutputStream fos = new FileOutputStream(filepath[i]);
                    byte[] buffer = new byte[8192];
                    int count = 0;
                    while ((count = is.read(buffer)) > 0) {
                        fos.write(buffer, 0, count);
                    }
                    fos.close();
                    is.close();
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

最好添加两个读写权限:

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

这两个权限是操作SD卡读写的,不知道这里需不需要,写上把先。

OK。到这里基本上就完成了,只要在某个时刻把这个方法执行一下就可以了!

你可能感兴趣的:(Android)