Android mediaScannerConnection.scanFile 无法刷新图库中的图像

2024-03-06

我是否应该使用 MediaScannerConnection.scanFile 方法以外的方法来刷新图库?

保存新的 jpg 后,我运行媒体扫描仪来刷新图库应用程序,如下所示

        MediaScannerConnection.scanFile(this,
                new String[] { fullname }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
            public void onScanCompleted(String path, Uri uri) {
                Log.d("ExternalStorage", "@@@@ Scanned " + path + ":");
                Log.d("ExternalStorage", "@@@@ -> uri=" + uri);
            }
       });

日志的输出显示以下正确的输出

@@@@ 扫描的/data/data/com.mypackage/files/skit_106_01.jpg:

@@@@ -> uri=content://media/external/images/media/95

图库应用程序显示没有可用的媒体

这段代码已经完美运行了一段时间了。直到我针对 4.4.2 版本创建 Android avd 进行进一步测试时,问题才出现。

我的代码似乎是根据Android文档刷新图库应用程序的推荐方法,所以这个问题可能与我保存文件的方式有关,其代码如下。

UPDATE

该代码检查外部存储可用性并将写入外部存储,如果外部存储不可用,则会将文件写入内部存储。

    private void doSave(String fname, boolean doShare) {
        fname = "skit_"+mCurrentSkitId +
                "_"+mSkitManager.getCurrentFrameCount(
                        mCurrentSkitId)+1;
        Log.d(TAG, "@@@@ doSave fName = " + fname + " Current skit id = " + mCurrentSkitId);
        CharSequence text = getResources().getString(R.string.saved_as)
                + " " + fname;
        try {
            Bitmap b = mMainView.getSaveBitmap();
            if (b == null) {
                text = getResources().getString(R.string.save_fail_1);
                ;
                Toast.makeText(this, text, Toast.LENGTH_LONG).show();
                return;
            }
            fname = FileUtils.replaceInvalidFileNameChars(fname);
            String value = fname;
            File folder = FileUtils.getWritableFolder(this);
            /*
             * String folder =
             * Environment.getExternalStorageDirectory().toString() +
             * "/Pictures"; try { folder =
             * Environment.getExternalStoragePublicDirectory
             * (Environment.DIRECTORY_PICTURES).toString(); } catch
             * (NoSuchFieldError e) {
             * 
             * }
             */
            String ext = ".jpg";
            if (mPrefs.getString("format", "JPG").equals("PNG"))
                ext = ".png";
            String fullname = folder.getAbsolutePath() + File.separator + value
                    + ext;
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("filename", fullname);
            FileOutputStream fos;
            if (folder == getFilesDir())
                fos = openFileOutput(value + ext, Context.MODE_WORLD_WRITEABLE);
            else {
                File f2 = new File(fullname);
                fos = new FileOutputStream(f2);
            }
            b.compress(CompressFormat.JPEG, 95, fos);
            fos.close();
            String[] str = new String[1];
            str[0] = fullname;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO) {
                MediaScannerConnection.scanFile(this,
                        new String[] { fullname }, null,
                        new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        Log.d("ExternalStorage", "@@@@ Scanned " + path + ":");
                        Log.d("ExternalStorage", "@@@@ -> uri=" + uri);
                    }
               });
            }
            text = text + value + ext + " "
                    + getResources().getString(R.string.saved_end);
            ;
            mLastSaveName = value;
            setDetailTitle();
            mSkitManager.createFrame(mCurrentSkitId, fullname);
        } catch (Exception e) {
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("text", e.toString());
            e.printStackTrace();
            text = getResources().getString(R.string.save_fail_2)
                    + e.toString();
        } catch (Error e) {
            Map<String, String> hm = new HashMap<String, String>();
            hm.put("text", e.toString());
            e.printStackTrace();
            text = getResources().getString(R.string.save_fail_2)
                    + e.toString();
        }
        Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    }

检查外部存储可用性的代码如下所示

public static File getWritableFolder(Context context) {
    File folder = context.getFilesDir();
    if (externalStorageAvailable()) {
        try {
            folder = Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            if (!folder.exists() || !folder.canWrite()) {
                folder = Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
            }
            if (!folder.exists() || !folder.canWrite()) {
                folder = Environment.getExternalStorageDirectory();
            }
        } catch (Exception e) {
            folder = Environment.getExternalStorageDirectory();
        } catch (Error e) {
            folder = Environment.getExternalStorageDirectory();
        }
        if (!folder.exists() || !folder.canWrite()) {
            folder = context.getFilesDir();
        }
    }
    return folder;
}

