天使漫步IT工作室

如何让 Android 保存图片显示到相册(解决无法显示和适配7.0)


一般android应用中会有需求要下载原图,那么怎么让下载完的图片显示在相册中?一般的步骤:

示例代码如下:

try {
        MediaStore.Images.Media.insertImage(getContentResolver(), file.getAbsolutePath(), file.getName(), null);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    // 最后通知图库更新
    Uri contentUri;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        contentUri = FileProvider.getUriForFile(this, "com.xxx.xx.fileprovider", file);
    } else {
        contentUri = Uri.parse("file://" + file.getAbsolutePath());
    }
    this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri));

以上代码在发送广播之前,分别针对不同的版本使用不同的api生成uri(适配android7.0版本)

网上有教程说可以使用ACTION_MEDIA_MOUNTED广播来触发系统扫描文件,但是根据android-KITKAT(19)版本以后的要求,只有系统才能使用此广播。如果在高于19版本的android上使用,会触发没有权限的bug。那么如何兼容KITKAT以前的版本要求?

兼容步骤如下:

<protected-broadcast android:name="android.intent.action.MEDIA_MOUNTED" />

代码示例:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
   final Intent scanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
   final Uri contentUri = Uri.fromFile(outputFile); 
   scanIntent.setData(contentUri);
   sendBroadcast(scanIntent);
} else {
   final Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()));
   sendBroadcast(intent);
}

综合上面,我们可以在大于KITKAT(19)版本的逻辑分支里面又进行更细化的适配处理。

参考文章:

当前页面是本站的「Baidu MIP」版。查看和发表评论请点击:完整版 »