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

jeadong_flash 2014-08-25 07:36:15
问题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%


谢谢了
...全文
2106 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
第一段代码 2015-08-07
  • 打赏
  • 举报
回复
引用 16 楼 qlzcaoming 的回复:
楼主,请问你用这段代码 保存的图片没有失真吗?像这样
我也遇到了,楼主怎么解决的啊,求参考
第一段代码 2015-08-06
  • 打赏
  • 举报
回复
引用 15 楼 a873228446 的回复:
问题解决了,网上找的答案,不过还是谢谢几位。

	 //扫描指定文件
	 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);
     }
调用这两个方法就可以了
这两个方法怎么调用啊
qlzcaoming 2015-04-03
  • 打赏
  • 举报
回复
楼主,请问你用这段代码 保存的图片没有失真吗?像这样
秋杨 2014-08-26
  • 打赏
  • 举报
回复
如果没有通知系统更新图库的sqlite数据,新的图片是看不到的。可以发个开机广播或者sdcard重新放入的广播,系统就会更新的。 或者你重启模拟器。。。
sky-Z 2014-08-26
  • 打赏
  • 举报
回复
还需要更新media的database。 可以发送broadcast Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,参数带上文件的完整路径,让mediaprovider scan这个文件。
dali_yan 2014-08-26
  • 打赏
  • 举报
回复
我认为这跟代码没有关系,我觉得跟你的手机相册有关系,有些手机相册就是打开指定的文件夹里面的图片,而有些手机相册会打开所有的手机上的图片。你换个手机相册看看
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
引用 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 是什么?
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
引用 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中,手机相册里面的数据 是有个数据库维护的,你重来不打开可能 数据库就没有 刚下载的图片信息。
“你重来不打开可能 数据库就没有 刚下载的图片信息。 ” 这菊花没太看懂? 上面的代码按照你的该了
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
问题解决了,网上找的答案,不过还是谢谢几位。

	 //扫描指定文件
	 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);
     }
调用这两个方法就可以了
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复

	 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(文件目录) 丢进去,貌似还是不行
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
引用 12 楼 hjywyj 的回复:
[quote=引用 11 楼 a873228446 的回复:]你好,我不会用广播,能给个demo吗? 谢谢你了
看看这个吧[/quote] 看哪个?
  • 打赏
  • 举报
回复
引用 11 楼 a873228446 的回复:
你好,我不会用广播,能给个demo吗? 谢谢你了
看看这个吧
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
引用 9 楼 hjywyj 的回复:
发送广播通知图库更新
你好,我不会用广播,能给个demo吗? 谢谢你了
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
引用 7 楼 liqiuyang9 的回复:
如果没有通知系统更新图库的sqlite数据,新的图片是看不到的。可以发个开机广播或者sdcard重新放入的广播,系统就会更新的。 或者你重启模拟器。。。
sccard重新放入广播,求指点?
  • 打赏
  • 举报
回复
发送广播通知图库更新
jeadong_flash 2014-08-26
  • 打赏
  • 举报
回复
引用 7 楼 liqiuyang9 的回复:
如果没有通知系统更新图库的sqlite数据,新的图片是看不到的。可以发个开机广播或者sdcard重新放入的广播,系统就会更新的。 或者你重启模拟器。。。
我想做成实时的,这边点完保存图片,里面打开相册可以看到。谢谢
Birds2018 2014-08-25
  • 打赏
  • 举报
回复
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中,手机相册里面的数据 是有个数据库维护的,你重来不打开可能 数据库就没有 刚下载的图片信息。
jeadong_flash 2014-08-25
  • 打赏
  • 举报
回复
自己先顶一下,等待大神出现

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