private static boolean externalStorageAvailable() {
    boolean mExternalStorageAvailable;
    boolean mExternalStorageWriteable;
    String state = Environment.getExternalStorageState();

    if (state.equals(Environment.MEDIA_MOUNTED)) {
        // We can read and write the media
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
        // We can only read the media
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        // Something else is wrong. It may be one of many other states, but
        // all we need
        // to know is we can neither read nor write
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }
    return mExternalStorageAvailable && mExternalStorageWriteable;
}

如果有人能够找出上述任何一个可能有助于解决这个问题的漏洞,那就太好了。


我的结果好坏参半MediaScannerConnection所以我用了sendBroadcast方法代替。我不知道是否sendBroadcast方法不是标准/不应该使用,但它对我有用。

public void galleryAddPic(File currentPhotoPath) {  
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    Uri contentUri = Uri.fromFile(currentPhotoPath);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}

还关于MediaScannerConnection : https://stackoverflow.com/a/4825615/1497188 https://stackoverflow.com/a/4825615/1497188

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android mediaScannerConnection.scanFile 无法刷新图库中的图像 的相关文章

  • RecyclerView每隔几个项目都是相同的 - 可扩展项目

    我的 recyclerView 有问题 我正在使用此布局来扩展 recyclerView 中的 cardView https github com AAkira ExpandableLayout https github com AAkir
  • getItemAtPosition() 未在列表视图中返回值

    我创建了一个自定义基本适配器类 用图像和文本填充列表视图 类的代码如下 public class ViewAdapter extends BaseAdapter private Activity activity private Strin
  • 从 admob 独立 SDK 切换到 Google Play 服务 SDK 时,apk 大小会膨胀

    使用 Admob SDK 我的 apk 大小为 230Kb 当用 google play services SDK 替换 Admob SDK 时 它是 1 5MB 膨胀了 6 倍以上 我想完整的 Google Play 服务客户端 SDK
  • Android异步服务调用策略

    这是场景 客户端对服务进行远程调用 返回 void 并提供 回调对象 服务在后台线程上执行一些长时间运行的逻辑 然后使用回调对象来触发以太成功或失败 因为这些操作视觉元素 执行 Activity runOnUiThread 块 该场景运行良
  • android studio更新到3.0后任务执行失败

    当我更新 Android Studio 3 0 时 出现错误 unable to merge with dex 然后我添加了mutiDexEnabled true并且还添加了com android support multidex 1 0
  • XAMARIN - 添加来自 youtube 的视频

    我搜索如何从 youtube 添加视频的信息 例如 我想从一些 YouTube 链接添加视频 我认为它应该在网络视图中 但我需要一些详细信息 因为我找不到有关我的问题的任何信息 您可以使用 webview 播放 youtube 视频 str
  • Android 服务 START_STICKY START_NOT_STICKY

    我需要让我的服务始终在后台运行 并使用 startService 函数启动我的服务 无论应用程序的状态如何 我都不想重新启动服务 这是我的观察 START STICKY gt 如果应用程序启动 则服务正在重新启动 当应用程序关闭时 服务也会
  • 意图过滤器到底是什么?

    我读过很多关于意图过滤器的文章 但我真的无法理解它们到底是做什么的 那么 如果有人可以用一个清晰 的例子向我解释意图过滤器的作用到底是什么 thanks 我认为这是有据可查的here http developer android com g
  • 按钮上方带有文本的单选按钮

    我是 Android 新手 我需要在我的活动中添加单选按钮 但我需要将文本放在项目符号按钮的顶部 请提供任何帮助 我发现了以下内容 尽管我不明白 drawable in 选择器和 style Tab 样式是什么 顶部带有文本的单选按钮 ht
  • 获取包含位图支持的画布的 Android 视图上的点的像素颜色值

    我正在尝试找出获取给定点上像素颜色值的最佳方法View http developer android com reference android view View html 我可以通过三种方式写入视图 我设置了背景图像View setBa
  • 带有内容提供商的小部件;无法使用ReadPermission?

    所以我刚刚为我的应用程序实现了一个小部件 它通过我的数据库从数据库获取数据ContentProvider 我在清单中定义了自己的读 写权限 声明我使用它们 似乎没有什么区别 并在内容提供程序中要求它们
  • 在应用程序之间共享自定义帐户验证器

    我有一个为使用自定义 AccountAuthenticator 的客户端构建的应用程序 它工作得非常好 并且满足了客户的需求 但是 这只是将使用相同身份验证管理器的应用程序集合中的第一个应用程序 这就是我不确定如何继续的地方 我无法知道任何
  • 通过覆盖滑动调整图像大小不会调整图像大小

    我在用着Glide下载并显示图像 但是 当我尝试调整图像大小时 它不会这样做 我得到随机大小 或者可能是图像的实际大小 这是我用于通过 Glide 加载的代码 Glide with context load file getUrl asBi
  • Eclipse Android 模拟器 - 键盘不工作

    我刚刚更新到最新的 SDK 版本 16 使用最新版本的 API 16 创建了新版本的 AVD 并且我的硬件键盘在模拟器上不再工作 甚至我的其他 avd 使用旧版本的 sdk 任何想法如何解决这一问题 您的 AVD 的 键盘支持 硬件属性是否
  • 为什么 Android 上的免安装应用有两种设置?

    我使用的是运行 Android 11 的 Pixel 3 我发现有 2 种不同的设置可以控制免安装应用的某些方面 设置 应用程序和通知 默认应用程序 打开链接 即时应用程序 即使未安装 也打开应用程序中的链接 切换默认为开 Google P
  • 应用程序运行时相对布局中的元素显示不同

    我有一个ListView在片段内创建 并且它有一个搜索过滤器 问题是 XML 布局在 android studio 中显示正常 但在模拟器或手机中运行时 它显示不同 与我对齐时不正确 并且当我单击SearchView它位于选项卡导航下方 谁
  • 测试应用内结算:“发布者无法购买此商品”

    我的应用程序似乎已准备好在我的设备上进行应用内购买程序的 现实生活 测试 但是 我在 Play 商店中收到 发布商无法购买此商品 的错误消息 现在 我应该如何测试这个 我不想通过仅用于测试的虚拟帐户重新安装手机来丢失手机的配置 在开发者控制
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • Android:在surfaceview上实现admob

    我有一个使用 SurfaceView 的小游戏形式的活动 下面是代码片段 我很困惑如何在 SurfaceView 上实现 admob 请建议 public class DroidzActivity extends Activity priv
  • 带有包含布局的导航抽屉布局

    我认为我的问题实际上很简单 但我不知道如何解决 有一个工作导航抽屉 代码如下

