Внутреннее или внешнее хранилище для редактируемого файла, специфичного для приложения - PullRequest
0 голосов
/ 01 июня 2018

Я создаю приложение, которое запрашивает специфичный для приложения файл, который я назвал, например, " conf.cfg ".этот файл должен быть прочитан моим приложением, чтобы создать какой-то объект и т. д. ... тело файла выглядит так:

#activation, level, type, regex or array 0, "critic", 0,"\\d{4}\\w\\d{3}" 1, "critic", 1, [word1,word2] 1,"minor", 0,"\\d{2}-\\w{3}-\\d{4}\\s?\\/?\\s?\\d{2}:\\d{2}"

Проведя исследование, я обнаружил, что есть дваТип хранилища в Android:

  1. Внутреннее хранилище:

Внутреннее хранилище лучше всего, когда вы хотите быть уверены, что ни пользователь, ни другие приложения не смогут получить доступ к вашемуфайлы.

Внешние хранилища:

Внешнее хранилище - лучшее место для файлов, которые не требуют ограничений доступа, и для файлов, которыми вы хотите поделиться с другими приложениями или разрешить пользователю доступс компьютером.

Поскольку я хочу, чтобы пользователь мог редактировать / загружать / загружать / ИСПОЛЬЗОВАТЬ этот файл, внешнее хранилище выглядит какхороший выбор.Однако на Developper Android они сказали:

Внимание: внешнее хранилище может стать недоступным, если пользователь извлекает SD-карту или подключает устройство к компьютеру.И файлы все еще видны пользователю и другим приложениям, которые имеют разрешение READ_EXTERNAL_STORAGE.Поэтому, если функциональность вашего приложения зависит от этих файлов или вам необходимо полностью ограничить доступ, вам следует вместо этого записать свои файлы во внутреннее хранилище.

Внимание: файлы на внешнем хранилище не всегда доступны, поскольку пользователи могут смонтироватьвнешнее хранилище для компьютера для использования в качестве запоминающего устройства.Поэтому, если вам нужно хранить файлы, которые важны для функциональности вашего приложения, вы должны вместо этого хранить их во внутренней памяти.

Поскольку этот файл должен быть всегда доступным и является критически важно для функциональности моего приложения Итак ... Внутреннее хранилище кажется лучше.Но мне нужно, чтобы пользователь увидел и смог использовать файл.И вот я застрял.

У кого-нибудь есть идеи, где и как поместить / создать этот файл?

РЕДАКТИРОВАТЬ: следующий ответ @greenapps

