这次来个稍微复杂点的。

package cn.com.sxp;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.StatFs;

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class AccessSDActivity extends Activity {
private final static String TAG = AccessSDActivity.class.getSimpleName();
private TextView tv = null;
private ImageView iv = null;
private Button btn = null;
private ProgressDialog pd = null;

private Bitmap bitmap = null;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
//
Log.d("sxp", "挖槽~~~屁的sd卡啊");
AccessSDActivity.this.finish();
}


// 下面开始将从网络上下载下来的图片放在sdcard上
iv = (ImageView)this.findViewById(R.id.iv);
btn = (Button)this.findViewById(R.id.btn);

String filePath = "http://localhost:8080/test.jpg";
String fileName = "handsome.jpg";



try {
// 以字节数组的形式存着图片
byte[] data = getPictureByBytes(filePath);
if(data!=null){
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
iv.setImageBitmap(bitmap);
}else{
Toast.makeText(this,"下载失败啦妈的!", 1).show();
}

// 这事以一段流的形式存储图片
bitmap = BitmapFactory.decodeStream(getPictureByStream(filePath));
if (bitmap != null) {
iv.setImageBitmap(bitmap);
}
} catch (Exception e) {
Toast.makeText(AccessSDActivity.this,"出什么问题了!", 1).show();
e.printStackTrace();
}

// 下载图片
btn.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
pd = ProgressDialog.show(AccessSDActivity.this, "保存着呢", "没看到正在保存吗", true);
new Thread(pictureSave).start();
}
});
}

public byte[] getPictureByBytes(String path) throws Exception{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
InputStream inStream = conn.getInputStream();
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len=inStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
outStream.close();
inStream.close();
return outStream.toByteArray();
}
return null;
}

public InputStream getPictureByStream(String path) throws Exception{
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
return conn.getInputStream();
}
return null;
}

private Runnable pictureSave = new Runnable(){
@Override
public void run() {
try {
File dir = new File("/mnt/sdcard/sxp/android/test");
if(!dir.exists()){
dir.mkdir();
}
File me = new File("/mnt/sdcard/sxp/android/test/test.jpg");
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(me));
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
bos.flush();
bos.close();
String message = "图片保存成功!";
} catch (IOException e) {
String message = "图片保存失败!";
e.printStackTrace();
}
messageHandler.sendMessage(messageHandler.obtainMessage());
}
};

private Handler messageHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
pd.dismiss();
Toast.makeText(AccessSDActivity.this, "主线程收到", Toast.LENGTH_SHORT).show();
}
};
}

意思很简单,就是从本机tomcat服务器上下载一个图片,然后显示。测试后发现,手机模拟器似乎无法访问本地的tomcat服务器,他妈的。不过也有招数,将代码的localhost改为10.0.2.2就可以了。这个地址是android特设的。

不过这段代码还是有很多地方需要学习的,还算是比较经典的。

1. 用字节数组储存一个图片。图片多大,数组分配的字节数就有多大,不能比图片的字节数小;

2. 如何将一堆字节转化为图片呢?好问题,BitmapFactory.decodeByteArray方法就可以做到,牛逼;

3. 也可以不要字节储存图片,直接通过流来储存图片,再解流。BitmapFactory.decodeStream方法即可。不过两者哪个好,不能判断,得看商用时看重什么性能。这两个方法还是要研究下。

4. 线程的使用。改代码中使用了线程,按下一个按钮后,响应事件是给一个线程去处理,同时线程完成任务后,使用消息处理句柄给主线程发送消息,这事很需要值得学习的一个技术,我得深入学习。不过,消除对话框为何在主线程中进行,我觉得奇怪。对话框是在子线程中分配的,不应该由子线程消掉吗?得测试下。

5. 另一个值得研究的是一票NET类的使用,包括url表示类,连接类,在连接上的流类,值得研究。

