안드로이드 웹뷰 캐쉬를 SD 메모리에 쓰기

안드로이드 웹뷰 캐쉬를 내부메모리가 아닌 외부로 쓰게 할려고 방법을 찾다가
해외 사이트에서 방법을 찾았는데 까먹을까봐 여기 기록해둠

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.devahead.androidwebviewcacheonsd;
import java.io.File;
import android.app.Application;
import android.os.Environment;
public class ApplicationExt extends Application
{
// NOTE: the content of this path will be deleted
// when the application is uninstalled (Android 2.2 and higher)
protected File extStorageAppBasePath;
protected File extStorageAppCachePath;
@Override
public void onCreate()
{
super.onCreate();
// Check if the external storage is writeable
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
{
// Retrieve the base path for the application in the external storage
File externalStorageDir = Environment.getExternalStorageDirectory();
if (externalStorageDir != null)
{
// {SD_PATH}/Android/data/com.devahead.androidwebviewcacheonsd
extStorageAppBasePath = new File(externalStorageDir.getAbsolutePath() +
File.separator + "Android" + File.separator + "data" +
File.separator + getPackageName());
}
if (extStorageAppBasePath != null)
{
// {SD_PATH}/Android/data/com.devahead.androidwebviewcacheonsd/cache
extStorageAppCachePath = new File(extStorageAppBasePath.getAbsolutePath() +
File.separator + "cache");
boolean isCachePathAvailable = true;
if (!extStorageAppCachePath.exists())
{
// Create the cache path on the external storage
isCachePathAvailable = extStorageAppCachePath.mkdirs();
}
if (!isCachePathAvailable)
{
// Unable to create the cache path
extStorageAppCachePath = null;
}
}
}
}
@Override
public File getCacheDir()
{
// NOTE: this method is used in Android 2.2 and higher
if (extStorageAppCachePath != null)
{
// Use the external storage for the cache
return extStorageAppCachePath;
}
else
{
// /data/data/com.devahead.androidwebviewcacheonsd/cache
return super.getCacheDir();
}
}
}
package com.devahead.androidwebviewcacheonsd; import java.io.File; import android.app.Application; import android.os.Environment; public class ApplicationExt extends Application { // NOTE: the content of this path will be deleted // when the application is uninstalled (Android 2.2 and higher) protected File extStorageAppBasePath; protected File extStorageAppCachePath; @Override public void onCreate() { super.onCreate(); // Check if the external storage is writeable if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { // Retrieve the base path for the application in the external storage File externalStorageDir = Environment.getExternalStorageDirectory(); if (externalStorageDir != null) { // {SD_PATH}/Android/data/com.devahead.androidwebviewcacheonsd extStorageAppBasePath = new File(externalStorageDir.getAbsolutePath() + File.separator + "Android" + File.separator + "data" + File.separator + getPackageName()); } if (extStorageAppBasePath != null) { // {SD_PATH}/Android/data/com.devahead.androidwebviewcacheonsd/cache extStorageAppCachePath = new File(extStorageAppBasePath.getAbsolutePath() + File.separator + "cache"); boolean isCachePathAvailable = true; if (!extStorageAppCachePath.exists()) { // Create the cache path on the external storage isCachePathAvailable = extStorageAppCachePath.mkdirs(); } if (!isCachePathAvailable) { // Unable to create the cache path extStorageAppCachePath = null; } } } } @Override public File getCacheDir() { // NOTE: this method is used in Android 2.2 and higher if (extStorageAppCachePath != null) { // Use the external storage for the cache return extStorageAppCachePath; } else { // /data/data/com.devahead.androidwebviewcacheonsd/cache return super.getCacheDir(); } } }
package com.devahead.androidwebviewcacheonsd;

import java.io.File;
import android.app.Application;
import android.os.Environment;

public class ApplicationExt extends Application
{
	// NOTE: the content of this path will be deleted
	//       when the application is uninstalled (Android 2.2 and higher)
	protected File extStorageAppBasePath;

	protected File extStorageAppCachePath;

	@Override
	public void onCreate()
	{
		super.onCreate();

		// Check if the external storage is writeable
		if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
		{
			// Retrieve the base path for the application in the external storage
			File externalStorageDir = Environment.getExternalStorageDirectory();

			if (externalStorageDir != null)
			{
				// {SD_PATH}/Android/data/com.devahead.androidwebviewcacheonsd
				extStorageAppBasePath = new File(externalStorageDir.getAbsolutePath() +
					File.separator + "Android" + File.separator + "data" +
					File.separator + getPackageName());
			}

			if (extStorageAppBasePath != null)
			{
				// {SD_PATH}/Android/data/com.devahead.androidwebviewcacheonsd/cache
				extStorageAppCachePath = new File(extStorageAppBasePath.getAbsolutePath() +
					File.separator + "cache");

				boolean isCachePathAvailable = true;

				if (!extStorageAppCachePath.exists())
				{
					// Create the cache path on the external storage
					isCachePathAvailable = extStorageAppCachePath.mkdirs();
				}

				if (!isCachePathAvailable)
				{
					// Unable to create the cache path
					extStorageAppCachePath = null;
				}
			}
		}
	}

	@Override
	public File getCacheDir()
	{
		// NOTE: this method is used in Android 2.2 and higher

		if (extStorageAppCachePath != null)
		{
			// Use the external storage for the cache
			return extStorageAppCachePath;
		}
		else
		{
			// /data/data/com.devahead.androidwebviewcacheonsd/cache
			return super.getCacheDir();
		}
	}
}

이런 class를 하나 만들어 추가해준다.

웹뷰를 사용하는 액티비티 클래스에서

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
@Override
public File getCacheDir()
{
// NOTE: this method is used in Android 2.1
return getApplicationContext().getCacheDir();
}
@Override public File getCacheDir() { // NOTE: this method is used in Android 2.1 return getApplicationContext().getCacheDir(); }
@Override
	public File getCacheDir()
	{
		// NOTE: this method is used in Android 2.1

		return getApplicationContext().getCacheDir();
	}

함수를 하나 추가해 준다

그리고 Androidmenifest.xml에다가 아래와 같이 추가해준다.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:name="com.devahead.androidwebviewcacheonsd.ApplicationExt">
<activity
android:name=".MainActivity"
android:label="@string/app_name">
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:name="com.devahead.androidwebviewcacheonsd.ApplicationExt"> <activity android:name=".MainActivity" android:label="@string/app_name">
<application
	android:icon="@drawable/ic_launcher"
	android:label="@string/app_name"
	android:name="com.devahead.androidwebviewcacheonsd.ApplicationExt">
<activity
	android:name=".MainActivity"
	android:label="@string/app_name">

이 코드를 쓰면 웹브라우징 도중에 SD메모리가 빠진다던지 캐시클리어 명령이 안먹는다던지 뭐 자잘하게 문제가 생길 수 있다

그건 당신이 알아서 예외 처리 해야 한다고 함.
출처: http://www.devahead.com/blog/2012/01/saving-the-android-webview-cache-on-the-sd-card/


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다