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 шт):
- следует указать путь к файлу
- чтобы получить разрешения начиная с API 23 у пользователя следует получить разрешение явным образом запустив intent
Settings.ACTION_MANAGE_WRITE_SETTINGSи проверяя перед каждым открытием файла, есть ли это разрешение вызываяSettings.System.canWrite().
Стоит передавать полную пути до файлов, их можно получить с помощью методов 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
);
}
...