文件uri是已知的,例如
`file:///mnt/sdcard/Download/AppSearch_2213333_60.apk`
我想检查这个文件是否可以在后台打开,怎么办?
答案 0 :(得分:24)
检查路径文件是否存在如下:
File file = new File("/mnt/sdcard/Download/AppSearch_2213333_60.apk" );
if (file.exists()) {
//Do something
}
请注意删除“file://”之类的内容,否则请使用:
File file = new File(URI.create("file:///mnt/sdcard/Download/AppSearch_2213333_60.apk").getPath());
if (file.exists()) {
//Do something
}
此外,您必须在AndroidManifest.xml中为您的应用设置适当的权限才能访问SD卡:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
答案 1 :(得分:3)
DocumentFile sourceFile = DocumentFile.fromSingleUri(context, uri);
boolean bool = sourceFile.exists();
答案 2 :(得分:1)
首先使用URI
提取文件名:
final String path = URI.create("file:///mnt/sdcard/Download/AppSearch_2213333_60.apk")
.getPath(); // returns the path segment of this URI, ie the file path
final File file = new File(path).getCanonicalFile();
// check if file.exists(); try and check if .canRead(), etc
建议在这里使用URI
,因为它会在URI中解码所有可能的空格/字符非法,但在文件名中是合法的。
答案 3 :(得分:1)
以上答案不适用于所有Android版本(请参阅Get filename and path from URI from mediastore和Get real path from URI, Android KitKat new storage access framework),但使用DocumentsContract有一种简单的方法:
DocumentsContract.isDocumentUri(context,myUri)
答案 4 :(得分:0)
我写了一个函数来检查给定路径上是否存在文件。该路径可能是我的绝对路径,也可能是Uri路径。
fun localFileExist(localPathOrUri: String?, context:Context): Boolean {
if (localPathOrUri.isNullOrEmpty()) {
return false
}
var exists = File(localPathOrUri).exists()
if (exists) {
return exists
}
val cR = context.getContentResolver()
val uri = Uri.parse(localPathOrUri)
try {
val inputStream = cR.openInputStream(uri)
if (inputStream != null) {
inputStream.close()
return true
}
} catch (e: java.lang.Exception) {
//file not exists
}
return exists
}
答案 5 :(得分:0)
我可能在这里参加聚会有点晚了,但是我一直在寻找解决类似问题的方法,最终能够为所有可能的极端情况找到解决方案。解决方法如下:
boolean bool = false;
if(null != uri) {
try {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
inputStream.close();
bool = true;
} catch (Exception e) {
Log.w(MY_TAG, "File corresponding to the uri does not exist " + uri.toString());
}
}
如果存在与URI相对应的文件,则将有一个输入流对象可以使用,否则将引发异常。
如果文件确实存在,请不要忘记关闭输入流。
注意:
DocumentFile sourceFile = DocumentFile.fromSingleUri(context, uri);
boolean bool = sourceFile.exists();
可以处理大多数边缘情况,但是我发现如果以编程方式创建文件并将其存储在某个文件夹中,则用户可以访问该文件夹并手动删除该文件(在应用程序运行时),DocumentFile.fromSingleUri错误地指出该文件存在。