Почему после закрытия приложения доступ к фреймворкам для хранения в Android отменен? [дублировать]Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Почему после закрытия приложения доступ к фреймворкам для хранения в Android отменен? [дублировать]

Сообщение Anonymous »

Я запрограммировал приложение для загрузки статуса WhatsApp, в котором я написал функцию, которая получает доступ к папке .Statuses от пользователя через SAF с использованием action_open_document_tree :

Код: Выделить всё

    private fun requestPermission() {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
val uri = Uri.parse(Files.URI) // Files.URI is a constant whose value is "content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fmedia/document/primary%3AAndroid%2Fmedia%2Fcom.whatsapp%2FWhatsApp%2FMedia%2F.Statuses".
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri)
startForResult.launch(intent) // The codes related to startForResult will follow.
}
в обратном обращении , если папка, выбранная пользователем >

Код: Выделить всё

    private val startForResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult

val uri = result.data?.data ?: return@registerForActivityResult
val documentFile = DocumentFile.fromTreeUri(requireContext(), uri) // This code is in a fragment, so I used requireContext().

if (documentFile?.uri?.path?.contains(Files.STATUSES_DIRECTORY) == true) { // Files.STATUSES_DIRECTORY is a constant whose value is "Android/media/com.whatsapp/WhatsApp/Media/.Statuses".
App.editor.putString(SharedPreferences.ACCESS_FOLDER, uri.toString()).apply()

binding.permissionDenied.visibility = View.GONE
binding.recyclerView.visibility = View.VISIBLE

CoroutineScope(Dispatchers.Default).launch { getStatuses() }
} else {
binding.recyclerView.visibility = View.GONE
binding.permissionDenied.visibility = View.VISIBLE
Toast.makeText(
requireContext(),
getString(R.string.selected_folder_is_false),
Toast.LENGTH_LONG
).show()
}

}
in onresume () , если пользователь ранее предоставил доступ к этой папке, приложение продолжает свою деятельность; В противном случае, requestPermission () называется:

Код: Выделить всё

    override fun onResume() {
super.onResume()
val uriString = App.preferences.getString(SharedPreferences.ACCESS_FOLDER, null)
if (uriString != null) {
val uri = Uri.parse(uriString)
val documentFile = DocumentFile.fromTreeUri(requireContext(), uri)
if (documentFile?.canRead() == true) CoroutineScope(Dispatchers.Default).launch { getStatuses() } else getStatuses()
} else getStatuses()
}
< /code>
Приложение работает правильно, но после выхода и повторного въезда оно снова запрашивает доступ. Используя журнал, я обнаружил, что на этом этапе DocumentFile? .Canread () == true 
не правда .
Как я могу предотвратить доступ от доступа быть отозванным и избегать запроса снова?

Подробнее здесь: https://stackoverflow.com/questions/794 ... ng-the-app
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»