Android 百度離線地圖(由apk文件轉入手機內部存儲)
最近做了一個小項目,需要使用百度地圖,但是使用了VPN專線,不能連接外網,也就是說我不能使用百度地圖自帶的離線地圖下載方式,因為從軟件安裝開始就是在無網狀態下執行的,因此需要另外使用一種方法實現百度地圖的展示。
首先換一種思路,我們現將手機連接網絡下載百度地圖離線包,將下載下來的百度地圖離線文件找到,將這些離線包放進APP的目錄下,在app里面寫一段代碼,在某一時刻將APP里的這些離線包寫入手機內存,這樣百度地圖就可以使用手機內存中的離線地圖包了。手機的離線包是 .dat結尾的,注意一下,有些方式下載下來不是,可能用不了
下載的百度離線地圖包在文件管理下,Android/data/應用項目包/files/BaiduMapSDKNew/vmp 下,比如下載了幾個是這個樣子,把這幾個問價放到APP項目assets文件夾下:
APP項目assets文件夾:
然后寫一個類,作用主要是把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。到這里基本上就完成了,只要在某個時刻把這個方法執行一下就可以了!