- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我正在尝试通过启动扫描来刷新图库。对于运行 Kitkat 及更高版本的设备,我使用 mediascannerconnection。但 mediaScannerConnection 需要绝对路径来进行扫描。我拥有的是一个 DocumentFile ,它似乎没有任何方法来获取它的绝对路径。
下面是我正在使用的代码:
要获得使用新的 Lollipop API 写入文件夹的权限-->将选定的 URI 保存到全局变量--->隐藏逻辑(创建/删除“.nomedia”文件)。
// Calling folder selector.
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
..............
@SuppressLint("NewApi") @Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode == RESULT_OK && requestCode == 42) {
Uri treeUri = resultData.getData();
getContentResolver().takePersistableUriPermission(treeUri,
// Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION |
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
path = treeUri.getPath();
}
}
..........
public void hide(boolean hide){
DocumentFile pickedDir = DocumentFile.fromTreeUri(this,Uri.parse(path));
if(hide){
if(pickedDir.findFile(".nomedia")==null){
pickedDir.createFile(null, ".nomedia");
tellgallery(pickedDir.findFile(".nomedia").getUri().getPath());
}
}
else{
DocumentFile filetodelete = pickedDir.findFile(".nomedia");
if(filetodelete!=null){
filetodelete.delete();
tellgallery(filetodelete.getPath());
}
}
}
上面的代码运行良好,并在所需文件夹中创建/删除“.nomedia”文件。
现在,当我尝试告诉库该文件夹的文件已更改时。图库无法选择更改。
下面是刷新/请求扫描的代码。
private void tellgallery(String path) {
pathtonomedia = path;
if(path!=null){
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
mediaScannerConnection = new MediaScannerConnection(con,mediaScannerConnectionClient);
mediaScannerConnection.connect();
}
else{
this.sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://" + path)));
}
}
}
MediaScanner 类如下:
private MediaScannerConnectionClient mediaScannerConnectionClient =
new MediaScannerConnectionClient() {
@Override
public void onMediaScannerConnected() {
mediaScannerConnection.scanFile(pathtonomedia, null);
}
@Override
public void onScanCompleted(String path, Uri uri) {
if(path.equals(pathtonomedia))
mediaScannerConnection.disconnect();
}
};
但是代码不会刷新图库,我仍然可以在图库中看到该文件夹。然而,该文件夹可能会在 10 到 20 分钟后因系统刷新而消失。
最后我想要的是
我是否可以获得 DocumentFile 实例的路径?这样我就可以直接将它传递到 mediascanner 路径
或者还有其他方法可以请求扫描 Lollipop 中的特定文件夹。特定文件夹位于 SDCARD 中,我只知道它的 URI,而不是实际路径。
非常感谢任何帮助。
最佳答案
正如您所注意到的,删除不会触发媒体扫描,并且 DocumentFile
Uri 不适用于 MediaScanner
,因此在删除文件之前,您必须查询 MediaScanner
以获得有效路径。我所做的是迭代所有 DocumentFile
对象并对其调用 .getLastPathSegment()
。这将返回一个值,例如:
E25A-3848:Pictures/appname/images/foo.jpg
在我的测试中,该值始终有一个冒号将某些设备特定值与路径尾部分隔开。如果用户选择内部存储而不是 E25A-3838
,他们将得到类似 primary
的单词,但这并不相关。重要的是您想要获取冒号后面的所有内容,因此我像这样迭代需要删除的文档:
String temp = document.getUri().getLastPathSegment();
final int lastColon = temp.lastIndexOf(":");
if (lastColon > 0) {
boolean deletionSuccess = document.delete();
if (deletionSuccess) {
Log.d(TAG, "Deleted " + document.getUri());
segmentsToDelete.add(temp.substring(lastColon + 1));
}
}
在此循环之后,文档将消失,并且 segmentsToDelete
数组列表将包含需要从 MediaScanner 中清除的所有尾随路径。因此,我执行另一个循环,要求 MediaScanner 删除具有相同值的所有结尾条目:
final Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
for (String lastPathSegment : segmentsToDelete) {
final int result = contentResolver.delete(uri,
MediaStore.MediaColumns.DATA + " LIKE ? ESCAPE '\\'",
new String[]{"%" + escapedLike(lastPathSegment)}
);
Log.d(TAG, "Media deletion for " + lastPathSegment + " was " + result);
}
.delete()
调用将返回已删除的行数,因此您可以在那里放置一个断言以确保它始终返回 1。如果由于某种原因文档从未创建过,则可能会返回更少的值不过它进入媒体扫描仪。 escapedLike()
方法是一个自定义函数,用于确保 SQLITE like pattern matching不匹配错误的路径:
static String escapedLike(@NonNull String text)
{
return text.replace("%", "\\%").replace("_", "\\_");
}
当然,如果你想删除整个目录,上面的方法是一样的。在这种情况下,您不需要运行循环,您可以首先在目录的 DocumentFile 上调用 .delete()
,然后在构建删除查询时使用尾随 %
用于 sql LIKE
参数,该参数应返回大量删除(与媒体扫描仪中注册的文件一样多)。
使用 LIKE
匹配而不是精确的完整路径的原因是因为从 DocumentFile
获取的先前值永远不会匹配完整路径。 E25A-3848:Pictures/appname/images/foo.jpg
之类的内容稍后将由 MediaScanner
数据库返回,例如 /storage/sdcard1/Pictures/appname/图片/foo.jpg
。遗憾的是删除操作没有在内部调用 MediaScanner...
关于java - 使用 MediaScanner 连接和从 TreeUri 获取的 DocumentFile URI(对于 Lollipop 版本)刷新图库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33089649/
我们知道,当使用 hibernate 对数据库进行批量更新时(即使在 HQL 中),所做的更改不会复制到存储在当前 session 中的实体。 所以我可以调用 session.refresh 来加载对
我正在做一个项目,所有的东西都保存在事件中,所以服务器需要一些时间来响应新数据。我正在使用 Fluent 等待使用 ajax 的页面,但是这个不使用任何 ajax。所以我想刷新页面检查是否有新项目,如
我有一个从 Vector 创建的 JTable。 如何刷新 JTable 以显示添加到 Vector 的新数据? 最佳答案 当 TableModel 发生更改时,您的 JTable 应该会自动更新。我
有没有办法使用下面的代码来刷新已经存在的 div id,而不是刷新时间? window.onload = startInterval; function startInterval() {
我更新了在 Shiny Server 上运行的 Shiny 应用程序使用的 DataSet.RData。但是, Shiny 的应用程序仍在旧数据上运行。我已通过浏览器历史记录清除并重新启动浏览器几次,
我的应用程序中有一个无限滚动的网格面板(ExtJs 4.2.1),类似于 this example .用户可以单击刷新按钮,然后必须使用数据库中的数据更新网格的行。我在刷新按钮处理程序中调用 stor
我不知道这三种方法中哪一种最适合我。他们都为我工作。有谁知道刷新、更新和重画之间的区别吗? 最佳答案 根据在线文档: Refresh - 重新绘制屏幕上的控件。 Call Refresh method
有什么办法吗 ICollectionView.Refresh() 或者 CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); 在
这个问题已经有答案了: Updating address bar with new URL without hash or reloading the page [duplicate] (4 个回答)
我有一个 javascript 设置超时以在 10 秒后关闭 div,并且我想在 div 关闭时添加页面刷新。我正在使用的代码如下。 var container_close_sec = "1
我有一组具有以下名称的页面.... update1.php update2.php update3.php update4.php update5.php update6.php update7.ph
如果是则触发js函数。我可以使一个复选框保持选中状态,并在页面刷新时检查值并选中“checked”,并提交以下内容... checked="checked" /> 你都不记得触发js函数。 这是我的
我正在尝试刷新 php 脚本以在数据库更新时显示更新的内容。我首先构建了我的 php,然后刷新代码,然后合并它们。但是,脚本不会更新。有谁知道为什么吗? $(document).ready
当我要删除的节点扩展集合类型时,Grails中有一个错误阻止我使用removeFrom *。直接从关联中删除节点不会更新二级缓存。 A hasMany B 有什么方法可以使关联缓存手动无效或强制重新加
我正在使用 hibernate 和 mysql 来抽象一个数据库,以便在 java 驱动的网站中使用。我使用 hibernate 很好地解决了所有查询,但似乎无法弄清楚如何使用它进行更新、插入和删除,
如何通过调用 oncreateview 方法重新创建 fragment ?我有一个 fragment ,用于通过表单插入新数据,单击按钮后,我想通过删除在 EditText 中输入的数据来重新创建 f
当我从一个到另一个时,我试图刷新我的观点。我知道我应该将刷新代码放在 viewWillAppear 中,但我不知道该放什么代码。 你们能帮帮我吗? 谢谢! 最佳答案 在您看来,请调用 setNeeds
我正在开发 iPhone 应用程序并希望使用: CFStreamCreatePairWithSocketToHost(NULL, url, port, &serverReadStream, &serv
看到我已经创建了一个用于登录用户的脚本。而且我还添加了设置选项卡,以便用户可以编辑他们的设置!但是当我尝试它时,mysql 表中的数据发生了变化,但配置文件中显示的用户名和用户电子邮件保持不变!当我注
好的。这就是它的样子。 当我启动应用程序时,我从服务器收到的第一件事是数据: {name: "test", type: "checkbox" checked: true, } 这使得其中一个复选框
我是一名优秀的程序员,十分优秀!