2013-02-14 13 views
8

Szukam bardzo podstawowej funkcji. Próbuję zaprojektować aplikację i wszystko, co chcę, to załadować obraz z adresu URL. Znalazłem kilka pytań i stron internetowych, ale wszystkie wydają się starsze i przestarzałe, ale myślę, że mam problemy z łączeniem kodu z działaniem main.xml dla ImageView.Obrazek aplikacji Android z adresu URL

Wszelkie sugestie lub linki, które masz bardzo doceniam, dziękuję.

Odpowiedz

11

Tutaj, to jak mogę wyświetlić obraz z URL w widoku obrazu
trzeba nazwać ten kod z wątku innego niż wątek główny

ImageView img = (ImageView) findViewById(R.id.imageView1); 
try { 
     URL url = new URL("Your URL"); 
     //try this url = "http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg" 
     HttpGet httpRequest = null; 

     httpRequest = new HttpGet(url.toURI()); 

     HttpClient httpclient = new DefaultHttpClient(); 
     HttpResponse response = (HttpResponse) httpclient 
       .execute(httpRequest); 

     HttpEntity entity = response.getEntity(); 
     BufferedHttpEntity b_entity = new BufferedHttpEntity(entity); 
     InputStream input = b_entity.getContent(); 

     Bitmap bitmap = BitmapFactory.decodeStream(input); 

     img.setImageBitmap(bitmap); 

    } catch (Exception ex) { 

    } 

należy uważać, nie zapomnij, aby otoczyć Kod z try catch (mam już zrobione, że w tym kodzie)

lub użyć webview załadować obraz z url

WebView web = (WebView) findViewById(R.id.webView1); 
web.loadUrl("Your Url"); 

jeśli próbujesz załadować obraz z url folderu aktywów rozpocznie się ten „file: ///android_asset/yourimage.jpg”
inny normalny url www jak ten „http://0.tqn.com/d/webclipart/1/0/5/l/4/floral-icon-5.jpg

nadzieję, że ten działa dla ciebie Powodzenia

+1

Próbuję edytować twój wpis, ale myślę, że jakoś odpowiedź nie jest jeszcze zaktualizowana. Czy możesz dodać uwagę dodatkową w odpowiedzi pogrubioną czcionką, która mówi, że musisz wywołać ten kod z wątku innego niż główny wątek. – VendettaDroid

+0

Ale nie nazwałem tego z wątku i działa dla mnie dobrze. Czy możesz to wyjaśnić. Dziękuję. –

+1

Android ma teraz ścisłą politykę dotyczącą komunikacji sieciowej. Powinieneś spróbować tego kodu ponownie. Zapisany kod może zająć dowolną ilość czasu, aby uzyskać obraz ze zdalnego adresu URL, w zależności od szybkości sieci i rozmiaru obrazu. Jeśli wywołujesz ten kod z interfejsu użytkownika, istnieje szansa, że ​​twój wątek UI zostanie zablokowany i da ci ANR. Wypróbuj ten kod w ICS, jeśli możesz. Prawdopodobnie powinien dać wyjątek "NetWorkOnMainThread". lub możesz po prostu wyszukać w Google tego wyjątku. – VendettaDroid

0

Możesz wziąć obraz i na swojej stronie php przekształcić go w base64, a następnie na stronie Android dekodować go w obrazie.

0

Najlepszą praktykę pobierania obrazu należy wykonać na wątku tła, tak aby nie zakłócał głównego wątku, a następnie w razie potrzeby zaktualizować interfejs użytkownika.

public class główną działalność rozciąga AppCompatActivity {

FrameLayout frameLayout; 
ImageView imageView; 
ProgressBar progressBar; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    frameLayout= (FrameLayout) findViewById(R.id.containerlayout); 
    imageView= (ImageView) findViewById(R.id.imageView); 
    progressBar= (ProgressBar) findViewById(R.id.progressBar); 

    String url="http://www.flat-e.com/flate5/wp-content/uploads/cover-960x857.jpg"; 
    MyTask myTask= new MyTask(); 
    myTask.execute(url); 
} 
class MyTask extends AsyncTask<String, Void, Bitmap> { 

    @Override 
    protected void onPreExecute() { 
     progressBar.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected Bitmap doInBackground(String... voids) { 

     Bitmap bitmap=null; 
     try { 
      URL url =new URL(voids[0]); 
      HttpURLConnection connection= (HttpURLConnection) url.openConnection(); 
      InputStream inputStream= connection.getInputStream(); 
      bitmap = BitmapFactory.decodeStream(inputStream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return bitmap; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     progressBar.setVisibility(View.GONE); 
     imageView.setImageBitmap(bitmap); 

    } 
} 

}

tu, w tym przykładzie utworzony wewnętrzny klasy MyTask która rozciąga się AsyncTask gdzie zrobiłem wszystkie swoje operacje sieciowe. Upewnij się, że dodasz uprawnienia do wykorzystania w pliku manifestu.

Mam nadzieję, że to działa również dla Ciebie.

Powiązane problemy