Overview
今天复习了一下Android 如何将我们数据库中图片获取出来,并且将其转换为bitmap进行显示。
开发环境以及技术
使用Visual Studio 2019
Android Studio 3.5
API 使用 ASP .NET WEB API 开发
数据库操作只用Entity Framework
使用本地数据库作为数据源
如果你是一个需要开发软件和API的程序员,那么你可以看一下,如果你不是可以选择跳过 $\color{#6995C2}{API开发}$。
API 开发
这里我为了开发的方便,所以所使用的API比较简陋。但是按照国际惯例我们先来看一下API方面的源代码。
我个人比较喜欢json所以我们将所有的端口转换为JSON。代码如下:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); } }
我们需要在我们的WebApiCinfig的类中添加一句代码这样我们就将所有的端口返回数据变成了JSON格式的数据了。
然后我们看一下如何返回我们的图片数据:
// GET: api/Pictures public object GetPictures() { var showData = db.Pictures.ToList(); List<Tuple<int,string>> list = new List<Tuple<int, string>>(); foreach (var item in showData) { list.Add(new Tuple<int, string>(item.Id,Convert.ToBase64String(item.Img))); } return list; }
这里我们使用了Base64的方法,先是将我们的字节数组转换为字符串并将其添加到元组中。并且进行返回。
这样我们的API基础部分就完成了。
Android 如何操作图片
首先我们显示获取我们的网络资源。
想来看一下代码:
/** * ClassName- @MainActivity-@初始换主页面底部的图片 **/ private void initPictureData() { new Thread(new Runnable() { @Override public void run() { //通过http网络访问,获取到我们的网络数据。将Http的GET方法进行了封装 String httpData = Global.httpGet("Pictures", ""); //将JSON进行解析并且添加到List中 List<pictureEntity> list = pictureData_JsonHelper.getJsonData(httpData); Log.d("main_pictureData", String.valueOf(list.size())); final List<Bitmap> bitmapsList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { //在循环将String转换为图片。这里将我们的转换方法进行了封装 bitmapsList.add(Global.stringToBitmap(list.get(i).getPicString())); } Log.d("BitmapsData", String.valueOf(bitmapsList.size())); //下面是ViewPager 控件的操作。 final List<View> viewsList = new ArrayList<>(); for (int i = 0; i < bitmapsList.size(); i++) { View view = View.inflate(MainActivity.this, R.layout.viewpage_item, null); ImageView imageView = view.findViewById(R.id.itemImageView); imageView.setImageBitmap(bitmapsList.get(i)); viewsList.add(view); } runOnUiThread(new Runnable() { @Override public void run() { ViewPager viewPager = findViewById(R.id.viewPager); viewPager.setAdapter(new viewPager_Adapter(viewsList)); } }); } }).start(); }
这样我们的全部操作就完成了。接着我们看一下我们这里使用到自己封装的方法了。
Http 的方法这里就不看了。我相信大家都会。
public static Bitmap stringToBitmap(String pictureString) { //使用Base64将String 转换为 Bitmap 类型 byte[] bytes = Base64.decode(pictureString, Base64.NO_WRAP); //使用BitmapFactory将字节数组转换为Bitmap //这边我们需要对数据库返回的base64的数稍稍的做一下处理。否则可能无法正常显示图像。 for (int i = 0; i < bytes.length; ++i) { if (bytes[i] < 0) { bytes[i] += 256; } } //生成图片并且返回。 return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); }
这样我们的全部过程就已经完成了。
补充知识:android 获取网络数据(超简单,直接调用)
我就废话不多说了,还是直接上代码吧!
String getNetData(String connectURL){ String result = ""; //用来取得返回的String; //发送post请求 HttpPost httpRequest = new HttpPost(connectURL); //Post运作传送变数必须用NameValuePair[]阵列储存 try { //发出HTTP请求 Log.d("请求连接", "在发送请求"); List params = new ArrayList(); params.add(new BasicNameValuePair("start", "123321"));//post请求(必须有,数据自定义) //params.add(new BasicNameValuePair("end", end+""));//可添加多个Post请求码,php中按键值对获取 httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); //取得HTTP response HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest); //若状态码为200则请求成功,取到返回数据 Log.d("连接值", String.valueOf(httpResponse.getStatusLine().getStatusCode())); if (httpResponse.getStatusLine().getStatusCode() == 200) { //取出字符串 Log.d("请求连接", "连接成功"); result = new String(EntityUtils.toString(httpResponse.getEntity(),"utf8")); } } catch (Exception e) { mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getContext(), "网络出错",Toast.LENGTH_SHORT).show(); } }); e.printStackTrace(); } return result; } //接下来就是解析获取到的json数据了,json数据的解析就需要根据需求自定义了
以上这篇Android 通过API获取数据库中的图片文件方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持自学编程网。
- 本文固定链接: https://www.zxbcw.cn/post/183198/
- 转载请注明:必须在正文中标注并保留原文链接
- QQ群: PHP高手阵营官方总群(344148542)
- QQ群: Yii2.0开发(304864863)