随机推荐

  • 查找向量矩阵的最频繁行或众数 - Python / NumPy

    我有一个形状 n 的 numpy 数组 表示 n 维向量的向量 我想找到最频繁的行 到目前为止 最好的方法似乎是迭代所有条目并存储计数 但 numpy 或 scipy 没有内置的东西来执行此任务 这似乎很淫秽 这是一种使用的方法NumPy
  • 我的应用程序启动颠倒

    我已经开发了一段时间并发布了游戏的引擎现在正在颠倒地启动我当前的项目 并立即按预期的方式旋转 UIView 我用代码创建了界面 它的外观如下 BOOL application UIApplication application didFin
  • 按类别列出项目

    我有3张桌子 类别doesnt matter 项目2猫 itemID catID item id name desc 我想列出给定类别中的项目 但我不知道如何以简单的方式做到这一点 使用 PHP 和 MySQL 我需要这个表结构 因为我想要
  • CSS 属性选择器在 href 中不起作用

    我需要使用 css 中的属性选择器来更改不同颜色和图像上的链接 但它不起作用 我有这个html a href manual pdf A PDF File a 还有这个CSS a display block height 25px paddi
  • 多个产品的证书和配置文件组织

    在我的工作场所 我们已经完成了一个 iOS 应用程序的开发 即将开始第二个应用程序的开发 在此之前 我想澄清一些有关证书和配置文件以及构建环境的事情 问题 1 我认为一个 Apple 帐户只能有一个分发证书 因此这将在两个应用程序中使用 这
  • SendKey.Send() 不起作用

    我正在使用 WPF 并导入了 System Windows Form 引用 这是我的代码 Process process Process GetProcessesByName wmplayer SetForegroundWindow pro
  • 如何使用 libpqxx 中的 pqxx::stateless_cursor 类?

    我正在学习 libpqxx PostgreSQL 的 C API 我想使用 pqxx stateless cursor 类 但是 1 我发现 Doxygen 输出在这种情况下没有帮助 2 pqxx org 网站已经关闭一段时间了 有人知道如
  • Python 4维球体上点的均匀分布

    我需要 4 维球体上均匀分布的点 我知道这并不像选择 3 个角度并使用极坐标那么简单 在 3 维中我使用 from random import random u random costheta 2 u 1 for distribution
  • 如何使用编译器 API 将 Typescript 转换为 Typescript?

    我想构建一个工具来对打字稿代码执行转换 并将它们作为打字稿 而不是 JavaScript 发出 作为现有代码库一次性升级路径的一部分 这可能吗 如果可能的话 如何实现 我没有找到关于编译器 API 的全面且清晰的参考资料 任何指向参考或实际
  • 三元表达式中带有自动装箱的 NullPointerException

    运行以下 Java 代码 boolean b false Double d1 0d Double d2 null Double d b d1 doubleValue d2 为什么会出现空指针异常 条件表达式的返回类型b d1 doubleV
  • 运行 clojure-1.9.0.jar 时出现异常:缺少 clojure/spec/alpha__init.class 和 clojure/spec/alpha.clj

    莱宁根下载clojure 1 9 0 jar作为依赖 它位于 m2 repository org clojure clojure 1 9 0 它通过 lein repl 工作得很好 然而 如果 从 m2 repository org clo
  • DOM 环境中什么时候会发生回流?

    哪些活动会触发带有 DOM 的网页重排 似乎有不同的观点 根据http www nczonline net blog 2009 02 03 speed up your javascript part 4 http www nczonline
  • 如何在jsp中显示Spring Security身份验证异常的自定义错误消息

    我想在 jsp 中显示 spring 安全身份验证异常的自定义错误消息 如果用户名或密码错误 spring displays Bad credentials what I need Username Password entered is
  • 在透明背景上制作不透明文本渐变

    它应该看起来像http img190 imageshack us img190 1686 textgradient jpg http img190 imageshack us img190 1686 textgradient jpg 棘手的
  • 在Windows上使用sdkmanager安装android命令行工具

    我正在尝试在 Windows 上使用 sdkmanager 安装 Android 命令行工具 以便在 SAP Web IDE 中进行混合 Android 应用程序开发 另外 我位于代理网络下 当我尝试通过以下命令使用 cmd 设置代理时 s
  • 如何调试 System.Web.Mvc.MvcHandler 上的 500.0 / 0x00000000 错误

    我收到这个奇怪的错误 我无法弄清楚 在 Windows 8 1 IIS 8 5 上运行 该网站在 Microsoft Azure 上运行良好 因此肯定是本地配置问题 我在 IIS Express 中遇到的错误与在 IIS 中遇到的错误相同
  • iOS-获取目录中文件大小的总和

    我使用以下代码来缓存从 Flickr 加载到设备内存中的照片 NSURL urlForPhoto FlickrFetcher urlForPhoto self photo format FlickrPhotoFormatLarge NSSt
  • 使用自定义部分覆盖模板

    我正在尝试从自定义部分覆盖我的默认模板 我正在使用代码来执行此操作 但是如果我使用它 我无法将模板分配到编辑页面页面 任何人都可以知道自定义部分如何和编辑页面分配模板工作 我想在创建页面时设置模板 并在分配它后我想覆盖它 假设我有一个博客页
  • 提高优化级别 g++

    我正在尝试使用 cygwin 和 g 编译一个相对简单的 C 程序 我可以使用以下命令编译它 g o main main cpp lgmpxx lgmp 注 最后两个反映了 gmp 库的包含 我想提高编译时的优化级别 我想我可以将此命令行更
  • Android mediaScannerConnection.scanFile 无法刷新图库中的图像

    我是否应该使用 MediaScannerConnection scanFile 方法以外的方法来刷新图库 保存新的 jpg 后 我运行媒体扫描仪来刷新图库应用程序 如下所示 MediaScannerConnection scanFile t