NDK c++ не создается файл при fopen

Для приложения на андроид хочу сохранять данные которые исполльзуется в c++ в бинарный файл, но не получается открыть/создать файл

void SaveToFile(std::map<int, Task *>* Tasks) {

    FILE* file = fopen("hello.txt", "w+b");
    if (file == NULL) {
        return;
    }
    SaveLevelTasks(file, Tasks);

    fclose(file);

}

в файл манифеста добавил на всякий случай все где есть слово STORAGE

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

и дал все разрешения в настройках телефона

Что я сделал не так или про что забыл/незнал?


Ответы (2 шт):

Автор решения: user7860670
  1. следует указать путь к файлу
  2. чтобы получить разрешения начиная с API 23 у пользователя следует получить разрешение явным образом запустив intent Settings.ACTION_MANAGE_WRITE_SETTINGS и проверяя перед каждым открытием файла, есть ли это разрешение вызывая Settings.System.canWrite().
→ Ссылка
Автор решения: Roinam

Стоит передавать полную пути до файлов, их можно получить с помощью методов java "getFilesDir().getPath()" - для дирректории фалов приложения, "Environment.getExternalStorageDirectory().getPath()" - для директории файлов полльзователя. И уже от этих путей создавать файлы где необходимо.

И так же может быть необходим доступ для записи фалов. Я добавил запрос разрешений при начале работы с файлами:

public class ListActivity extends AppCompatActivity {

    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

...

        Button editBtnLA = findViewById(R.id.editBtnLA);
        editBtnLA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int permission = ActivityCompat.checkSelfPermission(ListActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

                if (permission != PackageManager.PERMISSION_GRANTED) {
                    // We don't have permission so prompt the user
                    ActivityCompat.requestPermissions(
                            ListActivity.this,
                            PERMISSIONS_STORAGE,
                            REQUEST_EXTERNAL_STORAGE
                    );
                }
...
→ Ссылка