拍照后扫描媒体更新,ACTION_MEDIA_SCANNER_SCAN_FILE无效

7号南孚电池 2013-10-31 09:58:59
最近在做个相机功能。把照片保存到系统相册之后。利用sendBroadcast去通知ACTION_MEDIA_SCANNER_SCAN_FILE总是无效。
代码如下:

String url=MediaStore.Images.Media.insertImage(getContentResolver(), picture, "", "");
Uri uri= Uri.parse(url);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri));

发现总是没有更新系统相册!
设备是HTC G18,求大家指点下
...全文
6954 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
nod22 2016-06-20
  • 打赏
  • 举报
回复
这个得换下思路 MediaScannerConnection.scanFile 这个方法扫描的是一个 url 文件具体的存储路径,而MediaStore.Images.Media.insertImage这个方法返回的是一个uri,那么我们要想在插入系统相册后扫描就需要将uri转换成url ,代码如下 if (resultCode == RESULT_OK) { Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 String fileNameUri = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "", ""); Log.d("StorageActivity", "married is " + fileNameUri); //sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(fileName.replace("content","file")))); //sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory()))); String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor = this.managedQuery(Uri.parse(fileNameUri),proj,null,null,null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actualimagecursor.moveToFirst(); String img_path = actualimagecursor.getString(actual_image_column_index); Log.d("StorageActivity", "married is " + img_path); MediaScannerConnection.scanFile(this, new String[]{ img_path}, null, null); picture.setImageBitmap(bitmap); }
zwb1999 2016-05-10
  • 打赏
  • 举报
回复
[b][b]我是把已经存在的相册插入相册然后再刷新的,所以没有拍照这个过程,没法用你这个方法,但是我在打开相册的时候有对应的onactivityResult()方法,但是我放进去依然刷新不了相册,用的是华为的神机,我目前就发现这又华为的机子有这种问题。
zwb1999 2016-05-10
  • 打赏
  • 举报
回复
是把图片插入相册,打错了
yangyu5646 2016-01-26
  • 打赏
  • 举报
回复
引用 7 楼 LeiGang1991 的回复:
我使用sendBroadcast和MediaScannerConnection.scanFile刷新相册,在4.0的模拟器上可以,当我把它下载到4.4的开发板上时发现无法刷新,打开sd卡,目录也没有图片,但是重启开发板后,打开相册能够发现图片,有大神知道是怎么回事么?
不知道这个问题你解决了吗? 我也在部分机型遇到这个问题,求指教
星秋乘风 2016-01-26
  • 打赏
  • 举报
回复
我是这样做的,因为当时在Android中调用完相机拍照之后,系统会调用onActivityResult函数,将sendBroadcast写在onActivityResult中就可以了。
加哥 2015-12-16
  • 打赏
  • 举报
回复
引用 7 楼 LeiGang1991 的回复:
我使用sendBroadcast和MediaScannerConnection.scanFile刷新相册,在4.0的模拟器上可以,当我把它下载到4.4的开发板上时发现无法刷新,打开sd卡,目录也没有图片,但是重启开发板后,打开相册能够发现图片,有大神知道是怎么回事么?
重启之后MediaProvider会重新扫描更新数据库,所以即使你不手动发广播也是可以在重启后的照片里面靠到全部图片。
星秋乘风 2015-11-09
  • 打赏
  • 举报
回复
我使用sendBroadcast和MediaScannerConnection.scanFile刷新相册,在4.0的模拟器上可以,当我把它下载到4.4的开发板上时发现无法刷新,打开sd卡,目录也没有图片,但是重启开发板后,打开相册能够发现图片,有大神知道是怎么回事么?
老江 2015-09-14
  • 打赏
  • 举报
回复
引用 5 楼 zgjxxjk 的回复:
不知道博主已经解决了没,可否分享一下!
我试过了 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file))); 确实只是会扫描某个文件
  • 打赏
  • 举报
回复
不知道博主已经解决了没,可否分享一下!
yangtaoxiantao 2013-11-12
  • 打赏
  • 举报
回复
注意:Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,是只扫描文件的,不会扫描文件夹的,得你自己查找指定文件 private void scanSdCard(){ String file= Environment.getExternalStorageDirectory().getAbsolutePath()+"/Photo"; folderScan(file); } private void fileScan(String file){ sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + file))); } private void folderScan(String path){ File file = new File(path); if(file.exists() && file.isDirectory()){ File[] array = file.listFiles(); for(int i=0;i<array.length;i++){ File f = array[i]; if(f.isFile()){//FILE TYPE String name = f.getName(); if(name.endsWith(".mp4") || name.endsWith(".mp3") || name.endsWith(".jpg")){ fileScan(f.getAbsolutePath()); } } else {//FOLDER TYPE folderScan(f.getAbsolutePath()); } } } }
Simple魏 2013-11-01
  • 打赏
  • 举报
回复
Uri data = Uri.parse("file://" +"这里是图片路径"); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, data));
happyLife002 2013-11-01
  • 打赏
  • 举报
回复
试试这个,应该好使
 // Tell the media scanner about the new file so that it is
            // immediately available to the user.
            MediaScannerConnection.scanFile(this,
                    new String[] { file.toString() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                public void onScanCompleted(String path, Uri uri) {
                    Log.i("ExternalStorage", "Scanned " + path + ":");
                    Log.i("ExternalStorage", "-> uri=" + uri);
                }
            });
祝你成功!
对于拍摄照片我们可以直接调用系统自带的相机拍照,一般情况下无需我们自己开发相机拍照。 1、当点击按钮后我们可以通过Intent意图启动系统相机 @Override public void onClick(View v) { Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String temName=new DateFormat().format("yyMMdd_hhmmss",System.currentTimeMillis())+"_"+(Math.random()*100)+".jpg"; //文件名 image_path=path+File.separator+temName; File file=new File(image_path); if(file.exists()){ file.delete(); } Uri u=Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, u); startActivityForResult(intent, 0); } 在这里设置 intent.putExtra(MediaStore.EXTRA_OUTPUT, u);非常重要,如果不设置这个参数那么我们获取到的图片只是一个经过压缩后的缩略图,只有设置这个才能得到拍摄后的原图。 2、在startActivityForResult(intent, 0);后我们需要重写onActivityResult(int requestCode, int resultCode, Intent data)方法,如果设置了MediaStore.EXTRA_OUTPUT那么我们在这里data返回的是null。 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode==RESULT_OK){ File file=new File(image_path); try { Uri uri = Uri.fromFile(file); BitmapFactory.Options options=new BitmapFactory.Options(); options.inJustDecodeBounds=true; BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); options.inSampleSize=4; options.inJustDecodeBounds=false; Bitmap map=BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), map, null, null); sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,uri)); image.setImageBitmap(map); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 蓝色部分是对图片进行简单的压缩处理,如果不进行处理会出现内存溢出。 红色部分是将图片保存在DCIM文件夹下。 绿色部分是发生一个广播通知系统重新扫描制定文件,这样我们就可以在图库本地图片中看到拍摄的图片。 3、最后记得在清单文件中加入调用系统相机和保存文件权限

80,472

社区成员

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

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