Наше приложение имеет большой объем кода C ++, который создает свой собственный файл журнала в виде простого файла .txt. Это кольцевой буфер, поэтому он ограничен указанным размером. Он также помещается в любой каталог, который мы указываем.
Проблема в том, где разместить файл, чтобы к нему можно было получить доступ с помощью ADB или аналогичного инструмента (без рутирования). Если бы мы не заботились о публично доступной части, кажется, это было бы логичным местом для поиска файла:
packageManager.getApplicationInfo(applicationContext.getPackageName().dataDir
Но так как мы хотим иметь возможность извлечь файл из телефона клиента для посмертной отладки, я попытался разместить его здесь:
"/mnt/sdcard/Android/data"
Это проблематично по нескольким причинам, но я не уверен, что все они правдивы. (1) Это жестко закодировано; (2) Не все устройства Android имеют внешнее хранилище, хотя я думал, что они по-прежнему отображают его на внутреннее хранилище? (3) Местоположение не зависит от приложения, поэтому оно не будет удалено вместе с приложением. И (4) Требуется разрешение во время выполнения для EXTERNAL_STORAGE.
Я считаю, 1-3 можно решить с помощью чего-то вроде:
android.content.Context.getExternalFilesDir()
Или есть лучший выбор?
Но я не верю, что это обойдется №4, что вызывает сожаление, поскольку я предпочел бы не «пугать» пользователей большим количеством запросов на разрешение.
Какой лучший способ справиться с этим?
Убедитесь, что у вас есть права на чтение и запись Внешнего SD с использованием этого кода в файле манифеста:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
И тогда эта строка даст вам нужный путь:
String directory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + getContext().getPackageName();
/storage/emulated/0/Android/data/com.exemple.yourapp/
Других решений пока нет …