Как записать на SD-карту в Android 6.0, не спрашивая разрешения во время выполнения?

#java #android

#java #Android

Вопрос:

Я хочу спросить — может ли приложение записывать данные на внешнюю SD-карту в Android 6.0, не запрашивая разрешения времени выполнения? Я знаю, что правильный способ — проверить, предоставил ли пользователь такое разрешение для моего приложения. Я провел небольшое исследование и выяснил, что большинство всех файлообменников в GooglePlay запрашивают эти разрешения. Но ES FileExplorer (https://play.google.com/store/apps/details?id=com.estrongs.android.pop ) — не запрашивает таких разрешений и может выполнять любые манипуляции с SD-картой! Кто-нибудь знает, как они этого добились? Спасибо за помощь!

Это мой код gradle

 android {
buildToolsVersion '23.0.2'
compileSdkVersion 22
sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }

    instrumentTest.setRoot('tests')

    dexOptions {
        javaMaxHeapSize "4g"
    }

    lintOptions {
      checkReleaseBuilds false
      abortOnError false
  }
}

packagingOptions {
   exclude 'META-INF/LICENSE.txt'
   exclude 'META-INF/license.txt'
   exclude 'META-INF/notice.txt'
   exclude 'META-INF/NOTICE.txt'
}


defaultConfig {
    // Enabling multidex support.
    multiDexEnabled true
}




buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}
  

}

Ответ №1:

Этого можно добиться, установив в файле Gradle вашего проекта значение compileSdkVersion не больше 22.
Важно! Когда вы развертываете версию своего приложения в Google Play Store, которая была скомпилирована для версии больше 22, вы никогда не сможете вернуться к версии ниже 23. Вы даже не можете вернуться к последней стабильной версии, если используется эта версия и версия SDK ниже 23. Тогда вы получите исключение в Google Play Store. Это не позволит.
(Это случилось со мной несколько дней назад, я случайно установил версию больше 22, развернул ее в Google Play, и внезапно у меня было много сбоев, потому что в Android 6.0 не было используемого разрешения, и я не просил об этом, потому что это не было реализовано в коде. Но я также не смог вернуться к предыдущей рабочей версии в Google Play. Поэтому мне пришлось быстро внедрить новую модель разрешений, но я даже не смог ее протестировать, поскольку у меня нет устройств Android 6.0, а эмуляторы — полное дерьмо и медленные. Теперь у меня есть 3 приложения в магазине, где я не знаю, как они ведут себя на Android 6.0 . У меня больше нет сбоев, поэтому я предполагаю, что моя реализация верна)

Комментарии:

1. Большое вам спасибо. Я проверю это решение (но таким образом, мое приложение никогда не будет доступно для использования новых функций из новых SDK?). И в будущем, если я изменю версию sdk на 23 — будет ли мое приложение обновляться в Google Play?

2. Все еще существует одна проблема с созданием приложения с api 22 или ниже. По умолчанию у него будут все разрешения, разрешенные для Android M и выше, которые присутствуют в AndroidManifest.xml досье. Вам не нужно делать это во время выполнения. Но если пользователь вручную удалит разрешения из настройки, ваше приложение начнет сбой.

3. Если вы используете версию компиляции 22, функциональность вашего приложения не может использовать функции Android 6.0 . Вот почему ваша попытка подавить новую модель разрешений будет работать даже на устройствах Android 6.0 , если вы не компилируете с более высокой версией. Ваше приложение обязательно будет обновлено в магазине, если вы скомпилируете версию больше 22, но вы никогда не сможете вернуться к предыдущей версии. На мой взгляд, это очень плохой дизайн от Google, поэтому я бы посоветовал протестировать вашу версию> 22 очень хорошо, если вы решите использовать более новую версию один раз в будущем.

4. Пытался изменить уровень api на 22, но все еще не может записывать файлы на SD-карту в версии 6.0

5. Возможно, вы установили только целевую версию, а не скомпилированную версию? Возможно, вам придется полностью удалить и снова установить приложение на свое тестовое устройство, чтобы использовать чистую установку со старой моделью.