2013-01-14 7 views
2

URL에서 파일을 다운로드하려고 할 때 android 4.0 이상에서 문제가 발생합니다. android Galaxy Y 2.3/2.2에서는 잘 작동하지만 사용하면 Galaxy S3 (4.1.2)와 동일한 코드가 다운로드가 시작되지만 끝나지 않습니다.android 4.0/4.1.2에서 다운로드 할 때

코드 :

public void update() { 
    Log.d(TAG, "Método para fazer a atualização iniciado."); 
    try { 
     Log.d(TAG, "Conectando com a internet..."); 
     URL url = new URL(
       url); 
     HttpURLConnection c = (HttpURLConnection) url.openConnection(); 
     c.setRequestMethod("GET"); 
     c.setDoOutput(true); 
     c.connect(); 

     Log.d(TAG, "Iniciando arquivo..."); 
     String PATH = Environment.getExternalStorageDirectory() 
       + "/test/Update/"; 
     File file = new File(PATH); 
     file.mkdirs(); 
     File outputFile = new File(file, "test.apk"); 
     FileOutputStream fos = new FileOutputStream(outputFile); 

     Log.d(TAG, "Iniciando Stream..."); 
     InputStream is = c.getInputStream(); 

     Log.d(TAG, "Iniciando o download..."); 
     byte[] buffer = new byte[1024]; 
     int len1 = 0; 
     while ((len1 = is.read(buffer)) != -1) { 
      fos.write(buffer, 0, len1); 
     } 
     fos.close(); 
     is.close(); 

     Log.d(TAG, "Iniciando instalador..."); 
     final Intent promptInstall = new Intent(Intent.ACTION_VIEW); 
     promptInstall.setDataAndType(Uri.fromFile(new File(PATH + "test.apk")),"application/vnd.android.package-archive"); 
     promptInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(promptInstall); 
     Log.d(TAG, "Instalador iniciado com sucesso!"); 
    } catch (MalformedURLException e) { 
     Log.e(TAG, "Malformed URL. Mensagem: " + e.getMessage() 
       + " Causa: " + e.getCause()); 
    } catch (IOException e) { 
     Log.e(TAG, "IOException. Mensagem: " + e.getMessage() + " Causa: " 
       + e.getCause()); 
    } catch (Exception e) { 
     Log.e(TAG, "Exception. Mensagem: " + e.getMessage() + " Causa: " 
       + e.getCause()); 
    } 
} 

것을 제외 : 오류가 없다, 그냥 다운로드를 시작하고 중지합니다. 파일 크기 : 126,188 바이트 및 갤럭시 S3 6,403 바이트

+4

AsyncTask를 사용하십시오. –

+0

문서에서; _HttpURLConnection은 기본적으로 GET 메서드를 사용합니다. setDoOutput (true)가 호출되면 POST가 사용됩니다 ._ 아무것도 게시하지 않으므로''c.setDoOutput (true)''줄을 제거하고 스트림을 닫을 때 문제가 해결되었는지 확인할 수 있습니다. – harism

답변

2

AsyncTask을 사용하여 요청하십시오.

AsyncTask를 사용하면 UI 스레드를 적절하고 쉽게 사용할 수 있습니다. 이 클래스는 백그라운드 작업을 수행하고 스레드 및/또는 핸들러를 조작하지 않고도 UI 스레드에서 결과를 게시 할 수있게합니다.

1

주 스레드에서 네트워크 작업을하고있는 경우 StrictMode가 허용하지 않습니다.