2014-04-28 3 views
2

내 게임에 100MB가 있기 때문에 확장 파일을 사용해야합니다. 난 그냥 주, 패치 확장 파일을 사용하지 않는getAPKExpansionZipFile()이 null을 반환합니다.

ZipResourceFile expansionFile = null; 

    try { 
     expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getApplicationContext(),2,0); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

) (에서 onCreate 함수에서 MainActivity 코드 아래에 넣어, 그래서 버전이 올바른지으로 나는 공을 넣어 같아요. expansionFile이 성공적으로로드되었는지 확인하기 위해 로그 할 때 null 값을 얻습니다.

if(expansionFile == null) 
     Gdx.app.log("EXPANSION_FILE", "NULL"); 
    else 
     Gdx.app.log("EXPANSION_FILE", "NOT NULL"); 

나는 https://developer.android.com/google/play/expansion-files.html 에 대한 지침을 따라 내 Nexus 기기에 폴더에 수동으로 main.2.com.my.game.obb 파일을 넣어 : 안드로이드의 다른 OBB 파일이 있습니다

Internal storage\Android\obb\com.my.game\ 

\ obb 폴더가 다른 게임과 다를 수 있으므로 올바른 위치 여야합니다. obb 확장 파일을 마운트하지 않는 이유는 무엇입니까?

UPDATE 나는 DownloaderActivity 구현과 아무 문제없이 확장 파일을 다운로드합니다. 그것은 나에게 "Not zip archive"로그 메시지를 주었다. 나는 그것을 피하는 방법을 발견했다. OBB 파일을 압축하여 개발자 콘솔에 업로드했습니다. 그것은 자동으로 OBB로 변환되었지만, 이번에는 Nexus에 다운로드했을 때 더 이상 null 값을 ZipResourceFile에게 주었고 더 이상 "압축 파일이 아닙니다"라는 메시지가 나타나지 않습니다. 하지만 Libgdx에서 AssetManager를 사용하고 있기 때문에 여전히 파일에 액세스 할 수 없습니다.

나는 다른 방법을 발견했다. 나는 지금 테스트 중이다.

+0

브로 이봐, u는 당신이 assetmanager ?? –

+1

안녕 chelo_c를 해결 했는가? 특급 유엔 libgdx를 파일을 사용하는 관리 않았다 중요한 것을 :(몰랐어요. 그래, 난 적어도 이미지를로드 관리해야 그래서 나는 AssetManager의 두 인스턴스로 끝났습니다. 사용자 지정 FileHandle을 사용하는 사용자 지정 FileHandleResolver를 만들어야했습니다 .FileHandle에서 zip 파일을로드하는 read() 함수를 재정의합니다. AssetManager의 인스턴스 인 경우 FileHandleResolver를 생성자에 전달합니다. 내 대답에 전체 솔루션을 쓸 것입니다. – draziw

답변

3

getAPKExpansionZipFile()이 null을 반환하는 문제에 대한 해결책은 JOBB 도구를 사용하지 않고 모든 콘텐츠를 압축하여 업로드하는 것입니다. Google Play는 자동으로 OBB로 변환합니다.

완벽한 솔루션은 확장 파일에서 이미지를로드 :

나는 ZipResourceFile의 인스턴스 내 자신의 게임 클래스의 정적 변수를 만들었습니다. MainActivity 클래스에 확장 파일을로드하고이 파일을 내 FileHandle 클래스에서 사용하여 이미지를 가져 오기 때문에 정적으로 만들었습니다. 다른 방법을 찾으면 그것은 당신에게 달려 있습니다. 이게 내가 한 일이야.

public static ZipResourceFile expansionFile;

그런 다음 MainActivity 클래스로드 확장 파일에 있습니다. 나는 OnCreate() 함수에서 그것을했다.

try { 
     GameInfo.expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getBaseContext(),22,0);  
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
함수에

전달 된 값은 다음과 같습니다

android:versionCode="22" 

또한 확장 파일이 있어야합니다 : 매니페스트 파일에 선언

getAPKExpansionZipFile(Context ctx, int mainVersion, int patchVersion) 

mainVersion 정확하게 일치해야합니다 그 이름과 같은 번호 :

main.mainVersion.com.name.title 

자신의 FileHandle 클래스를 만듭니다. 여기서 "image"와 같은 특정 파일을 찾습니다.당신이 사용자 정의 파일 핸들 사용하는 경우 확장 파일에 PNG ".

public class CustomFileHandle extends FileHandle 
{ 
    public CustomFileHandle (String fileName) {  
     super(fileName); 
    } 

    @Override 
    public InputStream read() 
    { 
     InputStream input = null; 

     try {   
      input = GameInfo.expansionFile.getInputStream(file.getPath().replace('\\', '/')); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return input; 
    } 
} 

자신의 FileHandleResolver 클래스를 만듭니다.입니다.

public class CustomFileHandleResolver implements FileHandleResolver 
{ 
    @Override 
    public FileHandle resolve(String fileName) { 
     return new CustomFileHandle(fileName); 
    } 
} 

이 AssetManager의 인스턴스를 생성하고 생성자에 FileHandleResolver을 전달합니다.

assetManager = new AssetManager(new CustomFileHandleResolver()); 

어떤 단계를 생략하지 않았다면 확장 파일에서 파일을로드하기 위해 수행해야하는 작업입니다. 처음에 언급했듯이 문제가 발견되었습니다. JOBB 도구를 사용하여 파일을 OBB 파일로 압축하십시오. getAPKExpansionZipFile()은 null을 반환합니다. 그래서 저는 대신 모든 파일을 압축했습니다. 더 자세한 설명을 보려면 여기를 클릭하십시오 : https://developer.android.com/google/play/expansion-files.html

0

나를위한 확장 파일 크기는 바이트입니다. 나는 압축을 풀었고 코드에서 파일 크기를 변경하지 않았다. 따라서 나는 null 값을 얻고 있었다. 나는 몇 바이트 만 떨어져 있었고 직장에서 하루 종일 걸렸습니다. 이

private static final XAPKFile[] xAPKS = { 
     new XAPKFile(true, Constants.MAIN_OBB_VERSION, Constants.EXPANSION_FILE_SIZE) // right here expansion file size must match exactly. 
}; 

//in Constants class 

public static final int EXPANSION_FILE_SIZE = 285516838; //expansion file size in bytes