问题1:如上,图片从服务器上下载下来,但是打开手机相册后看不到下载的图片,一定要找到sd卡图片目录,打开图片,这个时候再打开相册就可以看到了,这是为什么?下面是我的代码,求指点哪里写的不对,谢谢。 //保存图片到sdcard public void saveImages(String imageViews){ InputStream is = null; //定义一个输入流。 BufferedInputStream bis = null;//定义一个带缓冲的输入流 。 try{ URL url = new URL(imageViews);//创建一个URL对象。 is = url.openStream(); //打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 bis = new BufferedInputStream(is); }catch(Exception e){ System.out.println(e.toString()); } //创建储存图片的文件 String midr = Environment.getExternalStorageDirectory()+ "/download"; File fird = new File(midr); if(!fird.exists()){ fird.mkdirs(); //创建新文件夹 } //获取系统时间 dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); String systemTime = dateFormat.format(new java.util.Date()); String path = Environment.getExternalStorageDirectory()+ "/download/" + "wx"+"_"+systemTime+".jpg"; //path =mnt/xuzhong/wx_201408211452.jpg //写到本地 BufferedOutputStream bos = null; //定义一个带缓冲的输出流。 File file = new File(path); try{ bos = new BufferedOutputStream(new FileOutputStream(file));; //file:mnt/sdcard/xunzhong/wx_20140821163351.jpg byte[] b = new byte[1024]; //创建字节数组。 while(bis.read(b)!=-1){ //输入流中的数据如果还有下一行(!=-1)将继续循环 bos.write(b); //将字节数组写入输出流。 } }catch(Exception e){ System.out.println("++++++++++++++++++"+e.toString()); }finally{ try{ bos.flush(); //刷新此缓冲的输出流。 bis.close(); //关闭此输入流 。 }catch(Exception e){ System.out.println("++++++++++++++++++"+e.toString()); } } } 问题二:通过这个方法有时候下载下来的图片打不开,但是它有大小比如20k,打不开几率为10% 谢谢了 |
|
自己先顶一下,等待大神出现
|
|
5分 |
byte[] b = new byte[1024]; //创建字节数组。
while(bis.read(b)!=-1){ //输入流中的数据如果还有下一行(!=-1)将继续循环 bos.write(b); //将字节数组写入输出流。 } 这个地方 改成 如果你下载到SDCARD中,手机相册里面的数据 是有个数据库维护的,你重来不打开可能 数据库就没有 刚下载的图片信息。 |
“你重来不打开可能 数据库就没有 刚下载的图片信息。 ” 这菊花没太看懂? 上面的代码按照你的该了 |
|
byte[] b = new byte[1024]; 不需要这句代码吗? 那while(n= bis.read(b) ! = -1) b 是什么? |
|
10分 |
我认为这跟代码没有关系,我觉得跟你的手机相册有关系,有些手机相册就是打开指定的文件夹里面的图片,而有些手机相册会打开所有的手机上的图片。你换个手机相册看看
|
10分 |
还需要更新media的database。
可以发送broadcast Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,参数带上文件的完整路径,让mediaprovider scan这个文件。 |
5分 |
如果没有通知系统更新图库的sqlite数据,新的图片是看不到的。可以发个开机广播或者sdcard重新放入的广播,系统就会更新的。
或者你重启模拟器。。。 |
我想做成实时的,这边点完保存图片,里面打开相册可以看到。谢谢 |
|
5分 |
发送广播通知图库更新
|
sccard重新放入广播,求指点? |
|
你好,我不会用广播,能给个demo吗? 谢谢你了 |
|
5分 |
|
看哪个? |
|
public void scanFileAsync(Context ctx, String filePath) { Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); scanIntent.setData(Uri.fromFile(new File(filePath))); ctx.sendBroadcast(scanIntent); } 写了一个这样的方法,把我的midr(文件目录) 丢进去,貌似还是不行 |
|
问题解决了,网上找的答案,不过还是谢谢几位。
//扫描指定文件 public void scanFileAsync(Context ctx, String filePath) { Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); scanIntent.setData(Uri.fromFile(new File(filePath))); ctx.sendBroadcast(scanIntent); } //扫描指定目录 public static final String ACTION_MEDIA_SCANNER_SCAN_DIR = "android.intent.action.MEDIA_SCANNER_SCAN_DIR"; public void scanDirAsync(Context ctx, String dir) { Intent scanIntent = new Intent(ACTION_MEDIA_SCANNER_SCAN_DIR); scanIntent.setData(Uri.fromFile(new File(dir))); ctx.sendBroadcast(scanIntent); } 调用这两个方法就可以了 |
|
楼主,请问你用这段代码 保存的图片没有失真吗?像这样
|