Вот кусок кода, который я написал.Я использую команду getExternalFilesDir(null) для записи и сохранения моего файла

    String folderName = "Innovation";
    String confFileName = "conf.txt";
    String commentSymbol = "#";
    String commentLine = commentSymbol + " activation, level, type , regex or array";

    File storage = getExternalFilesDir(null);
    File folder = new File(storage, folderName);
    File conf = new File(folder, confFileName);

    Log.d(TAG, "Folder action!");
    if (!folder.exists()) {
        if (folder.mkdirs()) {
            Log.d(TAG, "Created : " + folder.getAbsolutePath());
        } else {
            Log.e(TAG, "folder not created!");
        }
    }

    Log.d(TAG, "File action!");
    if (!conf.exists()) {
        try {
            Log.d(TAG, "opening...");
            FileOutputStream fos = new FileOutputStream(conf);
            fos.write(commentLine.getBytes());
            fos.close();
            Log.d(TAG, "Created : " + conf.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (conf.exists()) {
        Log.d(TAG, "File exist at : " + conf.getAbsolutePath());
    }

файл создан, как показано в последнем журнале

Создано: / storage / emulated / 0/Android/data/com.aralex.innovation/files/Innovation/conf.txt

Но когда я ищу файл с помощью собственного приложения для просмотра файлов телефона, я не могу его найти.Я могу перейти в папку с файлами, но папка «Инновация /» скрыта.

Это проблема, потому что я хочу, чтобы файл был виден.

Телефон: Samsung s7, s7edge, s9 +

Файл по умолчаниюЗначок Проводника

Открыт Проводник по умолчанию

Ответы [ 2 ]

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

Ну, я наконец-то нашел ответ сам.

В этом сообщении Android создает папки во внутренней памяти @prodev указывает, что Environment.getExternalStorageDirectory() - хорошее место, потому что файл будет доступен и:

обратите внимание, что ExternalStorage в Environment.getExternalStorageDirectory () не обязательно ссылается на sdcard, он возвращает основную память телефона

, ему требуются разрешения (только для версии сборки> = M):

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

Итак, вот код для решения моей проблемы (он запрашивает разрешение во время выполнения):

private ArrayList<Rule> ruleList; 

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    [...]

    // Check for the storage permission before accessing the camera.  If the
    // permission is not granted yet, request permission.
    if (hasPermissions(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
            || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        ruleList = createRules();
    } else {
        requestStoragePermission();
    }
}

private boolean hasPermissions(Context context, String... permissions) {
    if (context != null && permissions != null) {
        for (String permission : permissions) {
            Log.d(TAG, "Checking permission : " + permission);
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                Log.w(TAG, "not granted : " + permission);
                return false;
            } else {
                Log.d(TAG, "granted : " + permission);
            }
        }
    }
    return true;
}

/**
 * Handles the requesting of the storage permission.  This includes
 * showing a "Snackbar" errorMessage of why the permission is needed then
 * sending the request.
 */
private void requestStoragePermission() {
    Log.w(TAG, "Storage permission is not granted. Requesting permission");

    final String[] permissions = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};

    if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
        ActivityCompat.requestPermissions(this, permissions, RC_HANDLE_EXTERNAL_PERM);
        return;
    }

    final Activity thisActivity = this;

    View.OnClickListener listener = view -> ActivityCompat.requestPermissions(thisActivity, permissions,
            RC_HANDLE_EXTERNAL_PERM);

    Snackbar.make(findViewById(android.R.id.content), R.string.permission_storage_rationale,
            Snackbar.LENGTH_INDEFINITE)
            .setAction(R.string.ok, listener)
            .show();
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {
    if (requestCode != RC_HANDLE_EXTERNAL_PERM) {
        Log.d(TAG, "Got unexpected permission result: " + requestCode);
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        return;
    }

    if (grantResults.length != 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
            && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
        Log.d(TAG, "Storage permission granted");
        // We have permission
        ruleList = createRules();
        return;
    }

    Log.e(TAG, "Permission not granted: results len = " + grantResults.length +
            " Result code = " + (grantResults.length > 1 ? grantResults[0] + " " + grantResults[1] : grantResults.length > 0 ? grantResults[0] : "(empty)"));

    DialogInterface.OnClickListener listener = (dialog, id) -> finish();

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("Assisting Tool")
            .setMessage(R.string.no_storage_permission)
            .setPositiveButton(R.string.ok, listener)
            .show();
}

private ArrayList<Rule> createRules() {
    Log.d(TAG, "=========================READING FILE======================");

    ArrayList<Rule> ruleList = new ArrayList<>();

    String folderName = "Innovation";
    String confFileName = "conf.txt";
    String commentSymbol = "#";
    String commentLine = commentSymbol + " activation, level, type , regex or array";

    File storage = Environment.getExternalStorageDirectory();
    File folder = new File(storage, folderName);
    File conf = new File(folder, confFileName);

    Log.d(TAG, "Folder action!");
    if (!folder.exists()) {
        if (folder.mkdirs()) {
            Log.d(TAG, "Created : " + folder.getAbsolutePath());
        } else {
            Log.e(TAG, "folder not created!");
        }
    }

    Log.d(TAG, "File action!");
    if (!conf.exists()) {
        try {
            Log.d(TAG, "opening...");
            FileOutputStream fos = new FileOutputStream(conf);
            fos.write(commentLine.getBytes());
            fos.close();
            Log.d(TAG, "Created : " + conf.getAbsolutePath());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (conf.exists()) {
        Log.d(TAG, "File exist at : " + conf.getAbsolutePath());
    } else {
        Log.e(TAG, "The file doesn't exist...");
    }
}

Теперь он создает файл для приложения

/ storage / emulated / 0 / Innovation / conf.txt

, который доступен пользователю!

0 голосов
/ 01 июня 2018

Так что внешнее хранилище.

Нет внутреннего, так как проводники файлов не имеют доступа к частной внутренней памяти ваших приложений.

Вы можете использовать getExternalFilesDir (null), так как тогда вам не нужны разрешения на чтение и запись

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