15

文件uri是已知的,比如

`file:///mnt/sdcard/Download/AppSearch_2213333_60.apk`

我想检查这个文件是否可以在后台打开,怎么办?

4

6 回答 6

28

检查路径的文件是否存在,如下所示:

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 中为您的应用设置适当的权限才能访问 sdcard:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2013-07-03T07:58:02.813 回答
8
DocumentFile sourceFile = DocumentFile.fromSingleUri(context, uri);
boolean bool = sourceFile.exists();
于 2020-06-20T18:21:40.737 回答
5

我在这里聚会可能有点晚了,但我一直在寻找类似问题的解决方案,最终能够为所有可能的边缘情况找到解决方案。解决方案如下:

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 错误地说该文件存在。

于 2020-12-17T17:12:12.737 回答
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 中非法的空格/字符,但在文件名中是合法的。

于 2013-07-03T07:54:35.520 回答
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
}
于 2019-06-15T16:05:15.940 回答
0

以上答案不适用于所有版本的 Android(请参阅Get filename and path from URI from mediastoreGet real path from URI, Android KitKat new storage access framework),但有一种使用 DocumentsContract 的简单方法:

DocumentsContract.isDocumentUri(context,myUri)
于 2018-06-07T16:44:34.850 回答