Как разрешить пользователям доступ к внутреннему каталогу хранения моего приложения?

мое приложение хранит файлы во внутреннем каталоге хранения (/Android / data / com.mycompany.myapp / files, как возвращено getFilesDir ()), и я хотел бы разрешить пользователям получать доступ к этим файлам непосредственно из приложения для управления файлами на своем мобильном устройстве или настольном приложении для передачи файлов Android.

на варианты хранения руководство разработчика говорит:

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

"по умолчанию" означает, что я могу изменить разрешения по умолчанию, чтобы разрешить пользователям доступ к этим файлам, но я не могу найти никакой документации о том, как это сделать. В настоящее время com.mycompany.каталог myapp скрыт, когда я просматриваю каталог/Android / data с помощью приложения для управления файлами.

в настоящее время я сохраняю данные файла следующим образом:

String fileName = "myfile.jpg";
String filePath = getFilesDir() + File.separator + fileName;
FileOutputStream fileStream = new FileOutputStream(filePath);
fileData.writeTo(fileStream); // fileData is a ByteArrayOutputStream
fileStream.close();

Я попытался установить разрешения человека файлы для чтения в мире, но это не сделало каталог видимым:

FileOutputStream fileStream = this.app.openFileOutput(fileName, Context.MODE_WORLD_READABLE);

Я также проверил документацию для файла AndroidManifest и ничего там не увидел. Кто-нибудь знает как я могу это сделать?

2 ответов


Я внимательно посмотрел на результат getFilesDir() vs getExternalFilesDir() и обнаружил, что getFilesDir() возвращает /data/data/[packagename]/files пока getExternalFilesDir() возвращает /Android/data/[packagename]/files. Я думал, что файлы приложений, которые я просматривал в /Android/data внутренние каталоги для хранения, но теперь я вижу, что это на самом деле внешние каталоги хранения.

если внутренние каталоги хранения действительно никогда не доступны для обычных пользователей, я хочу, чтобы в документации говорилось, что вместо того, чтобы говорить, что они недоступны "по умолчанию." Ко мне по крайней мере, выражение "по умолчанию" подразумевает, что поведение по умолчанию может быть изменено.

в любом случае, я проверил и подтвердил, что если я удалю свое приложение, файлы, сохраненные в getExternalFilesDir() автоматически удаляются. Таким образом, это отвечает моей потребности в месте хранения, которое явно связано с приложением (использует имя каталога приложения и удаляется с приложением), но доступно пользователям для случайного ручного управления файлами.

вот сравнение, которое может быть полезно кому-то еще читая это:

  • getFilesDir() - создает каталог, специфичный для приложения; скрыт от пользователей; удален с помощью приложения
  • getExternalFilesDir() - создает каталог, специфичный для приложения; доступен для пользователей; удален с помощью приложения
  • getExternalStoragePublicDirectory() - использует общий каталог (например, музыка); доступен для пользователей; остается, когда приложение удаляется

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

  1. использование внутренней памяти
  2. использование внешнего хранилища

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

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

вы не должны использовать ни MODE_WORLD_WRITEABLE, ни MODE_WORLD_READABLE согласно документам, потому что это очень опасно. Кроме того, эти константы устарели с уровня API 17

рекомендация

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

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

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

public enum StorageState{
  NOT_AVAILABLE, WRITEABLE, READ_ONLY
}

public StorageState getExternalStorageState() {
    StorageState result = StorageState.NOT_AVAILABLE;
    String state = Environment.getExternalStorageState();

    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return StorageState.WRITEABLE;
    }
    else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return StorageState.READ_ONLY;
    }

    return result;
}

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