android_sdcard读写(三)的更多相关文章

  1. zedboard如何从PL端控制DDR读写(三)——AXI-FULL总线调试

    之前的项目和培训中,都只用到了AXI-Lite或者AXI-Stream,对于AXI-FULL知之甚少,主要是每次一看到那么多接口信号就望而却步了. 现在为了调试DDR,痛下决心要把AXI-FULL弄懂 ...

  2. Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件

    第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户 ...

  3. golang文件读写三种方式——bufio,ioutil和os.create

    package main import ( "bufio" "fmt" "io/ioutil" "os" ) func ...

  4. android_sdcard读写(二)

    接着上篇,继续研究sdcard的神秘之处.上篇代码不变,本篇新增代码都在下面~~~ 继续上代码~~ // 写文件 File path = new File("/mnt/sdcard/sxp/ ...

  5. android_sdcard读写(一)

    现在的android手机其实就是一个小小的掌上电脑,平时电脑有的硬件它估计也有了.这次本人研究下了其中充当手机硬盘的角色,就是sdcard.这是一个保存应用程序的好地方. 老规矩,上代码,学习代码才是 ...

  6. Delphi COM编程技术三类型库(库文件中的工具栏,很全)

    在COM组件的使用和开发过程中经常需要获取有关组件的信息.而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取.通过访问类型库就可以查看COM组件的信息. 一.类型库的基础 ...

  7. RT-Thread下的串口驱动程序分析【转载】

    编写本文稿的目的,在于通过分析stm32平台上的串口中断源码,学习 RTT中如何编写中断处理程序 如何编写RTT设备驱动接口代码 了解串行设备的常见处理机制 先以RTT官方源码中的STM32 BSP包 ...

  8. 降低磁盘IO使Oracle性能优化(转)

    文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...

  9. [Delphi]Delphi开发的一些技巧

    一.提高查询效率先进行准备查询操作: CustomerQuery.Close; if not (CustomerQuery.Prepared) then -->查询是否已准备好 Customer ...

随机推荐

  1. 零元学Expression Blend 4 - Chapter 23 Deep Zoom Composer与Deep Zoom功能

    原文:零元学Expression Blend 4 - Chapter 23 Deep Zoom Composer与Deep Zoom功能 最近有机会在工作上用到Deep Zoom这个功能,我就顺便介绍 ...

  2. Windows Phone SplashScreen初始屏幕示例

    protected override void OnLaunched(LaunchActivatedEventArgs args) { if (args.PreviousExecutionState ...

  3. 用JavaScriptSerializer解析JSON

    引用System.Web.Extensions using System.Web.Script.Serialization; var serializer = new JavaScriptSerial ...

  4. 龙芯GO!龙芯平台上构建Go语言环境指南

    龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Gries ...

  5. 毕设(二)C#SerialPort

    毕业设计中,用到串口与无人机通信,所以就用到了SerialPort这个类,这个类在设置属性时, 用到最主要的属性应该是COM口和波特率,由于本人不熟悉硬件,不便多说,但经验告诉我是这样的, 还有数据位 ...

  6. 用vs2010编译好的ICU库

    1.ICU库的官网网址为http://site.icu-project.org/ 2.ICU(International Components for Unicode)是一个国际化的字符编码和转化的库 ...

  7. libevent for qt的讨论

    一直对Qt官方的QtNetwork模块抱有遗憾,Qt自带的网络模块用的是select模型,无法支持高并发的服务器开发.最近在网上看到有个libevent for qt的东西,它直接替换了Qt的sele ...

  8. [java代码库]-简易计算器(第一种)

    简易计算器(效果如图所示) 第一种方案:采用Javascript+html完成计算器,支持+-*/,结果显示不允许使用input输入域(可以考虑使用<span>) <html> ...

  9. localstorage实现带过期时间的缓存功能

    前言 一般可以使用cookie,localstorage,sessionStorage来实现浏览器端的数据缓存,减少对服务器的请求. 1.cookie数据存放在本地硬盘中,只要在过期时间之前,都是有效 ...

  10. 区块狗开发可以做出APP吗

    区块狗系统开发林生▉l8l加4896微9698电同步▉,区块狗奖励系统开发,区块狗平台系统开发,区块狗系统开发软件,区块狗系统开发案例,区块狗源码系统开发. 本公司是软件开发公司,华登区块狗/十二生肖 ...