Как проверить, существует ли известный файл uri в хранилище Android?

Известен файл uri, например

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

Я хочу проверить, может ли этот файл открыться или нет в фоновом режиме, как это сделать?

Ответ 1

Проверьте, существует ли файл пути таким образом:

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" />

Ответ 2

Начните с извлечения имени файла с помощью 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

Приведенные выше ответы не будут работать для всех версий Android (см. " Получение имени файла и пути из URI из mediastore" и " Получение реального пути из URI", новой инфраструктуры доступа к хранилищу Android KitKat), но есть простой способ с использованием DocumentsContract:

DocumentsContract.isDocumentUri(context,myUri)

Ответ 4

Я написал функцию, которая проверяет, существует ли файл по заданному пути. Путь может быть абсолютным путем или путем Ури.

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
}