android_sdcard读写(三)
这次来个稍微复杂点的。
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读写(三)的更多相关文章
- zedboard如何从PL端控制DDR读写(三)——AXI-FULL总线调试
之前的项目和培训中,都只用到了AXI-Lite或者AXI-Stream,对于AXI-FULL知之甚少,主要是每次一看到那么多接口信号就望而却步了. 现在为了调试DDR,痛下决心要把AXI-FULL弄懂 ...
- Qt读写三种文件,QSettings读ini配置文件,QJsonDocument读JSON文件,QDomDocument读xml文件
第一种INI配置文件 .ini 文件是Initialization File的缩写,即初始化文件. 除了windows现在很多其他操作系统下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户 ...
- golang文件读写三种方式——bufio,ioutil和os.create
package main import ( "bufio" "fmt" "io/ioutil" "os" ) func ...
- android_sdcard读写(二)
接着上篇,继续研究sdcard的神秘之处.上篇代码不变,本篇新增代码都在下面~~~ 继续上代码~~ // 写文件 File path = new File("/mnt/sdcard/sxp/ ...
- android_sdcard读写(一)
现在的android手机其实就是一个小小的掌上电脑,平时电脑有的硬件它估计也有了.这次本人研究下了其中充当手机硬盘的角色,就是sdcard.这是一个保存应用程序的好地方. 老规矩,上代码,学习代码才是 ...
- Delphi COM编程技术三类型库(库文件中的工具栏,很全)
在COM组件的使用和开发过程中经常需要获取有关组件的信息.而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取.通过访问类型库就可以查看COM组件的信息. 一.类型库的基础 ...
- RT-Thread下的串口驱动程序分析【转载】
编写本文稿的目的,在于通过分析stm32平台上的串口中断源码,学习 RTT中如何编写中断处理程序 如何编写RTT设备驱动接口代码 了解串行设备的常见处理机制 先以RTT官方源码中的STM32 BSP包 ...
- 降低磁盘IO使Oracle性能优化(转)
文章转自:http://blog.chinaunix.net/uid-26813519-id-3207996.html 硬件方面虽然只占Oracle性能优化的一个方面(另一方面是软件),但是仍不可忽视 ...
- [Delphi]Delphi开发的一些技巧
一.提高查询效率先进行准备查询操作: CustomerQuery.Close; if not (CustomerQuery.Prepared) then -->查询是否已准备好 Customer ...
随机推荐
- Win8 Metro(C#)数字图像处理--2.54迭代法图像二值化
原文:Win8 Metro(C#)数字图像处理--2.54迭代法图像二值化 [函数名称] 迭代法图像二值化 int IterativeThSegment(WriteableBitm ...
- WebAPI增加Area以支持无限层级同名Controller
原文:WebAPI增加Area以支持无限层级同名Controller 微软的WebAPI默认实现逻辑 默认实现中不支持同名Controller,否则在访问时会报HttpError,在网上找到了各种路由 ...
- 设置代理调用WMTS服务
一.数据准备 1.链接:http://pan.baidu.com/s/1sjzCytR 密码:uugc,下载DotNet版本 2. 发布切片服务,打开ogc服务可产看到相应的符合ogc标准的服务,如下 ...
- Sql 2017 安装到sql_shared_mrconfigaction-install-confignonrc-cpu64卡住不动问题
解决方法:取消功能选择的实例功能和共享功能中的"机器学习服务(数据库内)""机器学习服务器(独立)"
- Solr Principal - 工作原理/机制
From http://lucene.apache.org/solr/guide/7_1/overview-of-documents-fields-and-schema-design.html The ...
- 高效的DDoS攻击探测与分析工具 – FastNetMon
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面
一.应用程序中文化 1).Qt安装目录下有一个目录translations/,在此目录下有qt_zh_CN.ts和 qt_zh_CN.qm把它们拷贝到你的工程目录下. 2).在main函数加入下列代码 ...
- Qt在Windows下如何创建无CMD窗口控制台程序
默认情况下,用Qt新建一个控制台程序,运行时会弹出CMD窗口.如何把窗口去掉呢? *.pro文件默认是这样的: TEMPLATE = app CONFIG += console CONFIG -= a ...
- jquery-ui sortable 使用实例
jquery-ui sortable 使用实例 最近公司需要做任务看板,需要拖拽效果.点击查看效果.由于网站是基于vue的技术栈,最开始找了一个现成的vue封装的拖拽组件:Vue.Draggable, ...
- RocketMQ(6)---发送普通消息(三种方式)
发送普通消息(三种方式) RocketMQ 发送普通消息有三种实现方式:可靠同步发送.可靠异步发送.单向(Oneway)发送. 注意 :顺序消息只支持可靠同步发送. GitHub地址: https:/ ...