getExternalFilesDir () не сохраняет файл на смонтированной карте памяти - PullRequest
0 голосов
/ 04 июля 2018

Я использую устройство Nougut 7.1.1

Когда я запускаю приведенный ниже код, файл сохраняется на устройстве или во внутреннем хранилище «emulated / 0 ...», но я хочу сохранить его на съемной карте памяти.

Я зарегистрировал getExternalStorageState (), и он показывает смонтированный.
Я также пытался использовать Environment.getExternalStorageDirectory (), сохраненный в «emulated / 0 ...», без результата

Я использовал права доступа в файле манифеста, как показано ниже:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Примечание. Однако внутреннее и внешнее хранилище (карта памяти) состоит из папки «Hello World», например:
Android / Data / com.example.myapplication / files / Hello World /

но сохраненный файл (myData2.txt) присутствует только в папке «Hello World» внутреннего хранилища

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.i("tag", Environment.getExternalStorageState().toString());
    Log.i("tag", getExternalFilesDir(null).toString());

    savePrivate();

}

public void savePrivate() {
    String info = "Written";
    File folder = getExternalFilesDir("Hello World");// Folder Name
    File myFile = new File(folder, "myData2.txt");// Filename
    writeData(myFile, info);
}

private void writeData(File myFile, String data) {
    FileOutputStream fileOutputStream = null;
    try {
        fileOutputStream = new FileOutputStream(myFile);
        fileOutputStream.write(data.getBytes());
        Toast.makeText(this, "Done" + myFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (fileOutputStream != null) {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Изменил мой метод savePrivate (), как показано ниже, и он работал как шарм !!
Согласно предложению @CommonsWare, использование getExternalFilesDirs () вернуло доступный массив мест, из которых я мог выбрать конкретное хранилище. В моем случае папка [0] указывала на «emulated / 0 ..», а папка [1] указывала на съемную хранилище (хранилище / 15C8-119Z /...).

    public void savePrivate() {
    String info = "Written";
    File[] folder = getExternalFilesDirs("backup");// Folder Name
    Log.i("tag", String.valueOf(folder[1]).toString());
    File myFile = new File(folder[1], "myData2.txt");// Filename
    writeData(myFile, info);
}
0 голосов
/ 05 июля 2018

Начиная с Android 4.4 (уровень API 19) , чтение или запись файлов в каталоге частного внешнего хранилища вашего приложения, доступ к которому осуществляется с помощью getExternalFilesDir (), не требует прав READ_EXTERNAL_STORAGE или WRITE_EXTERNAL_STORAGE. Поэтому, если ваше приложение поддерживает Android 4.3 (уровень API 18) и ниже, и вы хотите получить доступ только к частному каталогу внешнего хранилища, вы должны объявить, что разрешение запрашивается только в более низких версиях Android, добавив атрибут maxSdkVersion:

<manifest ...>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                     android:maxSdkVersion="18" />
</manifest>

Выбор между несколькими хранилищами

Иногда устройство, которое выделяет раздел внутренней памяти для использования в качестве внешнего хранилища, также предоставляет слот для SD-карты. Это означает, что устройство имеет два разных каталога внешних хранилищ, поэтому вам нужно выбрать, какой из них использовать при записи «личных» файлов во внешнее хранилище.

Начиная с Android 4.4 (уровень API 19), вы можете получить доступ к обоим местоположениям, вызвав getExternalFilesDirs (), который возвращает массив файлов с записями для каждого места хранения. Первая запись в массиве считается основным внешним хранилищем, и вы должны использовать это расположение, если оно не заполнено или недоступно.

Если ваше приложение поддерживает Android 4.3 и ниже, вы должны использовать статический метод библиотеки поддержки ContextCompat.getExternalFilesDirs (). Это всегда возвращает массив файлов, но если устройство работает под управлением Android 4.3 и ниже, то оно содержит только одну запись для основного внешнего хранилища (если есть второе хранилище, вы не можете получить к нему доступ в Android 4.3 и ниже).

Сверьтесь с официальной документацией для подробного описания.

Надеюсь, это поможет.

0 голосов
/ 04 июля 2018

но сохраненный файл (myData2.txt) присутствует только в папке «Hello World» внутреннего хранилища

Хранится в том, что Android SDK обозначает внешнее хранилище . Внешнее хранилище не является съемным хранилищем и не является тем, что Android SDK называет внутренним хранилищем .

Когда я запускаю приведенный ниже код, файл сохраняется на устройстве или во внутреннем хранилище «emulated / 0 ...», но я хочу сохранить его на съемной карте памяти.

Сначала вы передаете недопустимое значение в getExternalFilesDir(). Пожалуйста, следуйте документации и передайте действительное значение (например, Environment.DIRECTORY_MUSIC) или null.

Для записи в съемное хранилище замените getExternalFilesDir() на getExternalFilesDirs() и выберите местоположение из возвращенного массива местоположений. Если в этом массиве 2+ записи, 1+ из них будет на съемном носителе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...