마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

50mb넘는 앱 확장파일 다운로드 받는 로직.. 완료됐다고 나오는데 파일이 없어요ㅠㅠ

0 추천

앱이 50mb가 넘어서 확장파일 만들고, 구글 개발자 콘솔에 올렸습니다.

구글링 해서 obb가 폰에 저장된다는 폴더에 임의로 obb파일을 넣고 테스트를 마치고..

obb파일 없이 apk파일만 설치한 후, obb파일이 해당 폴더에 없을 때 다운로드 받게 하는 로직을 테스트중인데요 ㅠㅠ

계속 해서 다운받은 파일의 경로를 읽어오다 앱이 죽어버려서 로그를 찍어보니.. 

 

public void onDownloadStateChanged(int newState) {} 로 다운로드 상태를 로그로 찍고 있거든요.

근데 newState 상태가 STATE_COMPLETED 즉, 다운로드 완료 상태가 되고 로그가 찍혔는데..

obb파일이 있어야 할 곳에 obb파일이 다운로드 되어 있지도 않고, 파일 경로를 찾지 못해서 에러가 납니다.

 

@Override
	public void onDownloadStateChanged(int newState) {
		// TODO Auto-generated method stub
		Log.i("AA", "in onDownloadStateChanged, newState=" + newState);
		boolean showDashboard = true;

		boolean fAppFinish = false;
		//상황에 맞게 작업들을 넣어줘야합니다.
		switch (newState) {
		case STATE_COMPLETED:// The download was finished
			Log.i("AA", "in onDownloadStateChanged, 다운로드 완");
			showDashboard = false;
			callNext();
			break;
		case STATE_IDLE:
			Log.i("AA", "in onDownloadStateChanged, STATE_IDLE");
			break;
		case STATE_FETCHING_URL:
			showDashboard = true;
			Log.i("AA", "in onDownloadStateChanged, STATE_FETCHING_URL");
			break;
		case STATE_CONNECTING:
			showDashboard = true;
			Log.i("AA", "in onDownloadStateChanged, STATE_CONNECTING");
			break;
		case STATE_DOWNLOADING:
			showDashboard = true;
			Log.i("AA", "in onDownloadStateChanged, STATE_DOWNLOADING");
			break;
		case STATE_PAUSED_NETWORK_UNAVAILABLE:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_NETWORK_UNAVAILABLE");
			break;
		case STATE_PAUSED_BY_REQUEST:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_BY_REQUEST");
			break;
		case STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION:
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_WIFI_DISABLED_NEED_CELLULAR_PERMISSION");
			break;
		case STATE_PAUSED_NEED_CELLULAR_PERMISSION:
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_NEED_CELLULAR_PERMISSION");
			break;
		case STATE_PAUSED_WIFI_DISABLED:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_WIFI_DISABLED");
			break;
		case STATE_PAUSED_NEED_WIFI:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_NEED_WIFI");
			break;
		case STATE_PAUSED_ROAMING:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_ROAMING");
			break;
		case STATE_PAUSED_NETWORK_SETUP_FAILURE:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_NETWORK_SETUP_FAILURE");
			break;
		case STATE_PAUSED_SDCARD_UNAVAILABLE:
			Log.i("AA", "in onDownloadStateChanged, STATE_PAUSED_SDCARD_UNAVAILABLE");
			break;
		case STATE_FAILED_UNLICENSED:
			//ToastS.makeText(mToast, this, "라이센스 검사에 실패 했습니다.\n앱을 종료합니다.");
			fAppFinish = true;
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_FAILED_UNLICENSED");
			break;
		case STATE_FAILED_FETCHING_URL:
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_FAILED_FETCHING_URL");
			break;
		case STATE_FAILED_SDCARD_FULL:
			//ToastS.makeText(mToast, this, "저장 공간이 부족합니다.");
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_FAILED_SDCARD_FULL");
			break;
		case STATE_FAILED_CANCELED:
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_FAILED_CANCELED");
			break;
		case STATE_FAILED:
			showDashboard = false;
			Log.i("AA", "in onDownloadStateChanged, STATE_FAILED");
			break;
		}

		if (fAppFinish) {
			finish();
		}
	}

 

