【Android】网络下载图片&SD卡文件存储
(本博客的作用:可以使用源码在虚拟机里面的SD卡上添加图片(找到URL即可),可以用来操作SD卡上的文件)
以下是一个从网络下载图片的函数,放入URL即可:
1 public Bitmap returnBitMap(String url) { 2 URL myFileUrl = null; 3 Bitmap bitmap = null; 4 try { 5 myFileUrl = new URL(url); 6 } catch (MalformedURLException e) { 7 e.printStackTrace(); 8 } 9 try { 10 HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); 11 conn.setDoInput(true); 12 conn.connect(); 13 InputStream is = conn.getInputStream(); 14 bitmap = BitmapFactory.decodeStream(is); 15 is.close(); 16 } catch (IOException e) { 17 e.printStackTrace(); 18 } 19 if(bitmap == null){ 20 Log.d("RRRyy", "Null"); 21 } 22 23 return bitmap; 24 }
比如传入:"http://pica.nipic.com/2008-04-01/200841194113617_2.jpg",返回的是bitmap
下面是一个传入bitmap和文件名(文件名要有扩展名),将图片存入SD卡的类:
1 import java.io.File; 2 import java.io.FileNotFoundException; 3 import java.io.FileOutputStream; 4 import java.io.IOException; 5 6 import android.graphics.Bitmap; 7 import android.os.Environment; 8 import android.util.Log; 9 10 /** 11 * 保存图片的类 12 * 13 * @author Administrator 14 * 15 */ 16 public class PicSave { 17 18 private final static String CACHE = "/Caochen";//存储的文件夹 19 20 /** 21 * 保存图片的方法 22 * 保存到sdcard 23 * @throws IOException 24 */ 25 public void savePic(Bitmap b, String strFileName) {30 String filePath = isExistsFilePath(); 31 FileOutputStream fos = null;//流 32 File file = new File(filePath, strFileName); 33 if (file.exists()) {//如果存在,未处理 34 } else { 35 try { 36 fos = new FileOutputStream(file); 37 if (null != fos) { 38 b.compress(Bitmap.CompressFormat.JPEG, 90, fos);//格式 39 fos.flush(); 40 fos.close(); 41 Log.d("YYHU", "ok"); 42 } 43 } catch (FileNotFoundException e) { 44 e.printStackTrace(); 45 } catch (IOException e) { 46 e.printStackTrace(); 47 } 48 } 49 } 50 51 /** 52 * 获取sd卡的缓存路径, 53 * 一般在卡中sdCard就是这个目录 54 * 55 * @return SDPath 56 */ 57 public static String getSDPath() { 58 File sdDir = null; 59 boolean sdCardExist = Environment.getExternalStorageState().equals( 60 android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在 61 if (sdCardExist) { 62 sdDir = Environment.getExternalStorageDirectory();// 获取根目录 63 } else { 64 Log.e("ERROR", "没有内存卡"); 65 } 66 return sdDir.toString(); 68 } 69 70 /** 71 * 获取缓存文件夹目录 如果不存在创建 否则则创建文件夹 72 * 73 * @return filePath 74 */ 75 private String isExistsFilePath() { 76 String filePath = getSDPath()+CACHE; 77 File file = new File(filePath); 78 if (!file.exists()) { 79 file.mkdirs();//建立文件夹 80 } 81 return filePath; 82 } 84 }
记住,为了正确运行上面两个类,一定要添加下面的权限:
1 <!-- 在SDCard中创建与删除文件权限 --> 2 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 3 <!-- 往SDCard写入数据权限 --> 4 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 5 <uses-permission android:name="android.permission.INTERNET"/>
为了更加清楚的知道SD卡文件夹的操作,我在源代码中加入如下输出:
1 /** 2 * 获取sd卡的缓存路径, 3 * 一般在卡中sdCard就是这个目录 4 * 5 * @return SDPath 6 */ 7 public static String getSDPath() { 8 File sdDir = null; 9 boolean sdCardExist = Environment.getExternalStorageState().equals( 10 android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在 11 if (sdCardExist) { 12 sdDir = Environment.getExternalStorageDirectory();// 获取根目录 13 } else { 14 Log.e("ERROR", "没有内存卡"); 15 } 16 Log.d("a", sdDir.getAbsolutePath());// /mnt/sdcard 17 Log.d("b", sdDir.toString());// /mnt/sdcard 18 Log.d("c", sdDir.getPath());// /mnt/sdcard 19 Log.d("d", sdDir.getParent());// /mnt 20 Log.d("e", sdDir.getName());// sdcard22 Log.d("g", sdDir.toURI() + "");// file:/mnt/sdcard 23 return sdDir.toString(); 24 25 }
输出如注释所示!
下面为了更好的理解,贴出在SD卡中寻找所有图片的代码:输入为根目录,比如:/mnt/sdcard
1 import java.io.File; 2 import java.util.ArrayList; 3 4 import android.util.Log; 5 6 public class PicDir { 7 8 public void getFileDir(String opath){ 9 File f = new File(opath); 10 File[] files = f.listFiles(); 11 if (files != null) { 12 int count = files.length; 13 for (int i = 0; i < count; i++){ 14 File file = files[i]; 15 String filepath = file.getAbsolutePath(); 16 String path = file.getPath(); 17 18 if (filepath.endsWith("jpg") || filepath.endsWith("gif")|| filepath.endsWith("bmp") 19 || filepath.endsWith("png")) { 20 21 ArrayList<String> myFilePath=new ArrayList<String>(); 22 myFilePath.add(filepath);//这里每次扫描目录都会添加。 23 24 for (String ll : myFilePath) { 25 Log.e("myFilePath", ll.toString()); 26 } 27 } 28 else{ // 目标为文件夹,进入该文件夹继续遍历 29 if (file.isDirectory()) { 30 this.getFileDir(path); 31 } 32 } 33 continue; 34 } 35 } 36 } 37 }