我在服务器上有多个图像。我想要做的是我想从服务器检索这些图像并将其设置在imageView上。
我一直在从服务器获取blob类型的图像,将其解码为字节数组,然后将其转换为位图图像。
我对如何从服务器获取位图图片感到困惑。
我已经经历了很多关于SO的问题
Retriving image from server to android app
Load Large Image from server on Android
任何人都可以通过链接或代码提供帮助。
感谢您的宝贵时间。
我正在尝试的事情,这里是代码:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bitmap bitmap = DownloadImage("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(bitmap);
}
private InputStream OpenHttpConnection(String urlString)
throws IOException
{
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");
try{
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
}
catch (Exception ex)
{
throw new IOException("Error connecting");
}
return in;
}
private Bitmap DownloadImage(String URL)
{
Bitmap bitmap = null;
InputStream in = null;
try {
in = OpenHttpConnection(URL);
BufferedInputStream bis = new BufferedInputStream(in, 8190);
ByteArrayBuffer baf = new ByteArrayBuffer(50);
System.out.println("BAF= "+baf);
int current = 0;
while ((current = bis.read()) != -1)
{
baf.append((byte)current);
}
byte[] imageData = baf.toByteArray();
System.out.println("imageData= "+imageData);
bitmap =BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
in.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
return bitmap;
}
}
这将返回图像,但我使用的网址包含图像名称。如果我有更多图像并且我想在我的应用程序加载时检索所有图像,那该怎么办呢?
答案 0 :(得分:5)
我建议你使用另一种方式,就像魅力:Android查询。
您可以从此处下载该jar文件:http://code.google.com/p/android-query/downloads/list
AQuery androidAQuery=new AQuery(this);
举个例子:
androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);
使用上面的代码,您可以直接通过网址显示您的图片。现在下面的代码是从url:
直接获取BitmapandroidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){
@Override
public void callback(String url, Bitmap object, AjaxStatus status) {
super.callback(url, object, status);
//You will get Bitmap from object.
}
});
此库由Android本身提供,因此请使用它并查看您想要的结果。
它非常快速和准确,使用它你可以在加载时找到更多功能,如动画;如果需要,获取位图;等
答案 1 :(得分:3)
我建议您使用 Volley 库(演示文稿为here),这是Google在其应用Google Play中使用的相同库。在Google I / O 13上,Ficus Kilkpatrick介绍了Volley。 Volley是一个HTTP库,旨在删除大量样板代码,简化列表中图像的处理,更快,抽象出一个或另一个HTTP客户端的复杂性。
<强>初始化强>
Volley依赖于处理请求队列的RequestQueue,以及负责加载图像的ImageLoader。我们需要其中一个
public static ImageLoader mImageLoader;
public static RequestQueue mRequestQueue;
我们还需要初始化它们。队列需要一个Context,ImageLoader需要一个ImageCache。在这里,我使用LruCache的基本包装器。
mRequestQueue = Volley.newRequestQueue(this);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLru(64000));
初始化在第一个活动的onCreate()中完成。
获取图片
假设您必须使用从服务器下载的图像填充gridview。 ImageUrlAdapter使用NetworkImageView填充GridView(或任何AdapterView)。这是Volley提供的一个类,用于将图像从网络放入ImageView。它实际上扩展了ImageView,这意味着您可以在任何使用ImageView的地方使用它。它使用起来非常简单。适配器中唯一的代码是getView。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
NetworkImageView imageView;
if (convertView == null) {
imageView = new NetworkImageView(getContext());
} else {
imageView = (NetworkImageView) convertView;
}
String url = getItem(position);
imageView.setImageUrl(url, MainActivity.mImageLoader);
return imageView;
}
这里唯一新的东西是imageView.setImageUrl(url,MainActivity.mImageLoader);
就是这样。不需要更多。
答案 2 :(得分:2)
因为你的困惑我会解释
点击here下载jar文件并将其粘贴到libs
文件夹
在你的清单中添加这两行权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
使用此代码
ImageLoader imageLoader = ImageLoader.getInstance();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.createDefault(getApplicationContext())
imageLoader.init(config);
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_launcher)
.cacheInMemory()
.cacheOnDisc()
.build();
imageLoader.displayImage("http://www.allindiaflorist.com/imgs/arrangemen4.jpg",your_IMAGEVIEW,options,null);
或者,如果您只想要位图,请使用此
Bitmap bmp = imageLoader.loadImageSync("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");
答案 3 :(得分:1)
我强烈建议使用Square的Picasso库。它很容易使用并消除了检索缓存的所有痛苦。
答案 4 :(得分:0)
我建议使用Prime库,它可以异步下载图像,然后使用具有url和位图图像作为参数的侦听器进行回调。