로그캣에 찍히는 것을 보면,

06-18 23:23:06.286: I/AA(3844): in onDownloadStateChanged, newState=2
06-18 23:23:06.286: I/AA(3844): in onDownloadStateChanged, STATE_FETCHING_URL
06-18 23:23:06.926: I/LicenseChecker(3844): Received response.
06-18 23:23:06.926: I/LicenseChecker(3844): Clearing timeout.
06-18 23:23:06.951: I/AA(3844): in onDownloadStateChanged, newState=5
06-18 23:23:06.951: I/AA(3844): in onDownloadStateChanged, 다운로드 완
 
이렇게 찍히고 있구요.
근데 obb 폴더에는 파일이 다운로드되어 있지 않아요. ㅠㅠ
뭐가 문제인 걸까요 ㅠㅠ
수이 (540 포인트) 님이 2014년 6월 18일 질문
파일을 다운로드 하는쪽이 어떻게 구현되어있는지요?
답변 감사합니다!
다운로드 하는 쪽은.. onCreate 안에 아래와 같이 구현되어 있어요.

String mainFileName = Helpers.getExpansionAPKFileName(this, true, 1);
       
boolean fileExists = Helpers.doesFileExist(this, mainFileName, 179039558L , false);
if (!fileExists) {
    Intent launcher = getIntent();
    Intent fromNotification = new Intent(this, getClass());
    fromNotification.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    fromNotification.setAction(launcher.getAction());
           
    if (launcher.getCategories() != null) {
        for (String cat : launcher.getCategories()) {
                   
            fromNotification.addCategory(cat);
        }
    }
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, fromNotification, PendingIntent.FLAG_UPDATE_CURRENT);
    try {
        // Start the download
        int result = DownloaderClientMarshaller.startDownloadServiceIfRequired(this, pendingIntent, ExpansionFileDownloaderService.class);
               
        if (DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED != result) {
            // implement Downloading UI.
            mDownloaderClientStub = DownloaderClientMarshaller.CreateStub(this, ExpansionFileDownloaderService.class);  
            mDownloaderClientStub.connect(this);
                   
            return;
        }
    } catch (NameNotFoundException e) {
        Log.e("myLog", "NameNotFoundException occurred. " + e.getMessage(), e);
    }
}
혹시 매니페스트 문제는 아닐까요...? 혹시나 해서 묻는거에요..혹시나..그리고 파일 경로를 못찾는다는 걸 봐서..경로가 없다면 폴더 생성 코드를 먼저 넣고 다운 받아 보세요~ 그리고 하나 궁금한게...네트워크 작업은 무조건 스레드 돌려야 되는게 아닌가요?? 저 다운로드 클래스가 스레드인가요?? 확장파일은 한번도 안해봐서 궁금해서 그래요ㅜㅜ
매니페스트에 따로 설정해야 될 부분이 더 있나요? 구글링 해서 user-permission등 설정해야 할 부분 다 넣어줬고..
obb파일을 임의로 ~/Android/obb/패키지이름폴더에 넣고 테스트하면 파일 경로는 잘 찾거든요. 근데 obb파일이 없는 경우, 다운로드를 못하고 있는 것 같아요. 그리고 저 다운로드 함수는 onCreate 안에 들어있구요. 구글 라이브러리라서 참고 문서 참고해서 넣었어요~
저도 안드로이드 개발은 처음이라 여기저기서 블로그 포스팅 된 글이나 구글링해서 본 글들로 똑같이 했는데 안되서 너무 답답하네요 ㅠㅠㅠㅠ
~/Android/obb/패키지이름폴더 말고 다른 경로에 넣어도 그래요?
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) 이런데다가 받아도 같은 문제인가요?
답변 감사합니다!^^
파일이 다 받아지기 전에  cocos 가 실행되면서 리소스를 찾아 생기는 문제였던 것 같아요.
다시 한번 답변 감사합니다^^

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...