【发布时间】:2017-07-23 10:01:05
【问题描述】:
我正在循环一个返回 DocumentFile 100 次甚至更多次的方法。很多时候,该方法在已经循环了大约 35 次时返回 null。
这是正在循环的方法。
public static DocumentFile documentfile(final File file ) {
for (UriPermission permissionUri :con.getContentResolver().getPersistedUriPermissions()) {
DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permissionUri.getUri());
String[] parts = (file.getPath()).split("\\/");
for (int i = 3; i < parts.length; i++) {
if (rootDocFile != null)
{
rootDocFile = rootDocFile.findFile(parts[i]);
}
else {
rootDocFile = DocumentFile.fromTreeUri(con,permissionUri.getUri() );
rootDocFile = rootDocFile.findFile(parts[i]);
}
}
return rootDocFile;
}
return null;
}
这就是我循环方法的方式
for(int i=0;i<size;i++)
{
documentfile(file).createFile(mime, name)
}
以上所有代码都在异步任务中执行。
任何帮助都会非常感激。
编辑:尝试使用更新的代码,但仍然收到相同的错误。
更新代码
public static DocumentFile DocumentFile(final File file)
{
DocumentFile rootDocFile = DocumentFile.fromTreeUri(con, permission().getUri());
String[] parts = (file.getPath()).split("\\/");
for (int i = 3; i < parts.length; i++)
{
rootDocFile = rootDocFile.findFile(parts[i]);
}
return rootDocFile;
}
public static UriPermission permission()
{
for (UriPermission permissionUri : con.getContentResolver().getPersistedUriPermissions())
{
final File uri_path = new File(FileUtil.getFullPathFromTreeUri(permissionUri.getUri(), con));
if (uri_path.getName().toLowerCase().equals(new File("SD_CARD_PATH").getName().toLowerCase()))
{
return permissionUri;
}
}
return null;
}
这就是我检查授予的权限是否适用于 SD 卡的方式
public static boolean wrong_directory_selected(Uri uri, Context con)
{
final File uri_path=new File(FileUtil.getFullPathFromTreeUri(uri,con));
if(uri_path.getName().toLowerCase().equals(new File("SD CARD PATH").getName().toLowerCase()))
{
return false;
}
return true;
}
【问题讨论】:
-
请正确缩进您的代码。就目前而言,阅读它并不容易。谢谢。
-
当“con.getContentResolver().getPersistedUriPermissions()”没有任何“UriPermission”时,方法“documentfile”返回null。您必须关注“con.getContentResolver().getPersistedUriPermissions()”并验证何时没有 UriPermission。
-
@j.e.gr 如果我将方法循环例如 100 次,那么代码可以正常工作 35 到 40 次。表示已经给了权限,我也在检查是否给了权限。
-
当您清楚地退出列表中的第一个值时,为什么要在 for 循环中调用
getPersistedUriPermissions()?在我看来,该调用返回的列表有时是空的。您可能在其他地方打电话给releasePersistableUriPermission()吗?从代码的结构方式来看,fromTreeUri()也有可能返回 null。如果我们对您想要实现的目标有更多了解,我们可能会提供更好的实现方式。您还可以向 logcat 添加消息或对其进行调试,以查看该方法返回 null 的原因。 -
@Dave 我确定该列表不为空,因为我正在使用共享首选项检查用户是否已授予权限。不,我不会在任何地方打电话给
releasePersistableUriPermission()。我正在尝试将一些文件复制到 SD 卡。所以首先我在 SD 卡中创建一个文件,然后传输。fromTreeUri()是否有任何理由返回 null。我不太喜欢编程。任何帮助都会非常感激。
标签: java android loops nullpointerexception null