Как разрешить пользователям доступ к внутреннему каталогу хранения моего приложения?
мое приложение хранит файлы во внутреннем каталоге хранения (/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 предлагает два способа сохранения файлов в файловой системе:
- использование внутренней памяти
- использование внешнего хранилища
на Внутренний Накопитель всегда доступен и доступен только для вашего приложения, ни одно другое приложение в системе не может получить доступ к файлам, сохраненным в приложении этот раздел.
теперь, я думаю, что вам нужно-это Внешний Накопитель потому что он" читаемый в мире " и может быть доступен любому и любым приложениям. Недостатком является то, что он может быть недоступен, так как пользователь может установить его на 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