2012-07-13 9 views
0

나는 튜토리얼을 사용했고 에뮬레이터에서 작동하는이 결과에 도달했지만 실제 안드로이드 장치에서는 작동하지 않습니다.안드로이드에서 http 요청을 사용하여 안드로이드에 다운로드 이미지

코드는 여기에 표시되며 필요한 모든 Android 권한이 설정됩니다. 인터넷 및 외부 장치에 쓰기가 설정됩니다. 먼저 3.0 이전에 ANR 및 3.0에 NetworkOnMainThreadException 발생합니다 메인 UI 스레드에서 모든 일을 네트워크 운영의

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 
import org.apache.http.util.ByteArrayBuffer; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class main extends Activity { 

    private final String PATH = "/mnt/sdcard/Pictures/"; 
    TextView tv; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView)findViewById(R.id.textView1); 
     DownloadFromUrl(PATH + "dwnldimg.png"); 
     ImageView iv = (ImageView) findViewById(R.id.imageView1); 
     Bitmap bmp = BitmapFactory.decodeFile(PATH + "dwnldimg.png"); 
     iv.setImageBitmap(bmp); 
    } 
    public void DownloadFromUrl(String fileName) { 
      try { 
        URL url = new URL("http://192.168.1.4/evilempire.jpg"); //you can write here any link 
        File file = new File(fileName); 
        long startTime = System.currentTimeMillis(); 
        tv.setText("Starting download......from " + url); 
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();; 
        conn.setDoInput(true); 
        conn.connect(); 
        InputStream is = conn.getInputStream(); 
        BufferedInputStream bis = new BufferedInputStream(is); 
        /* 
        * Read bytes to the Buffer until there is nothing more to read(-1). 
        */ 
        ByteArrayBuffer baf = new ByteArrayBuffer(50); 
        int current = 0; 
        while ((current = bis.read()) != -1) { 
          baf.append((byte) current); 
        } 

        FileOutputStream fos = new FileOutputStream(file); 
        fos.write(baf.toByteArray()); 
        fos.close(); 
        tv.setText("Download Completed in" + ((System.currentTimeMillis() - startTime)/1000) + " sec"); 
      } catch (IOException e) { 
       tv.setText("Error: " + e); 
      } 
    } 

} 

답변

0

. 둘째로 Prime을 구축했는데 원격 이미지를로드하는 것이 훨씬 쉽습니다.

1

프라임 리브가 도움이되지만 안드로이드를 배우려면 AsyncTask를 알아야합니다. 안드로이드는 액티비티가 실행되는 UI 쓰레드를 가지므로 안드로이드 OS를 차단하는 작업을 복잡하게 만들면 강제 종료가 발생합니다. 그래서 다운로드 스레드 나 UI 스레드를 결국 차단하는 작업을 수행해야하는 경우 스레드를 사용해야 할 수 있다는 점을 알아야합니다. 쉬운 안드로이드 방식은 AsyncTask입니다. 이 간단한 예제가 AsyncTask를 이해하도록 안내 할 것이라고 생각합니다. http://developer.android.com/reference/android/os/AsyncTask.html

관련 문제