最近在帮一个同学做毕设,是一个视频播放器项目,要求实现截图功能。正好项目集成了GSYVideoPlayer 用于视频播放,里面内置了截取视频内容的接口,正好可以使用。新建了一个文件夹后,将图片存入文件夹,图片已经保存到sd卡中,但是系统图库检测不到?
主要原因在于没有向系统发送广播,提示系统更新系统图库。
//保存图片的方法
// 获取内置SD卡路径
String sdCardPath = Environment.getExternalStorageDirectory().getPath();
//如果不存在给文件夹,则创建 名为 TV 的文件夹
String path = sdCardPath + File.separator + "TV";
File f = new File(path);
if(!f.exists()){
f.mkdir();
}
// 图片文件路径 截图文件使用sp中的int值自增实现,看博客有些通过当前时间命名
int n = SpUtils.getInt(this,StaticClass.CAP,0);
String filePath = path+ File.separator+ "screenshot"+ n +".png";
File file = new File(filePath);
//GSYVideoPlayer 保存截图的接口
videoPlayer.saveFrame(file, true, new GSYVideoShotSaveListener() {
@Override
public void result(boolean success, File file) {
if(success == true){
SpUtils.putInt(VedioDeailActivity.this,StaticClass.CAP,n+1);
Toasty.success(VedioDeailActivity.this,"截图保存成功",Toast.LENGTH_SHORT).show();
}else {
Toasty.success(VedioDeailActivity.this,"截图保存失败",Toast.LENGTH_SHORT).show();
}
}
});
图片保存到了系统目录:
但是系统相册中检测不到:
emmmmmmmm 坑爹 手机重启之后就能检测到了 ,无语
解决方法:
需要立刻更新系统图库以便让用户可以立刻查看到这张图片
更新系统图库的方法:
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
报错:
java.lang.SecurityException:
Permission Denial: not allowed to send broadcast android.intent.action.MEDIA_MOUNTED from pid=3270, uid=10071
com.ly.tv.activity.VedioDeailActivity$4.result(VedioDeailActivity.java:188)
Google将MEDIA_MOUNTED的权限提高了,于是就报了一个上面的错误。
在高版本中使用ACTION_MEDIA_SCANNER_SCAN_FILE去通知系统重新扫描文件。代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Intent mediaScanIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri contentUri = Uri.fromFile(mPhotoFile); //out is your output file
mediaScanIntent.setData(contentUri);
CameraActivity.this.sendBroadcast(mediaScanIntent);
} else {
sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
}
成功解决问题: