Code Bye

android 下载图片到sd卡,通过查看“相册”找不到,确定已经下载到sd卡,求指点

问题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);                 //将字节数组写入输出流。      
             }   

这个地方 改成
int n = -1;
while(n= bis.read(b) ! = -1)  {
     bos.write(0,n,b);类似这样的,否则有时候你的字节数刚好不是1024就可能打不开图片
}

如果你下载到SDCARD中,手机相册里面的数据 是有个数据库维护的,你重来不打开可能 数据库就没有 刚下载的图片信息。

引用 2 楼 birdsaction 的回复:

 byte[] b = new byte[1024];         //创建字节数组。  
             while(bis.read(b)!=-1){            //输入流中的数据如果还有下一行(!=-1)将继续循环  
                 bos.write(b);                 //将字节数组写入输出流。      
             }   

这个地方 改成
int n = -1;
while(n= bis.read(b) ! = -1)  {
     bos.write(0,n,b);类似这样的,否则有时候你的字节数刚好不是1024就可能打不开图片
}

如果你下载到SDCARD中,手机相册里面的数据 是有个数据库维护的,你重来不打开可能 数据库就没有 刚下载的图片信息。

“你重来不打开可能 数据库就没有 刚下载的图片信息。 ” 这菊花没太看懂?  上面的代码按照你的该了

引用 2 楼 birdsaction 的回复:

 byte[] b = new byte[1024];         //创建字节数组。  
             while(bis.read(b)!=-1){            //输入流中的数据如果还有下一行(!=-1)将继续循环  
                 bos.write(b);                 //将字节数组写入输出流。      
             }   

这个地方 改成
int n = -1;
while(n= bis.read(b) ! = -1)  {
     bos.write(0,n,b);类似这样的,否则有时候你的字节数刚好不是1024就可能打不开图片
}

如果你下载到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重新放入的广播,系统就会更新的。 
或者你重启模拟器。。。
引用 7 楼 liqiuyang9 的回复:

如果没有通知系统更新图库的sqlite数据,新的图片是看不到的。可以发个开机广播或者sdcard重新放入的广播,系统就会更新的。 
或者你重启模拟器。。。

我想做成实时的,这边点完保存图片,里面打开相册可以看到。谢谢


5分
发送广播通知图库更新
引用 7 楼 liqiuyang9 的回复:

如果没有通知系统更新图库的sqlite数据,新的图片是看不到的。可以发个开机广播或者sdcard重新放入的广播,系统就会更新的。 
或者你重启模拟器。。。

sccard重新放入广播,求指点?

引用 9 楼 hjywyj 的回复:

发送广播通知图库更新

你好,我不会用广播,能给个demo吗?  谢谢你了


5分
引用 11 楼 a873228446 的回复:

你好,我不会用广播,能给个demo吗?  谢谢你了

看看这个吧

引用 12 楼 hjywyj 的回复:
Quote: 引用 11 楼 a873228446 的回复:

你好,我不会用广播,能给个demo吗?  谢谢你了

看看这个吧

看哪个?

	 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);
     }

调用这两个方法就可以了

楼主,请问你用这段代码 保存的图片没有失真吗?像这样

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明android 下载图片到sd卡,通过查看“相册”找不到,确定已经下载到sd卡,求指点