Создать файл в том же месте, что и выбранный пользователем UriAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Создать файл в том же месте, что и выбранный пользователем Uri

Сообщение Anonymous »

Как создать файл в том же месте, что и Uri, полученный в результате выбора пользователя (но с другим расширением), при этом выбранный файл не всегда может находиться в одной и той же папке на устройстве (может быть в «Документах», «Загрузках» и т. д.).
В частности, цель:
— использовать выбирает MyFolder/Test.jpg (в этом примере MyFolder находится в папке «Документы» устройства).
/>- Приложение загружает и анализирует изображение.
- Приложение сохраняет результаты как MyFolder/Test.dat (проблема заключается в создании этого файла).
Исходные изображения будут расположены в одной из папок среды (Environment.DIRECTORY_DOCUMENTS, Environment.DIRECTORY_DOWNLOADS, Environment.DIRECTORY_PICTURES и т. д.), но я не узнаю, в какой, пока пользователь выбирает файл, и я не знаю, как надежно извлечь эту информацию из выбранного URI. Многопоточность/обработка ошибок опущены для ясности.
//Load image routine
public void onLoadImage ()
{
mFileLoader.launch(new String[]{"image/jpeg"});
}

//User has selected image (location contained in uri)
ActivityResultLauncher mFileLoader =
registerForActivityResult(
new ActivityResultContracts.OpenDocument(),
uri ->
{
// Load image from file using uri (works)
// Perform processing on loaded image
// App has analyzed image and attempting to create results file

File dstFile;

// Convert to String
// srcString = content://com.android.externalstorage.documents/document/primary%3ADocuments%2FMyFolder%2FTest.jpg
String srcString = uri.toString();

//Change Extension
// dstString = content://com.android.externalstorage.documents/document/primary%3ADocuments%2FMyFolder%2FTest.dat
String dstString = srcString.replace(".jpg",".dat");

//Attempt 1: Create Uri from string and use content resolver
// Fails: java.lang.SecurityException
Uri dstUri = Uri.parse(dstString);
OutputStream os = getContentResolver().openOutputStream (dstUri);
if (os != null) os.close ();

//Attempt 2: Hard code dst location
//Works, but location is hard coded, not dependent on user selected file or location
dstString = "/storage/emulated/0/Documents/MyFolder/Test.dat";
dstFile = new File (dstString);
dstFile.createNewFile();

//Attempt 3: Assumes file is in Documents folder
// Works, but assumes file came from Documents folder
File dstFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
dstFile = new File(dstFolder.getPath(), "MyFolder/Test.dat");
dstFile.createNewFile();
});


Подробнее здесь: https://stackoverflow.com/questions/798 ... lected-uri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»