반응형
Assets 폴더의 파일에 Android 경로 문자열을 가져 오는 방법은 무엇입니까?
문자열 경로 를 수신해야하는 맵 API를 사용하고 있고 내 맵을 assets 폴더에 저장해야하므로 assets 폴더의 파일에 대한 문자열 경로 를 알아야 합니다.
이것은 내가 시도하는 코드입니다.
MapView mapView = new MapView(this);
mapView.setClickable(true);
mapView.setBuiltInZoomControls(true);
mapView.setMapFile("file:///android_asset/m1.map");
setContentView(mapView);
뭔가 잘못을가는 "file:///android_asset/m1.map"
지도가로드되지 않고 있기 때문이다.
내 자산 폴더에 저장된 m1.map 파일의 올바른 문자열 경로 파일은 무엇입니까?
감사
뒤에도에 대한 편집 : 작동하지 않는이 코드는, 그것은 실패 is.read(buffer);
와 IOException이
try {
InputStream is = getAssets().open("m1.map");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
text = new String(buffer);
} catch (IOException e) {throw new RuntimeException(e);}
자산 디렉토리의 파일은 압축이 풀리지 않습니다. 대신 APK (ZIP) 파일에서 직접 읽습니다.
따라서 파일 이 자산 '파일'을 받아들이는 것을 기대하는 것은 실제로 만들 수 없습니다 .
대신 Dumitru가 제안한 것처럼 자산을 추출하여 별도의 파일에 작성해야합니다.
File f = new File(getCacheDir()+"/m1.map");
if (!f.exists()) try {
InputStream is = getAssets().open("m1.map");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
FileOutputStream fos = new FileOutputStream(f);
fos.write(buffer);
fos.close();
} catch (Exception e) { throw new RuntimeException(e); }
mapView.setMapFile(f.getPath());
SDK와 함께 제공되는 API 샘플에서 ReadAsset.java를 살펴보십시오.
try {
InputStream is = getAssets().open("read_asset.txt");
// We guarantee that the available method returns the total
// size of the asset... of course, this does mean that a single
// asset can't be more than 2 gigs.
int size = is.available();
// Read the entire asset into a local byte buffer.
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
// Convert the buffer into a string.
String text = new String(buffer);
// Finally stick the string into the text view.
TextView tv = (TextView)findViewById(R.id.text);
tv.setText(text);
} catch (IOException e) {
// Should never happen!
throw new RuntimeException(e);
}
이 방법을 사용할 수 있습니다.
public static File getRobotCacheFile(Context context) throws IOException {
File cacheFile = new File(context.getCacheDir(), "robot.png");
try {
InputStream inputStream = context.getAssets().open("robot.png");
try {
FileOutputStream outputStream = new FileOutputStream(cacheFile);
try {
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
} finally {
outputStream.close();
}
} finally {
inputStream.close();
}
} catch (IOException e) {
throw new IOException("Could not open robot png", e);
}
return cacheFile;
}
이러한 경우 InputStream.available () 을 사용 해서는 안됩니다 . 버퍼링 된 바이트 만 반환합니다. .available () 메서드는 더 큰 파일에서는 작동하지 않으며 일부 장치에서는 전혀 작동하지 않습니다.
Kotlin에서 (; D) :
@Throws(IOException::class)
fun getRobotCacheFile(context: Context): File = File(context.cacheDir, "robot.png")
.also {
it.outputStream().use { cache -> context.assets.open("robot.png").use { it.copyTo(cache) } }
}
Jacek의 완벽한 솔루션을 추가하기 위해. Kotlin에서이 작업을 수행하려고하면 즉시 작동하지 않습니다. 대신 다음을 사용하는 것이 좋습니다.
@Throws(IOException::class)
fun getSplashVideo(context: Context): File {
val cacheFile = File(context.cacheDir, "splash_video")
try {
val inputStream = context.assets.open("splash_video")
val outputStream = FileOutputStream(cacheFile)
try {
inputStream.copyTo(outputStream)
} finally {
inputStream.close()
outputStream.close()
}
} catch (e: IOException) {
throw IOException("Could not open splash_video", e)
}
return cacheFile
}
반응형
'IT박스' 카테고리의 다른 글
iPhone UIWebView를 사용할 때 Asp.Net 양식 인증 (0) | 2020.12.01 |
---|---|
Style과 ControlTemplate의 차이점 (0) | 2020.12.01 |
Facebook OAuth 2.0 "코드"및 "토큰" (0) | 2020.12.01 |
Array.empty의 반대 방법은 무엇입니까? (0) | 2020.12.01 |
Git 되돌리기를 사용하는 방법 (0) | 2020.12.01 |