让我分享到目前为止我所学到的,并提出我的问题。如果希望获取文件夹的Uri并对其进行操作,则应使用intent
和action_open_document_tree
获取访问文件夹的Uri,并为该Uri设置W/R权限。
授予onActivityResult的持久权限:
final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
// Check for the freshest data.
getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
如果选择设备的主文件夹:
Uri treeUri = data.getData();
treeUri.toString()
File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "");
new File(treeUri.toString()).getAbsolutePath();
如果使用DocumentFile类获取主文件夹的路径
DocumentFile saveDir = null;
saveDir = DocumentFile.fromFile(Environment.getExternalStorageDirectory());
String uriString = saveDir.getUri().toString();
返回:file:///storage/emulated/0
我的第一个问题是如何使用DocumentFile类获得包含内容的Uri。
@TargetApi(19)
protected DocumentFile getSaveDirMainMemory() {
DocumentFile saveDir = null;
saveDir = DocumentFile.fromFile(Environment.getExternalStorageDirectory());
// saveDir =
// DocumentFile.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM));
// saveDir =
// DocumentFile.fromFile(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
DocumentFile newDir = null;
/*
* Check or create Main Folder
*/
// Check if main folder exist
newDir = saveDir.findFile(DIR_MAIN);
// Folder does not exist, create it
if (newDir == null || !newDir.exists()) {
newDir = saveDir.createDirectory(DIR_MAIN);
}
/*
* Check or create Sub-Folder
*/
DocumentFile newSubDir = null;
// Check if sub-folder exist
newSubDir = newDir.findFile(DIR_SUB);
// Folder does not exist, create it
if (newSubDir == null || !newSubDir.exists()) {
newSubDir = newDir.createDirectory(DIR_SUB);
}
if (newSubDir != null && newSubDir.exists()) {
return newSubDir;
} else if (newDir != null && newDir.exists()) {
return newDir;
} else {
return saveDir;
}
}
DocumentFile imageToDeletePath = DocumentFile.fromFile(new File(lastSavedImagePath));
DocumentFile imageToDelete = imageToDeletePath.findFile(lastSavedImageName);
@TargetApi(19)
protected DocumentFile getSaveDirNew(String uriString) {
DocumentFile saveDir = null;
boolean canWrite = isUriWritePermission(uriString);
if (canWrite) {
try {
saveDir = DocumentFile.fromTreeUri(MainActivity.this, Uri.parse(uriString));
} catch (Exception e) {
saveDir = null;
}
}
return saveDir;
}
检查字符串中的Uri是否具有写权限,如果不获取或移除可持久化的权限,则Uri可能没有写权限。
private boolean isUriWritePermission(String uriString) {
boolean canWrite = false;
List<UriPermission> perms = getContentResolver().getPersistedUriPermissions();
for (UriPermission p : perms) {
if (p.getUri().toString().equals(uriString) && p.isWritePermission()) {
Toast.makeText(this, "canWrite() can write URI:: " + p.getUri().toString(), Toast.LENGTH_LONG).show();
canWrite = true;
break;
}
}
return canWrite;
}
使用有效uri保存图像并使用
DocumentFile imageToDeletePath = DocumentFile.fromTreeUri(this, Uri.parse(lastSavedImagePath));
DocumentFile imageToDelete = imageToDeletePath.findFile(lastSavedImageName);
uri.fromfile()
和documentfile.fromtreeuri()
从两个不同的世界创建URI。
虽然它们目前看起来非常相似,但这只是巧合,可能会随着未来任何Android版本的发布而改变。
没有“非黑客”的方式从一个转换到另一个。如果您想要一个肮脏的解决方案,可以进行反射(查看documentfile.fromtreeuri
的源代码,并可能在较新的Android版本上使用storage
类。
在Android4.4(KitKat)的新图库访问之前,我通过以下方法在SD卡上获得了我的真实路径: 现在,intent.action_get_content返回不同的数据: 我怎样才能获得SD卡上的真实路径?
(编辑)由@blackapps回答:将“w”改为“wt”。而且奏效了! //-----------------------------------// 我已经尝试使用直接路径,它工作正确。我认为原因是它创建了一个新的文件来替换原来的文件。然而,我只是不想使用直接路径。 我已经尝试了PrintWriter清除内容,但它也需要直接路径创建文件,然后放入PrintWriter。 我已经尝试过使用Outp
问题内容: 我的Android应用程序想要在Google云端硬盘中创建一个文件夹,并从设备上的云端硬盘应用程序获取uri。 它发送一个意图,您可以看到以下代码: 然后获取返回的数据,您可以看到以下代码: 我使用了在互联网上发现的一种模仿类型,它似乎是一种标准类型。使用“ application / vnd.google- apps.folder”时会发出相同的错误。目标是要有一个文档树,但是在lo
我想从URI中获得完整的文件路径。URI不是图像,而是音乐文件,但如果我像纵隔解决方案那样做,如果应用程序用户选择eg Astro作为浏览器,而不是音乐播放器,它就不会工作。我怎么解决这个?
我尝试了堆栈溢出的大部分答案,它们给出了我的.java文件不存在的路径。如何获取我的文件实际存在或存在的路径? 假设我的java文件名为,其位置为。所以我想打印路径。 我将文件部署到某个服务器,然后在那里运行它,无论我想打印路径,我都会得到这样的位置,其中没有文件。
因此,我使用Reformation将图像上传到我们的服务器,并使用gallery chooser选择图像。我试图获取图像的路径,因为uri。getPath()返回未找到的文件作为异常。我几乎看过关于这个主题的每一篇stackoverflow文章,但仍然没有答案。下面的代码与我在网上看到的所有代码都类似,它总是返回null,我不知道为什么。请帮忙